Data Query Language 数据查询语言,是数据库中最核心的语言,最重要的语句!

关键字:select

select语法

  1. --第四部分学完后,select的语法结构如下:
  2. select distinct `字段` --基础查询 + 去重
  3. from `表`
  4. inner\left\right join `表` --联表
  5. on 交叉条件
  6. where 筛选条件
  7. group by `字段` --分组
  8. having 筛选条件 --过滤
  9. order by `字段2` ASC \ DESC --排序
  10. limit 想要从第几行开始-1, 要显示多少行; --分页

1、基本查询


1.1、查询指定字段

  1. --查询指定表的全部字段信息
  2. select * from `表名`;
  3. --查询指定表的指定字段信息
  4. select `字段1`, `字段2` from `表名`;
  5. --查询指定表的指定字段信息,并且用as给字段重命名,方便查询结果的可阅读性
  6. select `字段1` as '新字段名字', `字段2` as '新字段名字' from `表名` as '新表名';
  7. --cancat(a,b)函数:用文字将查询到的每个字段值拼接起来然后一起呈现出来
  8. select concat('拼接的内容', `字段名`) from `表名;`

1.2、查询指定字段并且字段值+1

  1. --不止+1,加多少都行
  2. select `字段`+1 from `表名`;

1.3、查询指定字段并且用distinct 去重

  1. --将查询出来的重复的字段值去掉,只保留一个,然后呈现出来
  2. select distinct `字段名` from `表名`;

1.4、其他查询

  1. --查询SQLyog系统版本(函数)
  2. select version();
  3. --查询计算结果(表达式)
  4. select 99+1;
  5. --查询自增的步长(变量)
  6. select @@auto_increment_increment

2、模糊查询


2.1、where 限制查询到的字段值范围

  1. select `字段` from `表名`
  2. where 限制范围表达式;

2.2、like 运算符(我认为最能算得上的模糊查询)

  1. --查找到有'字段值的一部分'的字段值,然后一起呈现出来
  2. select `字段` from `表名`
  3. where `字段名` like '字段值的一部分';
  4. =====================================================
  5. -- % 百分号表示0~任意个字符
  6. -- _ 下划线表示一个字符
  7. -- 可配合 % _ 来更具体的查找指定宽度的字段值,如:
  8. select `字段` from `表名`
  9. where `字段名` like '吴%'; --查找姓吴的同学
  10. select `字段` from `表名`
  11. where `字段名` like '吴___'; --查找姓名有三个字的姓吴的同学
  12. select `字段` from `表名`
  13. where `字段名` like '%鎔%'; --查找姓名中带有鎔的同学

2.3、in 运算符

  1. --查找到刚刚好恰包含'字段值1','字段值2','字段值3'的字段值
  2. --注意:'字段值1','字段值2','字段值3'必须是精确的,不能配合 % _ 使用!
  3. select `字段` from `表名`
  4. where `字段名` in ('字段值1','字段值2','字段值3');

2.4、null 、not null 运算符(不能查找字符串为空或非空)

  1. --查询指定字段的非字符串的字段值为空的数据
  2. select `字段` from `表名`
  3. where `字段名` is null;
  4. --查询指定字段的非字符串的字段值为非空的数据
  5. select `字段` from `表名`
  6. where `字段名` is not null;

2.5、’ ‘ 空字符串(可以查找字符串为空或非空)

  1. --查询指定字段的字符串字段值为空字符串的数据
  2. select `字段` from `表名`
  3. where `字段名` = '';
  4. --查询指定字段的字符串字段值为非空字符串的数据
  5. select `字段` from `表名`
  6. where `字段名` != '';

3、联表查询


3.1、inner\left\right join、on关键字

inner join 查询出两张表的交叉字段的字段值都同时存在的数据!

left join 查询出交叉字段的字段值在左边的表有的,就算右边的表没有,也能获取!

right join 查询出交叉字段的字段值在右边的表有的,就算左边的表没有,也能获取!

on 联表查询中用来表示出交叉字段,其实用where也可以,但是on的话是和join配套使用的!

3.2、基本格式

  1. select 新左表名.`交叉字段1`, `字段2`, `字段3`
  2. from `左表名` as 新左表名
  3. inner\left\right join `右表名` as 新右表名
  4. on 新左表名.交叉字段 = 新右表名.交叉字段;

3.3、用例题来学习联表查询

student表:

id name age
1 小吴 20
2 小明 19
3 小红 18
4 小王 17

grade表:

id math english
1 100 100
2 90 90
3 80 null

观察两张表:

1、student表和grade表的交叉字段是id,交叉字段的字段值为:1、2、3

2、student表相比于grade表有一个独有的交叉字段的字段值:4


需求A:

  1. 查询四个字段:idnamemathenglish,并且查询的交叉字段id的字段值只有123

解决方案:

  1. 因为要查询的四个字段:id、name、math、english 同时存在于两张表中,所以要联表查询,以student为左表,grade表为右表
  2. 观察两张表的数据,发现字段 id 为两表共有的,所以字段 id 是交叉字段,记得用on表示出来
  3. 要求查询到的交叉字段id的字段值只有1、2、3,因为student表的交叉字段id的字段值有1、2、3、4,而grade 表的交叉字段id的字段值有1、2、3,想要仅查询出1、2、3的话,就得用到 inner join 或者 right join

编写DQL如下:

  1. select s.`id`, `name`, `math`, `english`
  2. from `student` as s
  3. inner join `grade` g
  4. on s.`id` = g.`id`;
  5. --或者
  6. select s.`id`, `name`, `math`, `english`
  7. from `student` as s
  8. right join `grade` g
  9. on s.`id` = g.`id`;

查询结果:
QQ图片20200702162540.png
注意点:

  1. 第2行用 as s 来将student表的名字重命名为 s ,这里的 as 也可以省略,如第三行的 g
  2. 由于交叉字段为id,所以在第一行必须说明呈现的是哪张表的 id ,如果不说明就会报模棱两可的错误:不知道要呈现的到底是哪张表的 id !像上面的 s.id 表示呈现的是student表的id !
  3. on 后面一定要表示出交叉字段,否则两张表就联系不到一起去了!

需求B:

查询四个字段:id、name、math、english,并且查询的交叉字段id的字段值要有1、2、3、4

编写DQL如下:

  1. select s.`id`, `name`, `math`, `english`
  2. from `student` as s
  3. left join `grade` as g
  4. on s.`id` = g.`id`;

查询结果:
QQ图片20200702162445.png
注意点:

  1. 使用left join

    3.4、自连接(挺难的,狂神说了解就行,那我就暂时不做笔记了,过!)

    4、分组和过滤


4.1、group by 分组

  1. --使用格式
  2. group by `字段` --通过什么字段来分组

4.2、having 过滤

  1. --使用格式
  2. having 筛选范围
  3. --注意:havingwhere本质的作用是一样的,只是wherehaving的前面使用,并且只能使用一次!而having可以无限使用,也就是无限次的过滤!

5、排序和分页


5.1、order by 排序

  1. --升序ASC
  2. --降序DESC
  3. --基本格式
  4. select `字段1`, `字段2`
  5. from `表名`
  6. order by `字段2` ASC \ DESC; --根据字段2的值升序或排序

5.2、limit 分页

  1. --使用规则(第一行从0开始)
  2. limit 想要从第几行开始 - 1 , 要显示多少行;

现有一张student表如下:
QQ图片20200702214807.png


分页需求A:从第一行(也就是id为1的那一行)开始,显示出 id、name、age 5行!

  1. select `id`,`name`,`age`
  2. from student
  3. limit 0,5;

分页结果:
QQ图片20200702215200.png


分页需求A:从第六行(也就是id为6的那一行)开始,显示出 id、name、age 5行!

  1. select `id`,`name`,`age`
  2. from student
  3. limit 5,5;

分页结果:
QQ图片20200702215408.png

6、子查询和嵌套查询


注意:子查询和嵌套查询的结果都可以用联表查询来解决,想用哪种方式都行!

对鎔杰来说:还是联表查询叭!哈哈哈哈!

6.1、子查询

  1. --使用规则
  2. where `字段` = (
  3. 再用select从另一张表查
  4. )

需求:

从上面联表查询的例题的基础上,查询出id、name、math、english

在此基础上再查询出叫小吴的同学

编写DQL如下:

  1. select s.`id`,`name`,`math`,`english`
  2. from `student` s
  3. inner join `grade` g
  4. on s.`id` = g.`id`
  5. where s.`id` = (
  6. select `id`
  7. from `student`
  8. where `name` = '小吴'
  9. )

查询结果:
QQ图片20200703094310.png

6.2、嵌套查询

需求:

从上面联表查询的例题的基础上,只查询 id、name ,

id为1,name叫小吴的同学

编写DQL如下:

  1. select `id`,`name` from `student` where `id` = (
  2. select `id` from `grade` where `math`=100 and id = (
  3. select id from `student` where NAME = '小吴'
  4. )
  5. )

查询结果:
QQ图片20200703094220.png