Data Query Language 数据查询语言,是数据库中最核心的语言,最重要的语句!
关键字:select
select语法
--第四部分学完后,select的语法结构如下:select distinct `字段` --基础查询 + 去重from `表`inner\left\right join `表` --联表on 交叉条件where 筛选条件group by `字段` --分组having 筛选条件 --过滤order by `字段2` ASC \ DESC --排序limit 想要从第几行开始-1, 要显示多少行; --分页
1、基本查询
1.1、查询指定字段
--查询指定表的全部字段信息select * from `表名`;--查询指定表的指定字段信息select `字段1`, `字段2` from `表名`;--查询指定表的指定字段信息,并且用as给字段重命名,方便查询结果的可阅读性select `字段1` as '新字段名字', `字段2` as '新字段名字' from `表名` as '新表名';--cancat(a,b)函数:用文字将查询到的每个字段值拼接起来然后一起呈现出来select concat('拼接的内容', `字段名`) from `表名;`
1.2、查询指定字段并且字段值+1
--不止+1,加多少都行select `字段`+1 from `表名`;
1.3、查询指定字段并且用distinct 去重
--将查询出来的重复的字段值去掉,只保留一个,然后呈现出来select distinct `字段名` from `表名`;
1.4、其他查询
--查询SQLyog系统版本(函数)select version();--查询计算结果(表达式)select 99+1;--查询自增的步长(变量)select @@auto_increment_increment
2、模糊查询
2.1、where 限制查询到的字段值范围
select `字段` from `表名`where 限制范围表达式;
2.2、like 运算符(我认为最能算得上的模糊查询)
--查找到有'字段值的一部分'的字段值,然后一起呈现出来select `字段` from `表名`where `字段名` like '字段值的一部分';=====================================================-- % 百分号表示0~任意个字符-- _ 下划线表示一个字符-- 可配合 % _ 来更具体的查找指定宽度的字段值,如:select `字段` from `表名`where `字段名` like '吴%'; --查找姓吴的同学select `字段` from `表名`where `字段名` like '吴___'; --查找姓名有三个字的姓吴的同学select `字段` from `表名`where `字段名` like '%鎔%'; --查找姓名中带有鎔的同学
2.3、in 运算符
--查找到刚刚好恰包含'字段值1','字段值2','字段值3'的字段值--注意:'字段值1','字段值2','字段值3'必须是精确的,不能配合 % _ 使用!select `字段` from `表名`where `字段名` in ('字段值1','字段值2','字段值3');
2.4、null 、not null 运算符(不能查找字符串为空或非空)
--查询指定字段的非字符串的字段值为空的数据select `字段` from `表名`where `字段名` is null;--查询指定字段的非字符串的字段值为非空的数据select `字段` from `表名`where `字段名` is not null;
2.5、’ ‘ 空字符串(可以查找字符串为空或非空)
--查询指定字段的字符串字段值为空字符串的数据select `字段` from `表名`where `字段名` = '';--查询指定字段的字符串字段值为非空字符串的数据select `字段` from `表名`where `字段名` != '';
3、联表查询
3.1、inner\left\right join、on关键字
inner join 查询出两张表的交叉字段的字段值都同时存在的数据!
left join 查询出交叉字段的字段值在左边的表有的,就算右边的表没有,也能获取!
right join 查询出交叉字段的字段值在右边的表有的,就算左边的表没有,也能获取!
on 联表查询中用来表示出交叉字段,其实用where也可以,但是on的话是和join配套使用的!
3.2、基本格式
select 新左表名.`交叉字段1`, `字段2`, `字段3`from `左表名` as 新左表名inner\left\right join `右表名` as 新右表名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:
查询四个字段:id、name、math、english,并且查询的交叉字段id的字段值只有1、2、3
解决方案:
- 因为要查询的四个字段:id、name、math、english 同时存在于两张表中,所以要联表查询,以student为左表,grade表为右表
- 观察两张表的数据,发现字段 id 为两表共有的,所以字段 id 是交叉字段,记得用on表示出来
- 要求查询到的交叉字段id的字段值只有1、2、3,因为student表的交叉字段id的字段值有1、2、3、4,而grade 表的交叉字段id的字段值有1、2、3,想要仅查询出1、2、3的话,就得用到 inner join 或者 right join
编写DQL如下:
select s.`id`, `name`, `math`, `english`from `student` as sinner join `grade` gon s.`id` = g.`id`;--或者select s.`id`, `name`, `math`, `english`from `student` as sright join `grade` gon s.`id` = g.`id`;
查询结果:
注意点:
- 第2行用 as s 来将student表的名字重命名为 s ,这里的 as 也可以省略,如第三行的 g
- 由于交叉字段为id,所以在第一行必须说明呈现的是哪张表的 id ,如果不说明就会报模棱两可的错误:不知道要呈现的到底是哪张表的 id !像上面的 s.id 表示呈现的是student表的id !
- on 后面一定要表示出交叉字段,否则两张表就联系不到一起去了!
需求B:
查询四个字段:id、name、math、english,并且查询的交叉字段id的字段值要有1、2、3、4
编写DQL如下:
select s.`id`, `name`, `math`, `english`from `student` as sleft join `grade` as gon s.`id` = g.`id`;
查询结果:
注意点:
4.1、group by 分组
--使用格式group by `字段` --通过什么字段来分组
4.2、having 过滤
--使用格式having 筛选范围--注意:having和where本质的作用是一样的,只是where在having的前面使用,并且只能使用一次!而having可以无限使用,也就是无限次的过滤!
5、排序和分页
5.1、order by 排序
--升序ASC--降序DESC--基本格式select `字段1`, `字段2`from `表名`order by `字段2` ASC \ DESC; --根据字段2的值升序或排序
5.2、limit 分页
--使用规则(第一行从0开始)limit 想要从第几行开始 - 1 , 要显示多少行;
现有一张student表如下:
分页需求A:从第一行(也就是id为1的那一行)开始,显示出 id、name、age 5行!
select `id`,`name`,`age`from studentlimit 0,5;
分页结果:
分页需求A:从第六行(也就是id为6的那一行)开始,显示出 id、name、age 5行!
select `id`,`name`,`age`from studentlimit 5,5;
6、子查询和嵌套查询
注意:子查询和嵌套查询的结果都可以用联表查询来解决,想用哪种方式都行!
6.1、子查询
--使用规则where `字段` = (再用select从另一张表查)
需求:
从上面联表查询的例题的基础上,查询出id、name、math、english
在此基础上再查询出叫小吴的同学
编写DQL如下:
select s.`id`,`name`,`math`,`english`from `student` sinner join `grade` gon s.`id` = g.`id`where s.`id` = (select `id`from `student`where `name` = '小吴')
6.2、嵌套查询
需求:
从上面联表查询的例题的基础上,只查询 id、name ,
id为1,name叫小吴的同学
编写DQL如下:
select `id`,`name` from `student` where `id` = (select `id` from `grade` where `math`=100 and id = (select id from `student` where NAME = '小吴'))
查询结果:
