zoukankan      html  css  js  c++  java
  • MySQL基础整理

    SQL基本操作

    将SQL的基本操作根据操作对象进行分类 ,分为三类: 库操作, 表操作(字段), 数据操作

    一、库操作:对数据库的增删改查

    1、新增数据库

    Create database 数据库名字 [库选项];

    库选项: 用来约束数据库, 分为两个选项

    字符集设定: charset/character set 具体字符集(数据存储的编码格式): 常用字符集: GBK和UTF8

    校对集设定: collate 具体校对集(数据比较的规则)

    2、查看数据库

    (1)查看所有数据库: show databases;

    (2)查看指定部分的数据库: 模糊查询

    Show databases like ‘pattern’;       -- pattern是匹配模式

    (3)查看数据库的创建语句: show create database 数据库名字;

    3、更新数据库

    注意:数据库名字不可以修改.

    数据库的修改仅限库选项: 字符集和校对集(校对集依赖字符集)

    Alter database 数据库名字 [库选项];

    Charset/ character set [=] 字符集

    Collate 校对集

    4、删除数据库

    Drop database 数据库名字;

     

    二、表操作

    1、新增数据表

    Create table [if not exists] 表名(
    字段名字 数据类型,
    字段名字 数据类型    -- 最后一行不需要逗号
    )[表选项];

    If not exists: 如果表名不存在,那么就创建,否则不执行创建代码: 检查功能

    表选项: 控制表的表现

    字符集: charset/character set 具体字符集;  -- 保证表中数据存储的字符集

    校对集: collate 具体校对集;

    存储引擎: engine 具体的存储引擎(innodb和myisam)

    进入数据库环境: use 数据库名字;

    mysql> create table student(
        -> name varchar(10),
        -> gender varchar(10),
        -> number varchar(10),
        -> age int
        -> )charset utf8;

     

    2、查看数据表

    (1)查看所有表: show tables;

    (2)查看部分表: 模糊匹配: show tables like ‘pattern’;

    (3)查看表的创建语句: show create table 表名;

    (4)查看表结构: 查看表中的字段信息

    3、修改数据表

    表本身存在, 还包含字段: 表的修改分为两个部分: 修改表本身和修改字段

    (1)修改表本身:表本身可以修改: 表名和表选项

    • 修改表名: rename table 老表名 to 新表名;

    (2)修改表选项: 字符集,校对集和存储引擎

    • Alter table 表名 表选项 [=] 值;

    4、修改字段:新增, 修改, 重名, 删除

    (1)新增字段

    Alter table 表名 add [column] 字段名 数据类型 [列属性] [位置];

    位置: 字段名可以存放表中的任意位置

    First: 第一个位置

    After: 在哪个字段之后: after 字段名;

    默认的是在最后一个字段之后

    mysql> alter table student
        -> add column id int
        -> first;

    (2)修改字段

    • Alter table 表名 modify 字段名 数据类型 [属性] [位置];
    mysql> alter table student
        -> modify number char(10) after id;

    (3)重命名字段

    • Alter table 表名 change 旧字段 新字段名 数据类型 [属性] [位置];
    mysql> alter table student
        -> change gender sex varchar(10);

    (4)删除字段

    • Alter table 表名 drop 字段名;
    mysql> alter table student
        -> drop age;

    (5)删除数据表

    • Drop table 表名1,表名2...; -- 可以一次性删除多张表

    三、数据操作:增删改查

    1、新增数据

    • 给全表字段插入数据, 不需要指定字段列表: 要求数据的值出现的顺序必须与表中设计的字段出现的顺序一致: 凡是非数值数据,都需要使用引号(建议是单引号)包裹
    • Insert into 表名 values(值列表)[,(值列表)];      -- 可以一次性插入多条记录
    mysql> insert into student values(1,'itcast0001','Jim','male'),
        -> (2,'itcast0002','Hanmeimei','female');
    • 给部分字段插入数据,需要选定字段列表: 字段列表出现的顺序与字段的顺序无关; 但是值列表的顺序必须与选定的字段的顺序一致.
    • Insert into 表名 (字段列表) values (值列表)[,(值列表)];
    mysql> insert into student(number,sex,name,id) values
        -> ('itcast0003','male','Tom',3),
        -> ('itcast0004','female','lily',4);

    2、查看数据

    • 查看所有数据:Select */字段列表 from 表名 [where条件];

    mysql> select * from student;
    • 查看指定字段,指定条件的数据.

     select id,number,sex,name from student where id = 1;

    3、更新数据

    • Update 表名 set 字段 = 值 [where条件];       -- 建议都有where: 要不是更新全部
    mysql> update student set sex = 'female' where name = 'Jim';

    更新不一定会成功: 如没有真正要更新的数据

    4、删除数据

    • Delete from 表名 [where条件];
    mysql> delete from student where sex = 'male';

     

    四、中文数据问题

    五、数据类型(列类型)

    • SQL中将数据类型分成了三大类: 数值类型, 字符串类型和时间日期类型

    1、数值型

    数值型数据: 都是数值

    系统将数值型分为整数型和小数型.

    2、整数型

    存放整型数据: 在SQL中因为更多要考虑如何节省磁盘空间,所以系统将整型又细分成了5类:

    • Tinyint: 迷你整型,使用一个字节存储, 表示的状态最多为256种(常用)
    • Smallint: 小整型,使用2个字节存储,表示的状态最多为65536种
    • Mediumint: 中整型, 使用3个字节存储
    • Int: 标准整型, 使用4个字节存储(常用)
    • Bigint: 大整型,使用8个字节存储

    3、小数型

    小数型: 带有小数点或者范围超出整型的数值类型.

    SQL中: 将小数型细分成两种: 浮点型和定点型

    浮点型: 小数点浮动, 精度有限,而且会丢失精度

    定点型: 小数点固定, 精度固定, 不会丢失精度

    (1)浮点型

    浮点型数据是一种精度型数据: 因为超出指定范围之后, 会丢失精度(自动四舍五入)

    浮点型: 理论分为两种精度

    • Float: 单精度, 占用4个字节存储数据, 精度范围大概为7位左右
    • Double: 双精度,占用8个字节存储数据, 精度方位大概为15位左右

    (2)定点型

    • 定点型: 绝对的保证整数部分不会被四舍五入(不会丢失精度),小数部分有可能(理论小数部分也不会丢失精度)

    4、时间日期类型

    • Datetime: 时间日期, 格式是YYYY-mm-dd HH:ii:ss,表示的范围是从1000到9999年,有0值: 0000-00-00 00:00:00
    • Date: 日期,就是datetime中的date部分
    • Time: 时间(段), 指定的某个区间之间, -时间到+时间
    • Timestamp: 时间戳, 并不是时间戳,只是从1970年开始的YYYY-mm-dd HH:ii:ss格式与datetime完全一致
    • Year: 年份,两种形式, year(2)和year(4): 1901-2156

    创建时间表:

    mysql> create table my_date(
        -> d1 datetime,
        -> d2 date,
        -> d3 time,
        -> d4 timestamp,
        -> d5 year
        -> )charset utf8;

    插入数据:

    mysql> insert into my_date values('2018-8-30 16:42:40','2018-8-30','16:42:40','2018-8-30 16:43:41',2018);
    Query OK, 1 row affected (0.09 sec)
    

    时间使用负数:

    mysql> insert into my_date values('2018-8-30 16:42:40','2018-8-30','-16:42:40','2018-8-30 16:43:41',2018);
    Query OK, 1 row affected (0.07 sec)
    
    mysql> insert into my_date values('2018-8-30 16:42:40','2018-8-30','-211:42:40','2018-8-30 16:43:41',2018);
    Query OK, 1 row affected (0.15 sec)
    
    mysql> insert into my_date values('2018-8-30 16:42:40','2018-8-30','-2:42:40','2018-8-30 16:43:41',2018);
    Query OK, 1 row affected (0.10 sec)

    year可以使用2位:

    mysql> insert into my_date values('2018-8-30 16:42:40','2018-8-30','16:42:40','2018-8-30 16:43:41',69);
    Query OK, 1 row affected (0.04 sec)
    
    mysql> insert into my_date values('2018-8-30 16:42:40','2018-8-30','16:42:40','2018-8-30 16:43:41',70);
    Query OK, 1 row affected (0.08 sec)

    Timestamp字段: 只要当前所在的记录被更新, 该字段一定会自动更新成当前时间

    mysql> update my_date set d1 = '2018-8-30 16:53:50' where d5 = 2069;
    Query OK, 1 row affected (0.10 sec)

    5、字符串类型

    在SQL中,将字符串类型分成了6类: char,varchar,text , blob, enum和set

    (1)定长字符串

    • Char(L): L代表length, 可以存储的长度, 单位为字符, 最大长度值可以为255.
    • Char(4): 在UTF8 环境下,需要4 * 3 = 12个字节

    (2)变长字符串

    变长字符串: varchar, 在分配空间的时候, 按照最大的空间分配: 但是实际上最终用了多少,是根据具体的数据来确定.

    Varchar(L): L表示字符长度 理论长度是65536个字符, 但是会多处1到2个字节来确定存储的实际长度: 但是实际上如果长度超过255,既不用定长也不用变长, 使用文本字符串text

    Varchar(10): 的确存了10个汉字, utf8环境, 10 * 3 + 1 = 31(bytes), 存储了3个汉字: 3 * 3 + 1 = 10(bytes)

    (3)文本字符串

    如果数据量非常大, 通常说超过255个字符就会使用文本字符串

    (4)枚举字符串

    枚举: enum, 事先将所有可能出现的结果都设计好, 实际上存储的数据必须是规定好的数据中的一个

    枚举的使用方式

    定义: enum(可能出现的元素列表);    //如enum(‘男’,’女’,’不男不女’,’妖’,’保密’);

    使用: 存储数据,只能存储上面定义好的数据

    mysql> create table my_enum(
        -> gender enum('','','保密')
        -> )charset utf8;

    插入数据:

    mysql> insert into my_enum values(''),('保密');
    Query OK, 2 rows affected (0.10 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    mysql> insert into my_enum values('male');
    ERROR 1265 (01000): Data truncated for column 'gender' at row 1

    枚举原理: 枚举在进行数据规范的时候(定义的时候),系统会自动建立一个数字与枚举元素的对应关系(关系放到日志中):

    然后在进行数据插入的时候,系统自动将字符转换成对应的数字存储, 然后在进行数据提取的时候, 系统自动将数值转换成对应的字符串显示

    因为枚举实际存储的是数值,所以可以直接插入数值.

    mysql> insert into my_enum values(1),(2);

    (5)集合字符串

    六、列属性

    列属性: 真正约束字段的是数据类型, 但是数据类型的约束很单一. 需要有一些额外的约束, 来更加保证数据的合法性.

    列属性有很多: NULL/NOT NULL, default, Primary key, unique key, auto_increment, comment

    1、空属性

    mysql> create table my_class(
        -> name varchar(20) not null,
        -> room varchar(20) null
        -> )charset utf8;

    2、列描述

    3、默认值

    默认值: 某一种数据会经常性的出现某个具体的值, 可以在一开始就指定好: 在需要真实数据的时候,用户可以选择性的使用默认值.

    默认值关键字: default

    mysql> create table my_default(
        -> name varchar(20) not null,
        -> age tinyint unsigned default 0,
        -> gender enum('','','保密') default ''
        -> )charset utf8;

    默认值的生效: 使用, 在数据进行插入的时候,不给该字段赋值

    mysql> insert into my_default (name) values('高强');

    想要使用默认值,可以不一定去指定列表,故意不使用字段列表: 可以使用default关键字代替值

    mysql> insert into my_default values('张三',18,default);

     

    七、字段属性

    主键,唯一键和自增长

    1、主键

    主键: primary key,主要的键. 一张表只能有一个字段可以使用对应的键, 用来唯一的约束该字段里面的数据, 不能重复: 这种称之为主键.

    一张表只能有最多一个主键

    (1)增加主键

    • 在创建表的时候,直接在字段之后,跟primary key关键字(主键本身不允许为空)
    mysql> create table my_pri1(
        -> name varchar(20) not null,
        -> number char(10) primary key
        -> )charset utf8;

    优点: 非常直接; 缺点: 只能使用一个字段作为主键

    • 在创建表的时候, 在所有的字段之后, 使用primary key(主键字段列表)来创建主键(如果有多个字段作为主键,可以是复合主键)
    mysql> create table my_pri2(
        -> number char(10),
        -> course char(10),
        -> score tinyint unsigned default 60,
        -> primary key(number,course)
        -> )charset utf8;

    • 当表已经创建好之后, 额外追加主键: 可以通过修改表字段属性, 也可以直接追加.
    • Alter table 表名  add primary key(字段列表);
    mysql> create table my_pri3(
        -> course char(10) not null,
        -> name varchar(10) not null
        -> )charset utf8;

    mysql> alter table my_pri3 add primary key(course);

     

    (3)主键约束

    主键对应的字段中的数据不允许重复: 一旦重复,数据操作失败(增和改)

    主键冲突:

    mysql> insert into my_pri1 values('李四','itcast0002');
    ERROR 1062 (23000): Duplicate entry 'itcast0002' for key 'PRIMARY'

    mysql> insert into my_pri2 values('itcast0001','39010001',100);
    ERROR 1062 (23000): Duplicate entry 'itcast0001-39010001' for key 'PRIMARY'

    (4)更新主键&删除主键

    注意:没有办法更新主键: 主键必须先删除,才能增加.

    mysql> alter table my_pri3 drop primary key;

     (5)主键分类

    在实际创建表的过程中, 很少使用真实业务数据作为主键字段(业务主键,如学号,课程号);

    大部分的时候是使用逻辑性的字段(字段没有业务含义,值是什么都没有关系), 将这种字段主键称之为逻辑主键.

    mysql> create table my_student(
        -> id int primary key auto_increment, --逻辑主键:自增长
        -> number char(10) not null,
        -> name varchar(10) not null
        -> )charset utf8;

    (6)自动增长

    自增长: 当对应的字段,不给值,或者说给默认值,或者给NULL的时候, 会自动的被系统触发, 系统会从当前字段中已有的最大值再进行+1操作,得到一个新的在不同的字段.

    自增长通常是跟主键搭配.

     (7)新增自增长

    自增长特点: auto_increment

    • 任何一个字段要做自增长必须前提是本身是一个索引(key一栏有值)
    mysql> create table my_auto(
        -> id int auto_increment,
        -> name varchar(10) not null
        -> )charset utf8;
    ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
    • 自增长字段必须是数字(整型)
    mysql> create table my_auto(
        -> id varchar(1) primary key auto_increment,
        -> name varchar(10) not null
        -> )charset utf8;
    ERROR 1063 (42000): Incorrect column specifier for column 'id'
    • 一张表最多只能有一个自增长
    mysql> create table my_auto(
        -> id int primary key auto_increment,
        -> name varchar(10) not null,
        -> class int primary key auto_increment
        -> )charset utf8;
    ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

    (8)自增长使用

    • 当自增长被给定的值为NULL或者默认值的时候会触发自动增长
    mysql> insert into my_auto(name) values('王五');
    Query OK, 1 row affected (0.15 sec)
    
    mysql> insert into my_auto values(null,'张三');
    Query OK, 1 row affected (0.12 sec)
    
    mysql> insert into my_auto values(default,'李四');
    Query OK, 1 row affected (0.05 sec)

    • 自增长如果对应的字段输入了值,那么自增长失效: 但是下一次还是能够正确的自增长(从最大值+1)
    mysql> insert into my_auto values(6,'Tom');
    Query OK, 1 row affected (0.07 sec)
    
    mysql> insert into my_auto values(null,'Jack');
    Query OK, 1 row affected (0.11 sec)

    (9)修改自增长

    自增长如果是涉及到字段改变: 必须先删除自增长,后增加(一张表只能有一个自增长)

    修改当前自增长已经存在的值: 修改只能比当前已有的自增长的最大值大,不能小(小不生效)

    Alter table 表名 auto_increment  = 值;

    • 向下修改
    mysql> alter table my_auto auto_increment = 4;
    Query OK, 0 rows affected (0.10 sec)

    • 向上修改
    mysql> alter table my_auto auto_increment = 10;
    Query OK, 0 rows affected (0.17 sec)

    • 考: 为什么自增长是从1开始?为什么每次都是自增1呢?

    可以修改变量实现不同的效果: 修改是对整个数据修改,而不是单张表: (修改是会话级)

    mysql> set auto_increment_increment = 5;
    Query OK, 0 rows affected (0.00 sec)

    (10)删除自增长

    自增长是字段的一个属性: 可以通过modify来进行修改(保证字段没有auto_increment即可)

    Alter table 表名 modify 字段 类型;

    mysql> alter table my_auto modify id int primary key;   ---错误:主键理论上单独存在
    ERROR 1068 (42000): Multiple primary key defined
    mysql> alter table my_auto modify id int;    ---有主键的时候,千万不要再加主键
    Query OK, 5 rows affected (0.79 sec)

    2、唯一键

    一张表往往有很多字段需要具有唯一性,数据不能重复: 但是一张表中只能有一个主键: 唯一键(unique key)就可以解决表中有多个字段需要唯一性约束的问题.

    唯一键的本质与主键差不多: 唯一键默认的允许自动为空,而且可以多个为空(空字段不参与唯一性比较)

    (1)增加唯一键

    • 在创建表的时候,字段之后直接跟unique/ unique key
    mysql> create table my_unique1(
        -> number char(10) unique,
        -> name varchar(20) not null
        -> )charset utf8;
    Query OK, 0 rows affected, 1 warning (0.50 sec)

    • 在所有的字段之后增加unique key(字段列表); -- 复合唯一键
    mysql> create table my_unique2(
        -> number char(10) not null,
        -> name varchar(20) not null,
        -> unique key(number)
        -> )charset utf8;
    Query OK, 0 rows affected, 1 warning (0.33 sec)

    mysql> create table my_unique3(
        -> number char(10),
        -> name varchar(20) not null,
        -> unique key(number)
        -> )charset utf8;
    Query OK, 0 rows affected, 1 warning (0.66 sec)

    • 在创建表之后增加唯一键

    mysql> create table my_unique4(
        -> id int primary key auto_increment,
        -> number char(10),
        -> name varchar(20) not null
        -> )charset utf8;
    Query OK, 0 rows affected, 1 warning (0.30 sec)

    mysql> alter table my_unique4 add unique key(number);
    Query OK, 0 rows affected (0.24 sec)

    (2)唯一键约束

    唯一键与主键本质相同: 唯一的区别就是唯一键默认允许为空,而且是多个为空.

    如果唯一键也不允许为空: 与主键的约束作用是一致的.

    (3)更新唯一键&删除唯一键

    • 更新唯一键: 先删除后新增(唯一键可以有多个: 可以不删除).

    删除唯一键

    Alter table 表名 drop unique key; -- 错误: 唯一键有多个

    Alter table 表名 drop index 索引名字; -- 唯一键默认的使用字段名作为索引名字

    3、索引

    几乎所有的索引都是建立在字段之上

    Mysql中提供了多种索引

    • 主键索引: primary key
    • 唯一索引: unique key
    • 全文索引: fulltext index
    • 普通索引: index

    八、关系

    将实体与实体的关系, 反应到最终数据库表的设计上来: 将关系分成三种: 一对一, 一对多(多对一)和多对多.

    所有的关系都是指的表与表之间的关系.

    • 一对一: 一张表的一条记录一定只能与另外一张表的一条记录进行对应; 反之亦然.

    • 一对多: 一张表中有一条记录可以对应另外一张表中的多条记录; 但是返回过, 另外一张表的一条记录只能对应第一张表的一条记录. 这种关系就是一对多或者多对一.

              母亲与孩子的关系: 母亲,孩子两个实体

    • 多对多: 一张表中(A)的一条记录能够对应另外一张表(B)中的多条记录; 同时B表中的一条记录也能对应A表中的多条记录: 多对多的关系

      老师教学: 老师和学生

    九、范式

    范式: 是一种分层结构的规范, 分为六层: 每一次层都比上一层更加严格: 若要满足下一层范式,前提是满足上一层范式

    六层范式: 1NF,2NF,3NF...6NF, 1NF是最底层,要求最低;6NF最高层,最严格

    一般情况下,只有前三种范式需要满足

    1、1NF

    • 第一范式: 在设计表存储数据的时候, 如果表中设计的字段存储的数据,在取出来使用之前还需要额外的处理(拆分),那么说表的设计不满足第一范式: 第一范式要求字段的数据具有原子性: 不可再分.

    2、2NF

    • 在数据表设计的过程中,如果有复合主键(多字段主键), 且表中有字段并不是由整个主键来确定, 而是依赖主键中的某个字段(主键的部分): 存在字段依赖主键的部分的问题, 称之为部分依赖: 第二范式就是要解决表设计不允许出现部分依赖.

    3、3NF

    • 要满足第三范式,必须满足第二范式.
    • 第三范式: 理论上讲,应该一张表中的所有字段都应该直接依赖主键(逻辑主键: 代表的是业务主键), 如果表设计中存在一个字段, 并不直接依赖主键,而是通过某个非主键字段依赖,最终实现依赖主键: 把这种不是直接依赖主键,而是依赖非主键字段的依赖关系称之为传递依赖. 第三范式就是要解决传递依赖的问题

    十、数据高级操作

    数据操作:增删改查

    1、新增数据

    基本语法

    Insert into 表名 [(字段列表)] values (值列表)

    在数据插入的时候, 假设主键对应的值已经存在: 插入一定会失败!

    2、主键冲突

    当主键存在冲突的时候(Duplicate key),可以选择性的进行处理: 更新和替换

    (1)主键冲突: 更新操作

    Insert into 表名[(字段列表:包含主键)] values(值列表) on duplicate key update 字段 = 新值;

    mysql> insert into my_class values('PHP0810','B205');
    ERROR 1062 (23000): Duplicate entry 'PHP0810' for key 'PRIMARY'

    主键冲突:更新

    mysql> insert into my_class values('PHP0810','B205')
        -> on duplicate key update
        -> room = 'B205';
    Query OK, 2 rows affected (0.07 sec)

    (2)主键冲突: 替换

    Replace into 表名 [(字段列表:包含主键)] values(值列表);

    mysql> replace into my_class values('PHP0810','A203');
    Query OK, 2 rows affected (0.06 sec)

    3、蠕虫复制

    • 蠕虫复制: 从已有的数据中去获取数据,然后将数据又进行新增操作: 数据成倍的增加.
    • 表创建高级操作: 从已有表创建新表(复制表结构)(而不能复制表中的数据)

              Create table 表名 like 数据库.表名;

    • 蠕虫复制: 先查出数据, 然后将查出的数据新增一遍

               Insert into 表名[(字段列表)] select 字段列表/* from 数据表名;

    4、更新数据

    基本语法

    Update 表名 set 字段 = 值 [where条件];

    高级新增语法

    Update 表名 set 字段 = 值 [where条件] [limit 更新数量];

    mysql> update my_copy set name = 'c' where name = 'a' limit 3;
    Query OK, 3 rows affected (0.06 sec)

    5、删除数据

    与更新类似: 可以通过limit来限制数量

    Delete from 表名 [where条件] [limit 数量];

    mysql> delete from my_copy where name = 'b' limit 10;
    Query OK, 2 rows affected (0.14 sec)

    注意:删除: 如果表中存在主键自增长,那么当删除之后, 自增长不会还原

     

    mysql> delete from my_student;
    Query OK, 3 rows affected (0.24 sec)

    思路: 数据的删除是不会改变表结构, 只能删除表后重建表

    Truncate 表名;      -- 先删除改变,后新增改变

    6、查询数据

    基本语法

    Select 字段列表/* from 表名 [where条件];

    完整语法

    Select [select选项] 字段列表[字段别名]/* from 数据源 [where条件子句] [group by子句] [having子句] [order by子句] [limit 子句];

    (1)Select选项

    Select选项: select对查出来的结果的处理方式

    All: 默认的,保留所有的结果

    Distinct: 去重, 查出来的结果,将重复给去除(所有字段都相同)

    mysql> select distinct * from my_copy;

    (2)字段别名

    字段别名: 当数据进行查询出来的时候, 有时候名字并不一定就满足需求(多表查询的时候, 会有同名字段). 需要对字段名进行重命名: 别名

    语法

    字段名 [as] 别名;

    mysql> select
        -> id,
        -> number as 学号,
        -> name as 姓名,
        -> sex as 性别 from student;

    十一、数据源

    数据源分为多种: 单表数据源, 多表数据源, 查询语句

    • 单表数据源: select * from 表名;
    • 多表数据源: select* from 表名1,表名2...;
    • 子查询: 数据的来源是一条查询语句(查询语句的结果是二维表)

      Select * from (select 语句) as 表名;

    1、where子句

    Where子句: 用来判断数据,筛选数据.

    Where子句返回结果: 0或者1, 0代表false,1代表true.

    判断条件:

    比较运算符: >, <, >=, <= ,!= ,<>, =, like, between and, in/not in

    逻辑运算符: &&(and), ||(or), !(not)

    (1)条件查询1: 要求找出学生id为1或者3或者5的学生

    select * from student where id = 1 || id = 3 || id = 5;

    (2)条件查询2: 查出区间落在180,190身高之间的学生:

    mysql> select * from student where height >= 180 and height <=190;
    mysql> select * from student where height between 180 and 190;

    Between本身是闭区间; between左边的值必须小于或者等于右边的值

    mysql> select * from student where height between 190 and 180;
    Empty set (0.00 sec)

    2、Group by子句

    Group by:分组的意思, 根据某个字段进行分组(相同的放一组,不同的分到不同的组)

    基本语法: group  by 字段名;

    分组的意思: 是为了统计数据(按组统计: 按分组字段进行数据统计)

    SQL提供了一系列统计函数

    • Count(): 统计分组后的记录数: 每一组有多少记录

      Count函数: 里面可以使用两种参数: *代表统计记录,字段名代表统计对应的字段(NULL不统计)

    • Max():    统计每组中最大的值
    • Min(): 统计最小值
    • Avg(): 统计平均 值
    • Sum(): 统计和
    mysql> select sex,count(*),max(height),min(height),avg(age),sum(age) from student group by sex;

    分组会自动排序: 根据分组字段:默认升序

    Group by 字段 [asc|desc];    -- 对分组的结果然后合并之后的整个结果进行排序

    多字段分组: 先根据一个字段进行分组,然后对分组后的结果再次按照其他字段进行分组

    mysql> select height,sex,count(*) from student group by height,sex;

    有一个函数: 可以对分组的结果中的某个字段进行字符串连接(保留该组所有的某个字段): group_concat(字段);

    mysql> select height,sex,count(*),group_concat(name) from student group by height,sex;

    3、Having子句

    Having子句: 与where子句一样: 进行条件判断的.

    Where是针对磁盘数据进行判断: 进入到内存之后,会进行分组操作: 分组结果就需要having来处理.

    Having能做where能做的几乎所有事情, 但是where却不能做having能做的很多事情.

    (1)分组统计的结果或者说统计函数都只有having能够使用.

    mysql> select sex,count(*) from student group by sex having count(*) >= 2;

    (2)Having能够使用字段别名: where不能: where是从磁盘取数据,而名字只可能是字段名: 别名是在字段进入到内存后才会产生.

    mysql> select sex,count(*) as total from student group by sex having total >= 2;

    4、Order by子句

    Order by: 排序, 根据某个字段进行升序或者降序排序, 依赖校对集.

    使用基本语法

    Order by 字段名 [asc|desc]; -- asc是升序(默认的),desc是降序

    mysql> select * from student order by height

    排序可以进行多字段排序: 先根据某个字段进行排序, 然后排序好的内部,再按照某个数据进行再次排序:

    mysql> select * from student order by height,sex;

    5、Limit子句

    Limit子句是一种限制结果的语句: 限制数量.

    Limit有两种使用方式

    • 只用来限制长度(数据量): limit 数据量;
    mysql> select * from student limit 2;
    • 限制起始位置,限制数量: limit 起始位置,长度;

    mysql> select * from student limit 2,2;

    对于服务器来讲: 根据用户选择的页码来获取不同的数据: limit offset,length;

    Length: 每页显示的数据量: 基本不变

    Offset: offset = (页码 - 1) * 每页显示量

    十二、连接查询

    连接查询: 将多张表(可以大于2张)进行记录的连接(按照某个指定的条件进行数据拼接): 最终结果是: 记录数有可能变化, 字段数一定会增加(至少两张表的合并)

    连接查询: join, 使用方式: 左表 join 右表

    左表: 在join关键字左边的表

    右表: 在join关键字右边的表

    1、连接查询分类

    SQL中将连接查询分成四类: 内连接,外连接,自然连接和交叉连接

    (1)交叉连接

    交叉连接: cross join, 从一张表中循环取出每一条记录, 每条记录都去另外一张表进行匹配:

    匹配一定保留(没有条件匹配), 而连接本身字段就会增加(保留),最终形成的结果叫做: 笛卡尔积

    基本语法: 左表 cross join 右表; ===== from 左表,右表;

    mysql> select * from student cross join my_class;

    笛卡尔积没有意义: 应该尽量避免(交叉连接没用)

    交叉连接存在的价值: 保证连接这种结构的完整性

    (2)内连接

    内连接: [inner] join, 从左表中取出每一条记录,去右表中与所有的记录进行匹配: 匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留.

    基本语法:左表 [inner] join 右表 on 左表.字段 = 右表.字段; on表示连接条件: 条件字段就是代表相同的业务含义(如my_student.c_id和my_class.id)

    mysql> select * from student inner join my_class on student.id = my_class.id; 

    字段别名以及表别名的使用: 在查询数据的时候,不同表有同名字段,这个时候需要加上表名才能区分, 而表名太长, 通常可以使用别名.

    mysql> select s.*,c.name as c_name,c.room from
        -> student as s inner join my_class as c
        -> on s.id = c.id;

    内连接还可以使用where代替on关键字(where没有on效率高)

    (3)外连接

    外连接: outer join, 以某张表为主,取出里面的所有记录, 然后每条与另外一张表进行连接: 不管能不能匹配上条件,最终都会保留: 能比配,正确保留; 不能匹配,其他表的字段都置空NULL.

    外连接分为两种: 是以某张表为主: 有主表

    Left join: 左外连接(左连接), 以左表为主表

    Right join: 右外连接(右连接), 以右表为主表

    基本语法: 左表 left/right join 右表 on 左表.字段 = 右表.字段;

    •  左连接
    mysql> select s.*,c.name as c_name,c.room from
        -> student as s left join my_class as c
        -> on s.id = c.id;

    • 右连接
    mysql> select s.*,c.name as c_name,c.room from
        -> student as s right join my_class as c
        -> on s.id = c.id;

    (4)自然连接

    自然连接: natural join, 自然连接, 就是自动匹配连接条件: 系统以字段名字作为匹配模式(同名字段就作为条件, 多个同名字段都作为条件).

    自然连接: 可以分为自然内连接和自然外连接.

    自然内连接: 左表 natural join 右表;

  • 相关阅读:
    4.4 Iterator(迭代器)
    4.6 Memento(备忘录)
    4.1 Chain of Responsibility(职责链)
    4.5 Mediator(中介者)
    4.7 Observer(观察者)
    4.8 State(状态)
    4.11 Visitor(访问者)
    4.2 Command(命令)
    3.7 Proxy(代理)
    4.10 Template Method(模板方法)
  • 原文地址:https://www.cnblogs.com/yinqanne/p/9561298.html
Copyright © 2011-2022 走看看