zoukankan      html  css  js  c++  java
  • MySql基础笔记(一)Mysql快速入门

    Mysql快速入门

    一)基本概念

    1)表

    行被称为记录,是组织数据的单位。列被称为字段,每一列表示记录的一个属性。

    2)主键

    主键用于唯一的标识表中的每一条记录。可以定义表中的一列或者多列为主键

    但每张表中主键只能有一个,主键列上不能有两行相同的值,也不能为空值。

    二)数据库基本操作

    1)从命令行登陆mysql: 

    mysql -h hostName -u loginName -p

    2)查看当前所有数据库:

    shwo databases;

    3)创建数据库:

    create database tang charset utf8;

    4)选择数据库:

    use tang;

    5)查看数据库定义:

    show create database tang;

    6)删除数据库:

    drop database tang;

    7)查看数据库支持的引擎类型:

    show engins;

    三)数据库表基本操作

    1.创建与查看

    1)查看现有表:

    show tables;

    2)创建表:

    create table user (
        id int primary key auto_increment,
        name varchar(88)
    );

    使用主键约束:

    字段名 数据类型 PRIMARY KEY [默认值]

    也可在定义完所有列后指定:

    PRIMARY KEY[字段名]

    多字段组成联合主键:

    create table user(
        -> id varchar(88),
        -> name varchar(88),
        -> age int,
        -> primary key (id,name)
        -> );

    3)外键约束:

    一个表可以有一个或者多个外键,一个表的外键可以为空值,若不为空值

    则每一个外键必须等于另个一表中主键的某个值。外键不可以是本表的主键。

    外键约束不能跨引起使用。

    主表:主键所在的那个表。

    从表:外键所在的表。

    mysql> create table dept (
        -> dept_id int auto_increment,
        -> dept_name varchar(66),
        -> primary key (dept_id)
        -> );
    mysql> create table person (
        -> id int auto_increment,
        -> name varchar(88),
        -> dept_id int,
        -> primary key (id)
        -> );
    mysql> alter table person add constraint fk_test foreign key (dept_id) references dept (dept_id);

    4)非空约束

    字段名 数据类型 not null

    5)唯一性约束

    语法:

    字段名 数据类型 UNIQUE

    唯一性约束要求该列唯一,允许为空,但只能出现一个空值。唯一约束可以确保一列或者几列不出现重复值。一个表中可以有多个UNIQUE。与主键区别:主键列不允许有空列。

    6)默认约束

    字段名 数据类型 DEFAULT 默认值
    mysql> create table user (
        -> id int primary key default 1,
        -> name varchar(88) unique,
        -> age int
        -> );

    7)设置表的属性值自动增长

    AUTO INCREMENT的初始值为1,一个表中只能有一个字段使用AUTO INCREMENT约束,且该字段必须为主键的一部分。

    字段名 数据类型 AUTO INCREMENT

    8)查看表的数据结构:

    DESC 表名

    2.修改与删除数据库表

    1)修改表名

    alter table user rename new_user;

    2)修改字段的数据类型

    alter table user modify age varchar(22);

    3)修改字段名

    alter table user change age how_Old int;

    4)添加字段

    Alter table 表名 add 新字段名 数据类型 约束条件 [first|after 已存在字段名];

    5)删除字段

    Alter table 表名 drop 字段名

    6)修改字段的排列位置

    Alter table 表名 modify 字段1 数据类型 first|after 字段2;

    7)更改表的存储引擎

    Alter table 表名 engine=更改后的存储引擎名

    8)删除外键约束

    Alter table 表名 drop foreign key 外键约束名

    9)删除表

    mysql> drop table if exists user;

     四)数据类型

    1.整数类型

    tinyint      ----------   1字节

    smallint  ------------  2字节

    mediumint----------  3字节

    int           ------------ 4字节

    bigint       -------------  8字节

    2.小数

    1)浮点数:float和double

    定点类型:DECIMAL

    浮点类型和定点类型都可以用(MN)来表示,其中M为精度表示总共的位数;N为标度

    表示小数的位数。DECIMAL实际是以字符串存放的DECIMAL可能的最大取值范围与DOUBLE一样,

    但是其有效的取值范围由MD的值决定,如果改变M固定D,则其取值范围将随M的变大而变大。

    不论是定点还是浮点类型,如果用户指定的精度超出精度范围,四舍五入。但定点数在四舍五入时会给出警告。

     3.日期与时间

    1)YEAR

    1.4位字符串或者4位数字表示,范围:1901~2155. 输入格式为:’YYYY’ 或者YYYY

    2.2字符串表示YEAR,范围为0099‘00’~‘69’,则相当于插入2000~2069;如果插入‘70’~‘99’,则相当于插入1970~1999。第二种情况下插入的如果是‘0’,则与插入‘00’效果相同,都是表示2000年。  

    3.2数字表示YEAR。这里0值被转换为0000,其他同上。

    2)TIME

    1.’D HH:MM:SS’格式字符串。非严格语法:HH:MM:SS’、‘D HH:MM’‘D HH’或者‘SS’这里D表示日,可以取0~34之间的值。在插入数据库时,D被转换为小时保存,格式为“D*24+HH”。

    2.‘HHMMSS’格式的、没有间隔的字符串或者HHMMSS格式的数值。如‘101112’被理解为‘101112’,但109712是不合法的。

    TIME中使用冒号时被解释为当天的时间,不使用时解释为过去的时间。如‘1112’被解释为0011121112秒。‘1112’则被解释为1112:00。超出范围但合法的值被转换为范围最接近的端点。非法值被转换为000000.

    插入现在时间insert into tmp4 values(CURRENT_TIME),(NOW());

    3)DATE类型

    在给DATE类型的字段赋值时,可以使用字符串类型或者数字类型的数据插入,只要符合其格式。

    1)‘YYYY-MM-DD’或者‘YYYYMMDD’字符串格式表示日期。

    2)‘YY-MM-DD’或者‘YYMMDD’字符串表示,这里的YY表示两位的年值。MySQL使用以下规则解释两位的年值:‘00~69’为‘2000~2069’;‘70~99’为‘1970~1999’。

    3)YY-MM-DD或者YYMMDD数字格式表示日期,与前面类似。

    MySQL允许不严格语法:@ . / 都可以做分隔符号。

    4)DATETIME

    1.‘YYYY-MM-DD HH:MM:SS’或者‘YYYYMMDDHHMMSS

    2.‘YY-MM-DD HH:MM:SS’或者‘YYMMDDHHMMSS

    3.YYYYMMDDHHMMSS或者YYMMDDHHMMSS

    5)TIMESTAMP

    显示格式与DATETIME相同,显示宽度固定在19个字符。UTCCoordinated Universal Time,为世界标准时间)TIMESTAMP值的存储是以UTC格式保存的,存储时对当前时区进行转换,检索时再转换为当前时区,即查询时,根据当前时区不同,显示不同。

     4.字符串类型

    VARCHAR和TEXT类型是变长类型。例如VARCHAR(10)字段能保存最大长度为10个字符的字符串,

    实际的存储需求是字符串的长度L,加上1个字节以记录字符串的长度。尾部空格不删除

    CHAR(M)为固定长度字符串,不够空格补,当检索CHAR的值时,尾部的空格将被删除。

    ENUM类型创建语法:字段名 ENUM(‘值1’,‘值2’,......)ENUM类型的字段在取值时,只能在指定的枚举列表中取,

    而且一次只能取一个值。如果创建的成员中有空格,其尾部的空格将自动被删除。ENUM值在内部用整数表示,

    每个枚举值均有一个索引值,列表值所允许的成员值从1开始编号,MySQL存储的就是这个索引编号。

    SET类型是一个字符串对象,可以有零个或多个值,其值为表创建时规定的一列值。语法格式为:字段 SET(‘值1’,‘值2’,......)

    ENUM不同的是SET类型的字段可从定义的列值中选择多个字符的联合。

     

    五)运算符

    1)算术运算符:+-*/%

     

    2)比较运算符:比较运算符的结果总是10或者NULL

    运算符

    作用

    =

    等于(类型自动换,比NULL时返回NULL

    <=>

    安全等于(可比较NULL

    <>或者!>

    不等于

    <=

     

    >=

     

    <

     

    >

     

    IS NULL

     

    IS NOT NULL

     

    LEAST

    有两个或多个参数时,返回最小值

    GREATEST

    有两个或多个参数时,返回最大值

    BETWEEN AND

    判断一个值是否在两个值之间

    ISNULL

    IS NULL

    IN

    判断一个值是IN列表中的任意一个

    NOT IN

     

    LIKE

    通配符匹配

    REGEXP

    正则表达式匹配

    部分语法格式:3 BETWEEN 2 AND 4,   LEAST(2,4,3)     3 IN(2,4,5)

    expr LIKE 匹配条件  可以使用的通配符为:“%”匹配任何数目字符,甚至包括零字符。“_”只能匹配一个字符。

    1)逻辑运算符

    运算符

    作用

    NOT或者!

    逻辑非

    AND或者&&

    逻辑与

    OR或者||

    逻辑或

    XOR

    逻辑异或

    XOR:当任意一个操作数为NULL时,返回NULL。对于非NULL:两个值一样为0或非0,返回0,不一样返回1

     六)Mysql函数

     七)查询数据

    1.基本查询语句

    语法:

    select 属性列表

    from 表名和视图名

    [where 条件表达式]

    [group by 属性名 [having 条件表达式] ]

    [group by 属性名 [asc desc] ]

    1)单表查询

    1.查询部分字段:“,”

    2.查询全部字段:*

    3.查询经过计算的值:如:

    select sno,sname,year(now())-sage sbir from student;   其中sbir为别名。

    4.清除取值重复的行

    select distinct sdpt from student;

    5.查询表中满足条件的记录:

    select sno,sname ssex from student where sage between 20 and 22;

    6.多重查询条件:

    select*from sc where cno=1 and grade>80;

    7.使用ORDER BY对查询结果进行升序(ASC)或者降序(DESC)的排序,默认为升序。如:

    select sno,sname,sage from student order by sage desc;

    8.统计函数和记录查询:

    函数

    说明

    AVG([DISTINCT]<列名>)

    返回某列平均值

    COUNT([DISTINCT]*)

    返回记录的行数

    COUNG(DISTINCT<列名>)

    返回列中的某个值

    MAX([DISTINCT]<列名>)

    返回某列最大值

    MIN([DISTINCT]<列名>)

    返回某列的最小值

    SUM([DISTINCT]<列名>)

    返回某列和

    2.group by 子句

    使用GROUP BY 将查询结果根据某一列的值进行分组,值相等的为一组。

    1)单字段分组

    select sdpt,count(*) count_num from student group by sdpt;

    该查询结果根据sdpt的值进行分组,sdpt值相同的为一组,分为三组,然后对每一组进行行数统计,得到每一组的人数。

    2)多字段分组

    select ssex,sage,count(*) from student group by ssex,sage;

    3)GROUP BYHAVING子句一起使用

    如果查询结果只想输出满足某种指定条件的组,要使用HAVING子句对组进行筛选,得到符合条件的信息。

    select sno,avg(grade) from sc group by sno having avg(grade)>70;

    4)GROUP BYGROUP_CONCAT()函数一起使用

    GROUP_CONCAT()函数返回一个字符串结果,该结果由分组中的值链接组合而成。

    5)GROUP BY 子句使用ROLLUP

    select sno,max(grade),min(grade) from sc group by sno with rollup; 

    ROLLUPORDER BY子句互斥,即不能同时使用。

     3.limit限制结果数量

    语法如下:

    LIMIT  [offset] rows

    Offset:偏移量 rows:行数   偏移量初始值为0

    select * from student limit 1,3;

    4.链接查询

    涉及两个及其以上的表的查询为链接查询。链接查询要求参加链接的表必须要是有相同意义的字段。

    1)内连查询:

    使用比较运算符进行表间某些列数据的比较操作,并列出这些表中与链接条件相匹配的数据组合成新的纪录。

    mysql> select * from student;

    +----+------+-----+-------+------+---------+

    | id | name | sex | class | math | english |

    +----+------+-----+-------+------+---------+

    | 1 | 张三 | | 班级1 | 90 | 91 |

    | 2 | 李四 | | 班级2 | 88 | 86 |

    | 3 | 王五 | | 班级3 | 92 | 88 |

    | 4 | 赵六 | | 班级1 | 79 | 80 |

    | 5 | 孙七 | | 班级2 | 91 | 96 |

    | 6 | 李八 | | 班级3 | 90 | 89 |

    +----+------+-----+-------+------+---------+

    mysql> select * from teacher;

    +----+--------+-------+

    | id | name | class |

    +----+--------+-------+

    | 1 | 张老师 | 班级1 |

    | 2 | 李老师 | 班级2 |

    | 3 | 王老师 | 班级3 |

    +----+--------+-------+

    mysql> select student.name,student.class,teacher.name from student,teacher where student.class = teacher.class;

    使用内联的查询方式:

    mysql> select student.name,student.class,teacher.name from student inner join teacher on student.class = teacher.class;

    在一个连接查询中,如果涉及到的两个表都是同一个表,这种查询称为字连接查询。

    字连接查询是一种特殊的内链接,他是指相互连接的表在物理上为同一张表,但可以在逻辑上分为两张表

    mysql> select distinct s1.id,s1.name from student as s1,student as s2 where s1.class = s2.class and s2.class = '班级1';

    +----+------+

    | id | name |

    +----+------+

    | 1 | 张三 |

    | 4 | 赵六 |

    +----+------+

     2)外联查询

    1.left join:左表中所有记录和右表中满足链接条件的记录信息。

    2.right join:.....

    select s.sno,sname,cno,grade
    from student s left join sc
    on s.sno=sc.sno;

    5.子查询

    子查询是指将一个查询语句嵌套在另一个查询语句中。

    1)带any,some,all操作符的子查询。

    select * from user where age>=all(select age from user);

    2)in 和not in子查询 

    select * from user where age in (select age from user);

    3)EXISTSNOT EXISTS子查询

    这两个操作符根据子查询是否返回数据来判断真假。

    6.合并查询结果

    SELECT......

    UNION[ALL | DISTINCT]

    SELECT......

    UNION[ALL | DISTINCT]

    SELECT......

    UNION.....

    八)插入、更新与删除数据

    1.插入数据

    1

    INSERT INTO table_name(colum_list)

    VALUES(values_list1),(value_list2)......;

    可以不指定colum_list直接插入,此时顺序必须与创建时相同。

    2)将查询结果插入到表中

    INSERT INTO table_name1 (column_list1)

    SELECT (colum_list2) FROM table_name2 WHERE (condition);

    2.更新数据

    基本语法结构:

    UPDATE table_name

    SET column_name1=value1,colum_name2=value2,......column_namen=valuen

    WHRER (condition);

    3.删除数据

    基本语法格式:

    DELETE FROM table_name WHERE (condition);

    九)索引

    实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。索引大大提高了查询速度,同时却会降低更新表的速度,

    如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。

     1.索引的分类

    1)普通索引:允许在定义索引的列插入重复值和空值。

    2)唯一索引:索引值必须为唯一,但允许有空值。如果是组合索引,则列值组合必须唯一。

    3)单列索引:一个索引只包含单个列,一个表可以有多个单列索引。

    4)组合索引:在表的多个字段组合上创建的索引,只有在查询条件是使用了这些字段的左边字段时,索引才会被使用。

    5)全文索引:允许列种插入重复值和空值,在定义索引的列上支持值的全文查找。全文索引可以在CHARVACHARTEXT类型的列上创建。MySQL中只有MyISAM支持全文索引。

    6)空间索引:对空间数据类型(GEOMETRY,POINT,LINSTRING,POLYGON)创建的索引,其列必须声明为NOT NULL

    2.创建索引

    1)使用alter table语句创建索引:

    ALTER TABLE可用于创建普通索引、UNIQUE索引和PRIMARY KEY索引3种索引格式,table_name是要增加索引的表名,

    column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。索引名index_name可选,缺省时,

    MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以同时创建多个索引。

    ALTER TABLE 表名 ADD 索引类型 (unique,primary key,fulltext,index)[索引名](字段名)
    //普通索引
    alter table table_name add index index_name (column_list) ;
    //唯一索引
    alter table table_name add unique (column_list) ;
    //主键索引
    alter table table_name add primary key (column_list) ;

     2)create index 语句创建索引

    CREATE INDEX index_name ON table_name(username(length)); 
    //只能添加这两种索引;
    CREATE INDEX index_name ON table_name (column_list)
    CREATE UNIQUE INDEX index_name ON table_name (column_list)

    table_name、index_name和column_list具有与ALTER TABLE语句中相同的含义,索引名不可选。

    另外,不能用CREATE INDEX语句创建PRIMARY KEY索引。

     3.删除索引

    drop index index_name on table_name ;
    alter table table_name drop index index_name ;
    alter table table_name drop primary key ;

    十)存储过程和函数

    暂略

    Simple is important!
  • 相关阅读:
    SpringBoot之使用外部的启动类
    CCF——最小差值(2017-12)
    CCF——买菜(2018-09)
    CCF——卖菜(2018-09)
    2792. Grammar Lessons
    2756. Lucky Transformation
    2776. String Task
    2794. Petya and Strings
    2810. Palindromic Times
    14. Football
  • 原文地址:https://www.cnblogs.com/Shadowplay/p/8603077.html
Copyright © 2011-2022 走看看