MySQL之DQL

本文详细介绍了DQL,即数据查询语言,包括其基本结构和执行顺序。重点讲解了SELECT语句的不同选项如ALL、DISTINCT,以及如何通过FROM、WHERE、GROUP BY、HAVING、ORDER BY和LIMIT子句进行数据筛选、分组、排序和分页。此外,还举例说明了JOIN操作,如INNER JOIN和LEFT JOIN在合并数据集中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. DQL 简介

DQL(Data Query Language) 数据查询语言

数据查询语言DQL主要由select子句、from子句和where子句组成的查询块

select完整语法:

select [all | distinct | distinctrow]
{* | talbe.* | [table.]field1 [AS alias1] [,[table.]field2 [AS alias2] [,] ]}
FROM table_name [as table_alias]
		[{left | right | inner join table_name2 on }]
		[WHERE ...]
		[GROUP BY ...]
		[HAVING ...]
		[ORDER BY ...]
		[limit {[offset,] row_count | row_countOFFSET offset}];
执行顺序:
	1. from
	2. where
	3. group by
	4. having
	5. select
	6. order by
	7. limit

注:[] 代表可选项、{}代表必填项

2. select 语法解析

2.1 from table_name [as table_alias]

你想要查询哪张表就在from后面加上表名就行

2.2 select [选项 all | distinct | distinctrow]

2.2.1 all (全部返回、默认)

select all * from table_name;
-- 等价于
select * from table_name;

select all * from `option`;
+------------+-----------+
| first_name | last_name |
+------------+-----------+
|||
|||
|||
|||
|||
|||
|||
|||
+------------+-----------+

select * from `option`;
+------------+-----------+
| first_name | last_name |
+------------+-----------+
|||
|||
|||
|||
|||
|||
|||
|||
+------------+-----------+

2.2.2 distinct (去重)

2.2.2.1 单行去重

去除指定字段查询到的重复的记录

语法:

select distinct col_name from table_name;

实例:

select first_name from `option`;
+------------+
| first_name |
+------------+
||
||
||
||
||
||
||
||
+------------+

select distinct first_name from `option`;
+------------+
| first_name |
+------------+
||
||
||
||
+------------+
2.2.2.2 多行行去重

去除查询到的指定的多个字段同时重复的记录

语法:

select distinct col1,col2,... from table_name;

实例:

select first_name,last_name from `option`;
+------------+-----------+
| first_name | last_name |
+------------+-----------+
|||
|||
||| <---
|||
||| <---
|||
|||
|||
+------------+-----------+

select distinct first_name, last_name from `option`;
+------------+-----------+
| first_name | last_name |
+------------+-----------+
|||
|||
||| <---
|||
|||
|||
|||
+------------+-----------+

注:distinct 后面跟多个字段名的时候只有所有的字段值都重复该行才会被过滤

2.2.3 distinctrow

关于distinctrow,我在官方文档上找到这样一句话:

The ALL and DISTINCT modifiers specify whether duplicate rows should be returned. ALL (the default) specifies that all matching rows should be returned, including duplicates. DISTINCT specifies removal of duplicate rows from the result set. It is an error to specify both modifiers. DISTINCTROW is a synonym for DISTINCT.
翻译:
ALL 和 DISTINCT 修饰符指定是否应返回重复行。ALL (默认值)指定应该返回所有匹配的行,包括重复的行。DISTINCT 指定从结果集中删除重复行。指定两个修饰符都是错误的。DISTINCTROW 是 DISTINCT 的同义词。

这句话告诉我们在select后all | distinct | distinctrow 只能使用其中的一个,并且 distinctdistinctrow是一样的

2.3 {* | talbe.* |[table.]field1[as alias1] [,[table.]field2[AS alias2] [,…] ]}

想要获取数据的字段名的指定

2.3.1 *

*都表示返回被查询表的所有列

语法:

select * from table_name;

案例:

select * from `option`;
+------------+-----------+
| first_name | last_name |
+------------+-----------+
|||
|||
|||
|||
|||
|||
|||
|||
+------------+-----------+

2.3.2 table.*

table. *表示显示指定的表的所有字段

语法:

select table_name.* from table_name

案例:

select * from person;
+------+-----+
| name | age |
+------+-----+
| 剑姬 |  20 |
| 剑魔 |  50 |
| 剑圣 |  40 |
+------+-----+

select person.* from person;
+------+-----+
| name | age |
+------+-----+
| 剑姬 |  20 |
| 剑魔 |  50 |
| 剑圣 |  40 |
+------+-----+

2.3.3 [table.]field1 [as alias1]

[table.]field1 表示显示指定的字段的所有值

语法:

select field1 from table_name;
select table_name.field1 from table_name;

案例:

select name from person;
+------+
| name |
+------+
| 剑姬 |
| 剑魔 |
| 剑圣 |
+------+

2.3.4 [,[table.]field2[AS alias2] [,…] ]

[,[table.]field2[AS alias2] [,…] ] 可以同时查询多个字段

语法:

select field1,field2,field3,..... from table_name;
select table_name.field1,table_name.field2,table_name.field3,.... from table_name;

案例:

select name,age from person;
+------+-----+
| name | age |
+------+-----+
| 剑姬 |  20 |
| 剑魔 |  50 |
| 剑圣 |  40 |
+------+-----+

2.3.5 as

[as alias1] 可以为该字段起一个别名,显示时字段名会以别名的形式显示

语法:

select col1 as "col1_alias1", col2 as "col1_alias2",... from table_name;
-- or
select col1 "col1_alias1", col2 "col1_alias2",... from table_name;

案例:


select name as "姓名",age as "年龄" from person;
+------+------+
| 姓名 | 年龄 |
+------+------+
| 剑姬 |   20 |
| 剑魔 |   50 |
| 剑圣 |   40 |
+------+------+

select name "姓名",age "年龄" from person;
+------+------+
| 姓名 | 年龄 |
+------+------+
| 剑姬 |   20 |
| 剑魔 |   50 |
| 剑圣 |   40 |
+------+------+

注:as可以不加只需在字段名后 加空格 然后 再加别名 就行

2.4 where 子句

where 子句 用于规定选择的标准

子句是由比较操作符、逻辑操作符构成的逻辑表达式

2.4.1 比较操作符

大于 >,小于< ,等于=,不等于 !=

between num1 and num2 相当于 >=num1 and <= num2

is null, is not null …

2.4.2 逻辑操作符

与 && | and,或 || | or, 非 not | or

案例:

select * from person;
+------+-----+
| name | age |
+------+-----+
| 剑姬 |  20 |
| 剑魔 |  50 |
| 剑圣 |  40 |
+------+-----+

select * from person where age > 40;
+------+-----+
| name | age |
+------+-----+
| 剑魔 |  50 |
+------+-----+

select * from person where age < 40;
+------+-----+
| name | age |
+------+-----+
| 剑姬 |  20 |
+------+-----+

select * from person where age between 30 and 50;
+------+-----+
| name | age |
+------+-----+
| 剑魔 |  50 |
| 剑圣 |  40 |
+------+-----+

select * from person where age >= 30 and age <= 50;
+------+-----+
| name | age |
+------+-----+
| 剑魔 |  50 |
| 剑圣 |  40 |
+------+-----+

2.5 ORDER BY 子句

order by 主要用于查询结果的排序

排序方法:

​ 升序:asc (默认)

​ 降序:desc

语法:

select * from table_name order by col {asc | desc}

案例:

select * from person;
+------+-----+
| name | age |
+------+-----+
| 剑姬 |  20 |
| 剑魔 |  50 |
| 剑圣 |  40 |
+------+-----+

select * from person order by age asc;
+------+-----+
| name | age |
+------+-----+
| 剑姬 |  20 |
| 剑圣 |  40 |
| 剑魔 |  50 |
+------+-----+

select * from person order by age desc;
+------+-----+
| name | age |
+------+-----+
| 剑魔 |  50 |
| 剑圣 |  40 |
| 剑姬 |  20 |
+------+-----+

2.6 limit {[offset,] row_count | row_countOFFSET offset}

limit 的主要功能将查询出来的数据就行分页

offset: 起始偏移量**(可以不写,默认为0)**

row_count: 显示行数

语法:

select * from person limit offset, row_count;

案例:

select * from person;
+------+-----+
| name | age |
+------+-----+
| 剑姬 |  20 |
| 剑魔 |  50 |
| 剑圣 |  40 |
+------+-----+

select * from person limit 0,2;
+------+-----+
| name | age |
+------+-----+
| 剑姬 |  20 |
| 剑魔 |  50 |
+------+-----+

select * from person limit 1,2;
+------+-----+
| name | age |
+------+-----+
| 剑魔 |  50 |
| 剑圣 |  40 |
+------+-----+

select * from person limit 2;
+------+-----+
| name | age |
+------+-----+
| 剑姬 |  20 |
| 剑魔 |  50 |
+------+-----+

2.7 GROUP BY 子句

group by 子句 用于分组查询,通常和聚合函数一起使用

2.7.1 常见的聚合函数

2.7.1.1 count()

count() 函数返回匹配指定条件的行数

语法:

COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入)
COUNT(*) 函数返回表中的记录数
COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目

案例:

select * from `option`;
+------------+-----------+
| first_name | last_name |
+------------+-----------+
|||
|||
|||
|||
|||
|||
|||
|||
+------------+-----------+

select count(first_name) from `option`;
+-------------------+
| count(first_name) |
+-------------------+
|                 8 |
+-------------------+

select count(*) from `option`;
+----------+
| count(*) |
+----------+
|        8 |
+----------+

select count(distinct first_name) from `option`;
+----------------------------+
| count(distinct first_name) |
+----------------------------+
|                          4 |
+----------------------------+
2.7.1.2 sum()

SUM 函数返回指定字段所有行的总和

注:指定字段的值必须是数

语法:

sum(col_name)

案例:

select * from person;
+------+-----+
| name | age |
+------+-----+
| 剑姬 |  20 |
| 剑魔 |  50 |
| 剑圣 |  40 |
+------+-----+

select sum(age) from person;
+----------+
| sum(age) |
+----------+
| 110      |
+----------+
2.7.1.3 avg()

avg函数 返回指定字段所有行的平均值。NULL 值不包括在计算中。

注:指定字段的值必须是数

2.7.1.4 min()

avg函数 返回一列中的最小值。NULL 值不包括在计算中。

注:指定字段的值必须是数

2.7.1.5 max()

avg函数 返回一列中的最大值。NULL 值不包括在计算中。

注:指定字段的值必须是数

2.7.2 group by 子句 的使用

语法:

group by col_name;

案例:

select * from heros;
+--------+------+------+
| name   | age  | type |
+--------+------+------+
| 剑姬   |   18 | 上单 |
| 剑魔   |  100 | 上单 |
| 佐伊   | 1000 | 中单 |
| 冰鸟   |  100 | 中单 |
| 剑圣   |   50 | 打野 |
| 阿木木 |   20 | 打野 |
| 卡莎   |   20 | ad   |
||   30 | ad   |
||   30 | 辅助 |
| 机器人 |   89 | 辅助 |
+--------+------+------+

select type, count(1) "英雄数量" from heros group by type;
+------+----------+
| type | 英雄数量 |
+------+----------+
| ad   |        2 |
| 上单 |        2 |
| 中单 |        2 |
| 打野 |        2 |
| 辅助 |        2 |
+------+----------+

2.8 having 子句

having 子句where 子句的功能相同,having子句一般用于分组后的条件筛选

2.9 联合查询

合并两个或多个 SELECT 语句的结果集

例子表:

hero
+---------+-----------+
| hero_id | hero_name |
+---------+-----------+
|       1 | 剑姬      |
|       2 | 剑圣      |
|       3 | 剑豪      |
|       4 | 剑魔      |
|       5 | 波比      |
|       6 | 艾克      |
|       7 ||
|       8 ||
|       9 | 佐伊      |
|      10 | 纳尔      |
|      11 | 岩雀      |
+---------+-----------+

midware
+---------+-------------+
| hero_id | position_id |
+---------+-------------+
|       1 |           1 |
|       2 |           2 |
|       3 |           3 |
|       4 |           1 |
|       5 |           2 |
|       6 |           2 |
|       7 |           5 |
|       8 |           4 |
|       9 |           3 |
|      10 |           1 |
+---------+-------------+

position
+-------------+---------------+
| position_id | position_name |
+-------------+---------------+
|           1 | 上单          |
|           2 | 打野          |
|           3 | 中单          |
|           4 | ad            |
|           5 | 辅助          |
+-------------+---------------+

2.9.1 inner join 内连接

仅显示两个表中匹配行,即两表中都有才显示。

语法:

select * from table_name1
inner jion table_name2
on 两表对应条件

案例:

select hero.hero_name,pos.position_name from hero
inner join midware mid
on hero.hero_id=mid.hero_id
inner join position pos
on mid.position_id=pos.position_id;
+-----------+---------------+
| hero_name | position_name |
+-----------+---------------+
| 剑姬      | 上单          |
| 剑圣      | 打野          |
| 剑豪      | 中单          |
| 剑魔      | 上单          |
| 波比      | 打野          |
| 艾克      | 打野          |
|| 辅助          |
|| ad            |
| 佐伊      | 中单          |
| 纳尔      | 上单          |
+-----------+---------------+

2.9.2 out join 外连接

2.9.2.1 left join 左外连接

从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。

语法:

select * from table_name1
left jion table_name2
on 两表对应条件

案例:

select hero.hero_name,pos.position_name from hero
left join midware mid
on hero.hero_id=mid.hero_id
left join position pos
on mid.position_id=pos.position_id;
+-----------+---------------+
| hero_name | position_name |
+-----------+---------------+
| 剑姬      | 上单          |
| 剑圣      | 打野          |
| 剑豪      | 中单          |
| 剑魔      | 上单          |
| 波比      | 打野          |
| 艾克      | 打野          |
|| 辅助          |
|| ad            |
| 佐伊      | 中单          |
| 纳尔      | 上单          |
| 岩雀      | NULL          |
+-----------+---------------+
2.9.2.2 right join 右外连接

从右表 (table_name2) 那里返回所有的行,即使在右表 (table_name1) 中没有匹配的行。

语法:

select * from table_name1
right jion table_name2
on 两表对应条件
select hero.hero_name,pos.position_name from hero
right join midware mid
on hero.hero_id=mid.hero_id
right join position pos
on mid.position_id=pos.position_id;
+-----------+---------------+
| hero_name | position_name |
+-----------+---------------+
| 剑姬      | 上单          |
| 剑魔      | 上单          |
| 纳尔      | 上单          |
| 剑圣      | 打野          |
| 波比      | 打野          |
| 艾克      | 打野          |
| 剑豪      | 中单          |
| 佐伊      | 中单          |
|| ad            |
|| 辅助          |
+-----------+---------------+

3 配套SQL文件

SQL文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学编程的小猫猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值