Mysql教程(五):DQL学习

Mysql教程(五):DQL学习

DQL Data Query Language 数据查询语言,用来查询数据库中表的记录

1 基本语法

DQL查询语句,语法结构如下:

sql 复制代码
SELECT
	字段列表
FROM
	表名列表
WHERE
	条件列表
GROUP BY
	分组字段列表
HAVING
	分组后条件列表
ORDER BY
	排序字段列表
LIMIT
	分页参数

分为以下几个部分:

  • 基本查询(不带任何条件)
  • 条件查询(WHERE)
  • 聚合函数(count、max、min、avg、sum)
  • 分组查询(group by)
  • 排序查询(order by)
  • 分页查询(limit)

2 基本查询

查询多个字段

sql 复制代码
SELECT 字段1, 字段2, 字段3... FROM 表名;
SQL 复制代码
SELECT * FROM 表名;

注意:*代表查询所有字,在实际开发中尽量少用(不直观,影响效率)

字段设置别名

sql 复制代码
SELECT 字段1 [ AS 别名1 ] , 字段2 [ AS 别名2 ] ... FROM 表名;

AS也可以省略:

sql 复制代码
SELECT 字段1 [ 别名1 ] , 字段2 [ 别名2 ] ... FROM 表名;

去除重复记录

sql 复制代码
SELECT DISTINCT 字段列表 FROM 表名;

案例

A. 查询指定字段 name,workno,age并返回

sql 复制代码
select name, worknum, age from empolyee;

B. 查询员工的身份证号,起别名

sql 复制代码
SELECT name, idcard '身份证号' FROM empolyee;

C. 查询员工的年龄有哪些,不重复

sql 复制代码
SELECT DISTINCT age '年龄' FROM empolyee;

3 条件查询

语法

sql 复制代码
SELECT 字段列表 FROM 表名 WHERE 条件列表;

条件

常用比较运算法

比较运算法 功能
> 大于
>= 大于等于
< 小于
<= 小于等于
= 等于
<> 或 != 不等于
BETWEEN ... AND ... 在某个范围之内(含最小、最大值)
IN(...) 在in之后的列表中的值,多选
LIKE 占位符 模糊匹配(_匹配单个字符, %匹配任意个字符)
IS NULL 是NULL

常用的逻辑运算符

逻辑运算符 功能
AND 或 && 并且(多个条件同时成立)
OR 或 || 或者(多个条件任意一个成立)
NOT 或 ! 非, 不是

案例

查询年龄等于21的员工信息

sql 复制代码
SELECT * FROM empolyee WHERE age=21;

查询年龄大于21的员工信息

sql 复制代码
SELECT * FROM empolyee WHERE age>21;

查询身份证号为空的员工信息

sql 复制代码
SELECT * FROM empolyee WHERE idcard IS NULL;

查询身份证号不为空的员工信息

sql 复制代码
SELECT * FROM empolyee WHERE idcard IS NOT NULL;

查询年龄不等于21的员工信息

sql 复制代码
SELECT * FROM empolyee WHERE age != 21;

查询年龄大于等于22并且小于等于24的员工信息

sql 复制代码
SELECT * FROM empolyee WHERE age>=22 && age<=24;

SELECT * FROM empolyee WHERE age>=22 AND age<=24;

# BETWEEN后跟的是最小值,AND后跟的是最大值,切不可写反了
SELECT * FROM empolyee WHERE age BETWEEN 22 AND 24;

查询年龄为24并且性别为女的员工信息

sql 复制代码
SELECT * FROM empolyee WHERE age=24 AND gender='女';

查询年龄为24或者21员工信息

sql 复制代码
SELECT * FROM empolyee WHERE age=24 OR age=21;

SELECT * FROM empolyee WHERE age IN (21, 24);

查询姓名为两个字员工信息

sql 复制代码
SELECT * FROM empolyee WHERE name like '__';

查询身份证号最后一位是X的员工信息

sql 复制代码
SELECT * FROM empolyee WHERE idcard LIKE '%X';

SELECT * FROM empolyee WHERE idcard LIKE '_________________X';

4 聚合函数

什么是聚合函数?

将一列数据作为一个整体,进行纵向计算 。

常见的聚合函数

函数 功能
count 统计数量
max 最大值
min 最小值
avg 平均值
sum 求和

语法

sql 复制代码
SELECT 聚合函数(字段列表) FROM 表名 ;

注意:NULL值是不参与所有聚合函数运算的。

案例

A.统计员工数量

sql 复制代码
SELECT COUNT(*) FROM empolyee;

SELECT COUNT(idcard) FROM empolyee;

B.统计员工的平均年龄

sql 复制代码
SELECT AVG(age) FROM empolyee;

C.统计员工最大年龄

sql 复制代码
SELECT MAX(age) FROM empolyee;

D.统计员工最小年龄

sql 复制代码
SELECT MIN(age) FROM empolyee;

E.统计男员工的年龄之和

sql 复制代码
SELECT SUM(age) FROM empolyee WHERE gender = '男';

5 分组查询

语法

sql 复制代码
SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组后过滤条件 ];

where和having区别

  • 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;
  • 而having是分组 之后对结果进行过滤。 判断条件不同:where不能对聚合函数进行判断,而having可以。

注意:

  • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
  • 执行顺序: where > 聚合函数 > having
  • 支持多字段分组, 具体语法为 : group by columnA,columnB

A.根据性别分组 , 统计男性员工 和 女性员工的数量

sql 复制代码
SELECT gender, COUNT(*) FROM empolyee GROUP BY gender;

B.根据性别分组 , 统计男性员工 和 女性员工的平均年龄

sql 复制代码
SELECT gender, AVG(age) FROM empolyee GROUP BY gender;

C.查询年龄小于45的员工,并根据工作地址分组,获取员工数量大于等于2的工作地址

sql 复制代码
SELECT workaddress, count(*) address_count
FROM empolyee
WHERE age < 45
GROUP BY workaddress
HAVING address_count >= 2;

D.统计各个工作地址上班的男性及女性员工的数量

sql 复制代码
SELECT workaddress, gender, count(*) '数量'
FROM empolyee
GROUP BY gender , workaddress;

6 排序查询

语法

sql 复制代码
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2 ;

排序方式

  • ASC:升序(默认值)
  • DESC:降序

注意:

如果是升序,可以不指定排序方式ASC

如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
案例:

A.根据年龄对员工进行升序排序

sql 复制代码
SELECT * FROM empolyee ORDER BY age ASC;

SELECT * FROM empolyee ORDER BY age;

B. 根据入职时间对员工进行降序排序

sql 复制代码
SELECT * FROM empolyee ORDER BY entrydate DESC;

C. 根据年龄对员工进行升序排序,如果年龄相同,按照入职时间进行降序排序

sql 复制代码
SELECT * FROM empolyee ORDER BY age ASC , entrydate DESC;

7 分页查询

语法

sql 复制代码
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;

注意事项:

  • 起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数。
  • 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
  • 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。
    案例

A. 查询第1页员工数据,每页展示10条记录

sql 复制代码
SELECT * FROM empolyee LIMIT 0, 5;

SELECT * FROM empolyee LIMIT 5;

B. 查询第2页员工数据,每页展示10条记录 ------> (页码-1)*页 展示记录数

sql 复制代码
SELECT * FROM empolyee LIMIT 5, 5;

8 案例

查询年龄为20, 21, 22,23的女员工

sql 复制代码
SELECT * FROM empolyee 
WHERE gender='女' 
AND age in (20,21,22,23);

查询性别为 男,并且年龄在22-23之间的姓名为2个字的员工

sql 复制代码
SELECT * FROM empolyee 
		WHERE gender='男' 
		AND age 
		BETWEEN 22 AND 23 
		AND name LIKE '__';

查询员工年龄小于60的,男性员工和女性员工的人数

sql 复制代码
SELECT gender, COUNT(*) FROM empolyee 
						WHERE age < 60 
						GROUP BY gender;

查询年龄小于等于35岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按照入职时间降序排序

sql 复制代码
SELECT name, age FROM empolyee 
                 WHERE age <= 35 
                 ORDER BY age ASC, entrydate DESC;

查询性别为男,年龄在20-40之间以内的5个员工信息,对结果按照年龄升序排序,年龄相同按照入职时间升序排序

sql 复制代码
SELECT * FROM empolyee 
         WHERE gender='男' AND 
               age BETWEEN 20 AND 40 
         ORDER BY age ASC, entrydate DESC LIMIT 5;

9 执行顺序

相关推荐
momo小菜pa9 小时前
【MySQL 06】表的增删查改
数据库·mysql
程序员大金12 小时前
基于SpringBoot+Vue+MySQL的装修公司管理系统
vue.js·spring boot·mysql
gorgor在码农12 小时前
Mysql 索引底层数据结构和算法
数据结构·数据库·mysql
-seventy-12 小时前
SQL语句 (MySQL)
sql·mysql
一般路过糸.13 小时前
MySQL数据库——索引
数据库·mysql
无敌少年小旋风14 小时前
MySQL 内部优化特性:索引下推
数据库·mysql
翔云12345614 小时前
MVCC(多版本并发控制)
数据库·mysql
静听山水15 小时前
mysql语句执行过程
数据库·mysql
Q_w774216 小时前
一个真实可用的登录界面!
javascript·mysql·php·html5·网站登录
容器( ु⁎ᴗ_ᴗ⁎)ु.。oO17 小时前
MySQL事务
数据库·mysql