DQL(Data Query Language,数据查询语言) 是 SQL 的一个子集,专门用于从数据库中查询数据。DQL 的核心语句是 `SELECT`,它允许用户从表中检索数据,并支持多种复杂的查询操作。
以下是 DQL 语句 的详细介绍,包括基本语法、常用操作和示例。
目录
1. 基本语法
SELECT 语句的基本语法如下:
SELECT column1, column2, ...
FROM table_name
[WHERE condition]
[GROUP BY column]
[HAVING condition]
[ORDER BY column [ASC|DESC]]
[LIMIT number];
参数说明:
SELECT:指定要查询的列,可以使用 `*` 表示所有列。
FROM:指定要查询的表。
WHERE:过滤条件,用于筛选符合条件的行。
GROUP BY:按指定列分组,通常与聚合函数一起使用。
HAVING:对分组后的结果进行过滤。
ORDER BY:按指定列排序,`ASC` 表示升序(默认),`DESC` 表示降序。
LIMIT:限制返回的行数。
2. 常用操作
(1) 基本查询
查询表中的所有列:
SELECT * FROM mytable;
查询特定列:
SELECT name, age FROM mytable;
(2) 条件查询(WHERE)
查询满足条件的行:
SELECT * FROM mytable WHERE age > 18;
支持多种条件运算符:
- 比较运算符:`=`, `!=`, `>`, `<`, `>=`, `<=`
- 逻辑运算符:`AND`, `OR`, `NOT`
- 范围查询:`BETWEEN ... AND ...`
- 模糊查询:`LIKE`
- 空值查询:`IS NULL`, `IS NOT NULL`
示例:
- 查询年龄在 18 到 25 岁之间的用户:
SELECT * FROM mytable WHERE age BETWEEN 18 AND 25;
- 查询名字以 "A" 开头的用户:
SELECT * FROM mytable WHERE name LIKE 'A%';
- 查询邮箱为空的用户:
SELECT * FROM mytable WHERE email IS NULL;
(3) 排序(ORDER BY)
ASC:升序; DESC:降序;
按指定列排序:
SELECT * FROM mytable ORDER BY age DESC;
多列排序:
SELECT * FROM mytable ORDER BY age DESC, name ASC;
(4) 分组(GROUP BY)
按指定列分组,通常与聚合函数一起使用:
SELECT age, COUNT(*) FROM mytable GROUP BY age;
常用聚合函数:
- COUNT():统计行数。
- SUM():求和。
- AVG():求平均值。
- MAX():求最大值。
- MIN():求最小值。
示例:
- 统计每个年龄的用户数量:
SELECT age, COUNT(*) AS user_count FROM mytable GROUP BY age;
- 计算每个部门的平均工资:
SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department;
(5) 分组后过滤(HAVING)
对分组后的结果进行过滤:
SELECT age, COUNT(*) FROM mytable GROUP BY age HAVING COUNT(*) > 10;
示例:
- 查询用户数量大于 10 的年龄:
SELECT age, COUNT(*) AS user_count
FROM mytable
GROUP BY age
HAVING user_count > 10;
(6) 限制结果集(LIMIT)
限制返回的行数:
SELECT * FROM mytable LIMIT 10;
分页查询:
SELECT * FROM mytable LIMIT 10 OFFSET 20; -- 跳过前 20 行,返回接下来的 10 行
3. 高级查询
(1) 连接查询(JOIN)
连接多个表进行查询:
- INNER JOIN:内连接,返回匹配的行。
- LEFT JOIN:左连接,返回左表的所有行和右表匹配的行。
- RIGHT JOIN:右连接,返回右表的所有行和左表匹配的行。
- FULL JOIN:全连接,返回所有匹配和不匹配的行(MySQL 不支持,但可以通过 UNION 实现)。
示例:
- 查询用户及其订单信息:
SELECT u.name, o.order_id
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
- 查询所有用户及其订单信息(包括没有订单的用户):
SELECT u.name, o.order_id
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
(2) 子查询
在查询中嵌套另一个查询:
SELECT name FROM mytable WHERE age = (SELECT MAX(age) FROM mytable);
示例:
- 查询工资高于平均工资的员工:
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
(3) 联合查询(UNION)
合并多个查询的结果集:
SELECT name FROM table1
UNION
SELECT name FROM table2;
示例:
- 查询两个表中的所有用户:
SELECT name FROM users1
UNION
SELECT name FROM users2;
4. 常用函数
(1) 字符串函数
- `CONCAT()`:连接字符串。
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
- `SUBSTRING()`:截取字符串。
- `LENGTH()`:返回字符串长度。
(2) 日期函数
- `NOW()`:返回当前日期和时间。
- `DATE()`:提取日期部分。
- `DATEDIFF()`:计算日期差。
(3) 数学函数
- `ROUND()`:四舍五入。
- `ABS()`:返回绝对值。
5.考试中出现的DQL语句:
SELECT dname FROM tb_department,tb_employee
WHERE tb_department.dno=tb_employee.dno
GROUP BY dname HAVING count(dname) >=3;
SELECT ename,birthday FROM tb_employee
WHERE year(birthday) = 1985
ORDER BY birthday;
SELECT s_sex,count(*) FROM tb_student
GROUP BY s_sex;
SELECT s.s_name ,sc.s_score FROM tb_student s
JOIN tb_score sc ON s.s_id=sc.s_id
JOIN tb_course c ON sc.c_id=c.c_id
WHERE c.c_name = 'PHP程序设计' AND sc.s_score<60;