DQL没有条件的简单查询

-- 查询表中所有数据
SELECT 字段名1, 字段名2, ... FROM 表名;
SELECT * FROM 表名;
-- 查询表中指定列数据
SELECT 字段名1, 字段名2 FROM 表名;
-- 别名查询
SELECT 字段名1 AS 别名, 字段名2 AS 别名... FROM 表名;
SELECT 字段名1 别名, 字段名2 别名... FROM 表名;
SELECT 字段名1 AS 别名, 字段名2 AS 别名... FROM 表名 AS 表别名;
SELECT 字段名1 别名, 字段名2 别名... FROM 表名 表别名;
-- 清除重复值
SELECT DISTINCT 字段名,字段名,.. FROM 表名;

注意:
DISTINCT重复值判断是判断每个字段的值是否都相同,如果都相同则重复,如果有一个及以上字段值不同则不重复

DQL查询结果参与运算

-- 某列数据和固定值运算
SELECT 列名1 + 固定值 FROM 表名;
-- 某列数据和其他列数据参与运算
SELECT 列名1 + 列名2 FROM 表名;

注意:
参与运算的必须是数值类型

DQL条件查询

-- 条件查询
SELECT 字段名... FROM 表名 WHERE 条件;

比较运算符

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

SELECT * FROM student WHERE math>80;

逻辑运算符

and(&&) 多个条件同时满足 一假即假
or(||) 多个条件其中一个满足 一真即真
not(!) 不满足 取反

SELECT * FROM student WHERE age>35 AND sex='男';

in关键字

in里面的每个数据都会作为一次条件,只要满足条件的就会显示

SELECT * FROM 表名 WHERE 字段 in (值1, 值2, 值3);

范围

SELECT * FROM student WHERE age BETWEEN 值1 AND 值2

注意:
age BETWEEN 80 AND 100 相当于 age>=80 && age<=100

DQL模糊查询

SELECT * FROM 表名 WHERE 字段名 LIKE '通配符字符串';

通配符

%: 表示零个一个多个字符(任意多个字符)
_: 表示一个字符

DQL查询结果排序

SELECT 字段 FROM 表名 ORDER BY 排序的字段 [ASC|DESC];

参数说明

ASC:升序排序(默认)
DESC:降序排序
-- 单列排序
SELECT * FROM student ORDER BY age DESC;
-- 多列排序
SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名1 [ASC|DESC], 字段名2 [ASC|DESC];

DQL聚合函数

聚合函数分类及作用

count:在根据指定的列统计的时候,如果这一列中有null的行,该行 不会被统计在其中。按照列去统计有多少行数据。
sum: 计算指定列的数值和,如果不是数值类型,那么计算结果为0
max: 计算指定列的最大值
min: 计算指定列的最小值
avg: 计算指定列的平均值

使用

SELECT 聚合函数(字段) FROM 表名;

注意:

  1. 在mysql中null值和任何值相加为null
  2. 在sql语句中我们可以使用数据库提供的函数ifnull(列名, 默认值)来解决上述问题

DQL查询分组

SELECT ... FROM ... GROUP BY 列名,列名...

注意:

  1. having必须和group by 一起使用
  2. having和where的用法一模一样,where怎么使用having就怎么使用
  3. where不能使用的,having也可以使用
  4. where后面不可以使用聚合函数
  5. having后面可以使用聚合函数

DQL分页查询

SELECT * FROM 表名 LIMIT offset,row_count;

参数说明

offset:分页查询的索引,对应数据表第offset条数据
row_count:表示每页显示row_count条数据

示例

-- 第一页: LIMIT 0,5;	跳过0条,显示5条
SELECT * FROM student LIMIT 0,5;
-- 第二页: LIMIT 5,5;  	跳过5条,显示5条
SELECT * FROM student LIMIT 5,5;
-- 第三页: LIMIT 10,5; 	跳过10条,显示5条
SELECT * FROM student LIMIT 10,5;

注意:

如果第一个参数是0可以简写:
SELECT * FROM student LIMIT 0,5;
SELECT * FROM student LIMIT 5;
LIMIT 10,5; -- 不够5条,有多少显示多少

DQL多表查询

表连接查询

内连接
什么是内连接

用左边表的记录去匹配右边表的记录,如果符合条件的则显示。

内连接查询的结果:两表的公共部分。

image-upqh.png

隐式内连接

看不到JOIN关键字,条件使用WHERE指定

SELECT 列名 , 列名 .... FROM 表名1,表名2,.... WHERE 表名1.列名 = 表名2.列名;
显式内连接

使用INNER JOIN ... ON语句, 可以省略INNER

-- 两张表连接
SELECT * FROM 表名1 JOIN 表名2 ON 条件
-- 两张以上表连接
SELECT * FROM 表名1 INNER JOIN 表名2 INNER JOIN 表名3 INNER JOIN 表名4 ..... ON 多个条件;
左外连接
什么是左外连接

用左边表去右边表中查询对应记录,不管是否找到,都将显示左边表中全部记录。

image-gjcp.png

用法

使用LEFT OUTER JOIN ... ONOUTER可以省略

SELECT * FROM 表1 LEFT OUTER JOIN 表2 ON 条件;
右外连接
什么是右外连接

用右边表去左边表查询对应记录,不管是否找到,右边表全部记录都将显示。

image-poaf.png

用法

使用RIGHT OUTER JOIN ... ONOUTER可以省略

SELECT * FROM 表1 RIGHT OUTER JOIN 表2 ON 条件;
注意

注意:

左外连接和右外连接均以LEFT/RIGHT OUTER JOIN作为分界,左边的为左表,右边的为右表

子查询

什么是子查询

一条查询语句的结果作为另一条查询语句的一部分。

子查询结果单行单列
SELECT 查询字段 FROM 表 WHERE 字段=(子查询);
子查询结果多行单列
SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询);
子查询结果多行多列
SELECT 查询字段 FROM (子查询) 表别名 WHERE 条件;

注意:

当查询结果是多行多列时,通常将查询结果作为表进行连接查询