MySQL 数据库查询语言(DQL)
1. 顺序
1.1 语法顺序
# SELECT 语句由子句构成, 最重要的子句有:
SELECT columns_name --查找一列或多列,多列之间用逗号隔开
FROM Table --目标表
WHERE condition --过滤条件
GROUP BY columns_name --按列值分组,可以 1 个或多个列
HAVING condition --分组后的筛选条件,HAVING 与 WHERE 区别在于前者表达式中可包含函数
ORDER BY columns_name --按列排序
LIMIT start, row_count --对结果进行限定,start 表示从哪行开始,row_count 表示结果行数
这些总是使用这个顺序。
1.2 执行顺序
FROM
WHERE
GROUP BY
HAVING
SELECT
DISTINCT
UNION
ORDER BY
2. 语法及示例
SELECT 语句
多列查询
SELECT [DISTINCT] <目标列组>
FROM <数据源>
[WHERE <元组选择条件>]
[GROUP BY <分列组[HAVING <组选择条件>]]
[ORDER BY <排序 1列<排序 2列>]
# 例子
SELECT FirstName, LastName, OrderDate
FROM Orders WHERE OrderDate '10/10/2010'
# 去重
SELECT DISTINCT FirstName FROM Orders
SELECT *
会增加很多不必要的消耗(CPU、IO、内存、带宽)
从第一行开始选择一共五行数据
SELECT FirstName FROM Orders limt 5 offset 1;
排序
# 语法
SELECT co_name1,col_name2
FROM table_name
ORDER BY col_name1 DESC,col_name2 ASC
#例子
SELECT ,FirstName
FROM Orders
ORDER BY OrderDate DESC
常用条件过滤
# 范围内检查
SELECT col_name FROM table_name WHERE col_name BETEWEEN 5 AND 10;
# 空值检查
SELECT col_name FROM table_name WHERE col_name IS null;
# in 操作符
SELECT col_name FROM table_name WHERE col_name IN (....);
# NOT 操作符
SELECT col_name FROM table_name WHERE NOT (条件);
# AND 和 OR 注意优先级 and 优先级高于 or
SELECT col_name FROM table_name
WHERE (condi_1 OR condi_2) AND condi_3;
# 使用通配符进行过滤
SELECT col_name FROM table_name WHERE col_name like '..%..';
SELECT col_name FROM table_name WHERE col_name like '.._..';
SELECT col_name FROM table_name WHERE col_name like '[]%';
分组并按条件筛选
# 语法
SELECT <Column List>, <Aggregate Function>(<Column Name>)
FROM <Table Name>
WHERE <Search Condition>
GROUP BY <Column List>
# 例子
SELECT LastName, SUM(OrderValue)
FROM Orders
WHERE OrderDate '10/10/2010'
GROUP BY LastName
注意:
GROUP BY 后面也可以接条件。
WHERE 语句和 HAVING配合的使用。WHERE在 HAVING之前。
WHERE 过滤针对的是行,HAVING过滤针对的是组。
分组和排序的顺序
/*
SELECR
FROM
WHERE
GROUP BY
HAVING
ORDER BY
*/
SELECT col_name FROM table_name
WHERE <condition_1>
GROUP BY <col_name>
HAVING <condition_2>
ORDER BY <col_name>
子查询
写在 ()
中,把内层查询结果当做外层查询参照的数据表来用。
SELECT col_name FROM table_name
WHERE col_name =
(SELECT col_name FROM table_name WHERE .... );
一些小例子
-- 用 and 操作符查询 s_id 为 101 并且 f_id 为 a1 的水果记录
select * from fruits
where s_id = 101 and f_id = 'a1';
-- 用 or 操作符查询苹果或者橙子的相关记录
select * from fruits
where f_name = 'apple' or f_name = 'orange';
-- 用 in 操作符查询苹果和橙子的相关记录
select * from fruits
where f_name in('apple','orange');
-- 用 not in 操作符查询苹果和橙子之外的水果的相关记录
select * from fruits
where f_name not in('apple','orange');
-- 用 between...and 操作符查询 f_price 在 10 元到 20 元之间的水果记录
select * from fruits
where f_price between 10 and 20;
-- 用 like 操作符查询所有 f_name 由 a 开始的水果记录
select * from fruits
where f_name like 'a%';
-- 用 like 操作符查询所有 f_id 由 b 开始且字符长度为两位的水果记录
select * from fruits
where f_id like 'b_';
-- 用 is null 操作符查询所有 f_name 为空的水果记录
select * from fruits
where f_name is null;
-- 查询 fruits 表中所有不重复的 s_id
select distinct s_id from fruits;
-- 用 any 操作符与子查询语句来查询所有 f_id 对应的 f_price 在 10 元到 20 元之间的水果记录
select * from fruits where f_id = any
(select f_id from fruits where f_price between 10 and 20);
-- 用 all 操作符与子查询语句来查询所有 f_price 大于 20 元的水果记录
select * from fruits where f_price all
(select f_price from fruits where f_price <= 20);
-- 用 exists 操作符与子查询语句来查询是否存在 f_price 大于 30 元的水果记录
select * from fruits where exists
(select * from fruits where f_price 30);
-- 用 as 将 fruits 表名重命名为 f 后使用
select f.* from fruits as f;
-- 显示 f_price 金额最大的前三名水果记录
select * from fruits
order by f_price desc
limit 3;
表的连接查询
# 语法
SELECT <Column List>
FROM <Table1JOIN <Table2>
ON <Table1>.<Column1= <Table2>.<Column1>、
# 示例
SELECT Orders.LastName, Countries.CountryName
FROM Orders INNER JOIN Countries ON
Orders.CountryID = Countries.ID
除此之外还有:
左联结 LEFT JOIN
右联结 RIGHT JOIN
全联结 FULL JOIN
联合查询
# 语法
SELECT <Column ListFROM <Table1>
UNION
SELECT <Column ListFROM <Table2>
# 示例
SELECT <Column ListFROM <Table1>
UNION
SELECT <Column ListFROM <Table2>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论