DQL(Data Query Language 数据库查询语言)
SELECT * FROM t_student
WHERE name = 'Changed'
ORDER BY age ASC
select语句执行顺序
from --> where --> select --> order by
简单查询
查询全部数据
SELECT * FROM t_student
查询指定列
SELECT name,age FROM t_student
指定别名
SELECT name AS 姓名,age AS 年龄 FROM t_student
查询单条数据,去除重复数据,DISTINCT
SELECT DISTINCT name FROM t_student
#需求:查询所有货品的id,名称和批发价,批发价=卖价*折扣
SELECT id , productName , salePrice * cutoff FROM product
#需求:查询所有货品的id,名称,和各进50个的成本价(成本=costPrice)
SELECT id , productName, costPrice * 50 FROM product
#需求:查询所有货品的id,名称,各进50个,并且每个运费1元的成本
SELECT id,productName, (costPrice + 1)* 50 FROM product
#需求:修改别名,AS可省略,别名使用有意义的英文单词
SELECT id,productName, (costPrice + 1)* 50 AS PF FROM product
条件查询
SELECT * FROM t_student WHERE age > 20
WHERE:指定查询条件
年龄 > 20,相应的有 < ,!=,<=,>=,=
SELECT * FROM t_student WHERE age > 20
#需求:查询id,货品名称,批发价大于350的货品
SELECT id,productName,salePrice * cutoff FROM product WHERE salePrice * cutoff > 350
逻辑查询
关键字:AND,OR,NOT
SELECT * FROM t_student WHERE age > 20 AND `name` = 'Demo'
SELECT * FROM t_student WHERE age > 20 OR `name` = 'Demo'
SELECT * FROM t_student WHERE NOT age > 20
模糊查询
SELECT * FROM t_student WHERE name LIKE '%C%'
LIKE 执行通配查询,查询条件包含文字,数字。
通配符
% :表示零个或多个任意字符。
_ :表示一个字符。
没有用通配符LIKE 相当于 =
结果集排序
SELECT * FROM t_student ORDER BY age DESC
ASC:升序
DESC:降序
注意
ORDER BY,出现在SELECT 语句的最后。
分页查询
假分页(内存分页)
所有数据都已在内存中,只是部分显示。
优点:每次翻页时都从内存中读取数据,翻页速度极快,简单。
缺点:消耗内存大,容易内存溢出。真分页(数据库分页)
每次翻页都会去数据库查询数据。
优点:不会造成内存溢出(每次30-50条数据)。
缺点:翻页比较慢,复杂。
SELECT * FROM product LIMIT 5,5
LIMIT 5,5 计算公式
参数1:表示开始取值的索引从0开始,startIndex = (n-1) * pagerSize
参数2:表示每页最多显示的记录数,pagerSize
第N页:(n-1) * pagerSize,pagerSize
聚合/分组函数
聚合函数
聚合函数 | 功能 |
---|---|
COUNT() | 统计此列数据个数 |
MAX() | 计算最大值 |
MIN() | 计算最小值 |
SUM() | 计算两个数的和 |
AVG() | 计算平均值 |
聚合函数作用于一条数据,并对一组数据返回一条记录
SELECT COUNT(name) as 学生人数 FROM t_student
SELECT MAX(age) as 最大年龄 FROM t_student
SELECT AVG(age) as 平均年龄 FROM t_student
分组函数
查询学生平均年龄,按性别分类
SELECT AVG(age) FROM t_student GROUP BY sex
GROUP BY会将表查询的数据分成小组
#需求:查询产品表中每种分类零售价的平均值并且平均值大于300
SELECT AVG(salePrice) FROM product
GROUP BY dir_id
HAVING
AVG(salePrice) > 300
#需求:查询产品表中每种分类零售价大于100并且平均值大于400
SELECT AVG(salePrice) FROM product
WHERE salePrice > 100
GROUP BY dir_id
HAVING
AVG(salePrice) > 400
SQL的执行顺序
where --> group by --> having --> order by
多表查询
分表操作
在数据库中,每张表存储的事物要为同一类型,不同类型要分表存储,类似于Java的类,不同的事物定义不同的类。
如公司员工信息(姓名,年龄,性别,工作号)可作为一张表描述,而员工所属的部门信息就要作为另一张表描述。
笛卡尔积问题
多表查询时,没有连接条件的表,查询返回的结果会产生笛卡尔积问题。
即查询后,得到的数据是两个表数据的乘积。
假设:集合A = {a,b},集合B = {0,1,2}。
查询后的笛卡尔积:{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。
解决方案
在where 中加入有效的连接条件
内外连接查询
- 内连接查询:返回结果是多张表交集部分的数据。
- 外连接查询:返回结果是多张表并集的数据。
内连接查询
隐式内链接
select * from A,B WHERE A.id = B.cid
, 替换成JOIN
WHERE替换成ON
注意:ON 只能写等值连接条件
显式内连接
select * from A join B on A.id = B.cid
两种查询效果相同,仅仅是语法不同,不过推荐使用显式内连接查询
外连接查询
外连接查询
select * from A left join B on A.主键 = B.外键
select * from A right join B on A.主键 = B.外键
自连接查询
自连接查询:把一张表看成两张做查询。
SELECT child.id , child.dirName , child.parent_id
FROM productdir child LEFT JOIN productdir parent
ON child.id = parent.parent_id