来源:牛客网
1、SQL 基础查询
在 SQL 中,SELECT 语句是最基本的查询语句,用于从数据库表中检索数据。通过 SELECT 语句,可以选择表中的所有列或特定列,并根据需要进行过滤和排序。
基本语法
SELECT 语句的基本语法如下:
SELECT column1, column2, ...
FROM table_name;
其中:
column1, column2, ...:指定要查询的列名,可以是表中的具体列名或表达式。table_name:指定要查询的表名。
查询所有列
使用 * 通配符查询表中的所有列:
SELECT * FROM table_name;
此语句会返回 table_name 表中的所有列和所有行。
查询特定列
明确指定列名查询表中的特定列:
SELECT first_name, last_name, salary
FROM table_name;
此语句会返回 table_name 表中的 first_name、last_name 和 salary 列的所有行。
使用别名
为列或表指定别名,使查询结果更易读:
SELECT first_name AS name, last_name AS surname, salary
FROM table_name AS tn;
此语句会将 first_name 和 last_name 列分别重命名为 name 和 surname,同时将表 table_name 重命名为 tn。
示例
假设 employees 表的数据如下:
| employee_id | first_name | last_name | salary | department_id |
|---|---|---|---|---|
| 1 | Alice | Smith | 60000 | 101 |
| 2 | Bob | Johnson | 70000 | 101 |
| 3 | Charlie | Brown | 50000 | 102 |
查询所有列
SELECT * FROM employees;
结果:
| employee_id | first_name | last_name | salary | department_id |
|---|---|---|---|---|
| 1 | Alice | Smith | 60000 | 101 |
| 2 | Bob | Johnson | 70000 | 101 |
| 3 | Charlie | Brown | 50000 | 102 |
查询特定列
SELECT first_name, last_name, salary FROM employees;
结果:
| first_name | last_name | salary |
|---|---|---|
| Alice | Smith | 60000 |
| Bob | Johnson | 70000 |
| Charlie | Brown | 50000 |
使用别名
SELECT first_name AS fname, last_name AS lname FROM employees;
结果:
| fname | lname |
|---|---|
| Alice | Smith |
| Bob | Johnson |
| Charlie | Brown |
2、简单处理查询结果
前面章节中的SELECT语句都是返回所有匹配的行。但是如果想对结果进行简单处理,可以通过以下方法实现:
查询结果的过滤
使用WHERE子句可以根据条件过滤查询结果。
语法:
SELECT column1, column2, ...
FROM table_name
WHERE condition;
condition:限制条件。
查询结果的排序
使用ORDER BY子句可以根据指定的列对查询结果进行排序。
语法:
SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...;
column1 [ASC|DESC]:按照column1[升序|降序]进行排序,若不加ASC或DESC则默认升序。
查询结果的去重
使用DISTINCT关键字可以去除查询结果中的重复行。
语法:
SELECT DISTINCT column1, column2, ...
FROM table_name;
对column1, column2, ...列中的重复行进行去除。
查询结果的限制
在某些数据库系统中,可以使用LIMIT子句限制查询结果的行数。
语法:
SELECT column1, column2, ...
FROM table_name
LIMIT n;
限制输出n行。
示例
假设employees表的数据如下:
| employee_id | first_name | last_name | salary | department_id |
|---|---|---|---|---|
| 1 | Alice | Smith | 60000 | 101 |
| 2 | Bob | Johnson | 70000 | 101 |
| 3 | Charlie | Brown | 50000 | 102 |
| 4 | David | Davis | 80000 | 102 |
| 5 | Eve | White | 90000 | 103 |
查询结果的过滤
查询employees表中工资大于60000的员工。
SELECT *
FROM employees
WHERE salary > 60000;
结果:
| employee_id | first_name | last_name | salary | department_id |
|---|---|---|---|---|
| 2 | Bob | Johnson | 70000 | 101 |
| 4 | David | Davis | 80000 | 102 |
| 5 | Eve | White | 90000 | 103 |
查询结果的排序
查询employees表中的所有员工,并按工资降序排序。
SELECT *
FROM employees
ORDER BY salary DESC;
结果:
| employee_id | first_name | last_name | salary | department_id |
|---|---|---|---|---|
| 5 | Eve | White | 90000 | 103 |
| 4 | David | Davis | 80000 | 102 |
| 2 | Bob | Johnson | 70000 | 101 |
| 1 | Alice | Smith | 60000 | 101 |
| 3 | Charlie | Brown | 50000 | 102 |
查询结果的去重
查询employees表中所有(不重复)的部门ID。
SELECT DISTINCT department_id
FROM employees;
结果:
| department_id |
|---|
| 101 |
| 102 |
| 103 |
查询结果的限制
查询employees表中工资最高的3名员工。
SELECT *
FROM employees
ORDER BY salary DESC
LIMIT 3;
结果:
| employee_id | first_name | last_name | salary | department_id |
|---|---|---|---|---|
| 5 | Eve | White | 90000 | 103 |
| 4 | David | Davis | 80000 | 102 |
| 2 | Bob | Johnson | 70000 | 101 |
以下是整理后的Markdown格式内容:
3、SQL 基础排序 - ORDER BY 子句
在 SQL 中,ORDER BY 子句用于对查询结果进行排序。通过 ORDER BY 子句,可以根据一个或多个列对结果集进行升序或降序排列。这在处理大量数据时非常有用,可以帮助更清晰地查看和分析数据。
ORDER BY 子句的使用
ORDER BY 子句的基本语法如下:
SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC|DESC];
column1:指定要排序的列名。ASC:表示按升序排序(默认值)。DESC:表示按降序排序。
多列排序
ORDER BY 子句也可以根据多个列进行排序。语法如下:
ORDER BY column1 ASC, column2 DESC;
示例
假设有一个 employees 表,包含以下数据:
| employee_id | first_name | last_name | salary | department_id |
|---|---|---|---|---|
| 1 | Alice | Smith | 60000 | 101 |
| 2 | Bob | Johnson | 70000 | 101 |
| 3 | Charlie | Brown | 50000 | 102 |
| 4 | David | Davis | 80000 | 102 |
| 5 | Eve | White | 90000 | 103 |
单列排序
查询所有员工,并按工资升序排序:
SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary ASC;
结果:
| employee_id | first_name | last_name | salary |
|---|---|---|---|
| 3 | Charlie | Brown | 50000 |
| 1 | Alice | Smith | 60000 |
| 2 | Bob | Johnson | 70000 |
| 4 | David | Davis | 80000 |
| 5 | Eve | White | 90000 |
查询所有员工,并按工资降序排序:
SELECT employee_id, first_name, last_name, salary
FROM employees
ORDER BY salary DESC;
结果:
| employee_id | first_name | last_name | salary |
|---|---|---|---|
| 5 | Eve | White | 90000 |
| 4 | David | Davis | 80000 |
| 2 | Bob | Johnson | 70000 |
| 1 | Alice | Smith | 60000 |
| 3 | Charlie | Brown | 50000 |
多列排序
查询所有员工,并先按部门 ID 升序排序,再按工资降序排序:
SELECT employee_id, first_name, last_name, salary, department_id
FROM employees
ORDER BY department_id ASC, salary DESC;
结果:
| employee_id | first_name | last_name | salary | department_id |
|---|---|---|---|---|
| 2 | Bob | Johnson | 70000 | 101 |
| 1 | Alice | Smith | 60000 | 101 |
| 4 | David | Davis | 80000 | 102 |
| 3 | Charlie | Brown | 50000 | 102 |
| 5 | Eve | White | 90000 | 103 |
使用别名排序
也可以在 ORDER BY 子句中使用列的别名进行排序。例如:
SELECT employee_id, first_name, last_name, salary AS emp_salary
FROM employees
ORDER BY emp_salary DESC;
结果:
| employee_id | first_name | last_name | emp_salary |
|---|---|---|---|
| 5 | Eve | White | 90000 |
| 4 | David | Davis | 80000 |
| 2 | Bob | Johnson | 70000 |
| 1 | Alice | Smith | 60000 |
| 3 | Charlie | Brown | 50000 |
4、SQL 基础操作符
在 SQL 中,操作符用于在 WHERE 子句中指定条件,以过滤查询结果。以下是一些常用的基础操作符及其用法。
1. 比较运算符
比较运算符用于比较两个值,返回布尔值(TRUE 或 FALSE)。常用的比较运算符包括:
=:等于<>或!=:不等于>:大于<:小于>=:大于等于<=:小于等于
2. 逻辑运算符
逻辑运算符用于组合多个条件,返回布尔值。常用的逻辑运算符包括:
AND:逻辑与OR:逻辑或NOT:逻辑非
3. IN 操作符
IN 操作符用于指定多个可能的值,返回布尔值。语法如下:
SELECT column1, column2
FROM table_name
WHERE column1 IN (value1, value2, ...);
4. BETWEEN 操作符
BETWEEN 操作符用于指定一个范围,返回布尔值。语法如下:
SELECT column1, column2
FROM table_name
WHERE column1 BETWEEN value1 AND value2;
5. LIKE 操作符
LIKE 操作符用于模式匹配,返回布尔值。语法如下:
SELECT column1, column2
FROM table_name
WHERE column1 LIKE pattern;
%:匹配任意数量的字符(包括零个字符)。_:匹配单个字符。
假设有一个 employees 表,包含以下数据:
| employee_id | first_name | last_name | salary | department_id |
|---|---|---|---|---|
| 1 | Alice | Smith | 60000 | 101 |
| 2 | Bob | Johnson | 70000 | 101 |
| 3 | Charlie | Brown | 50000 | 102 |
| 4 | David | Davis | 80000 | 102 |
| 5 | Eve | White | 90000 | 103 |
示例 1:比较运算符
查询工资大于 60000 的员工:
SELECT *
FROM employees
WHERE salary > 60000;
结果:
| employee_id | first_name | last_name | salary | department_id |
|---|---|---|---|---|
| 2 | Bob | Johnson | 70000 | 101 |
| 4 | David | Davis | 80000 | 102 |
| 5 | Eve | White | 90000 | 103 |
示例 2:逻辑运算符
查询工资大于 60000 且部门 ID 为 102 的员工:
SELECT *
FROM employees
WHERE salary > 60000 AND department_id = 102;
结果:
| employee_id | first_name | last_name | salary | department_id |
|---|---|---|---|---|
| 4 | David | Davis | 80000 | 102 |
示例 3:IN 操作符
查询部门 ID 为 101 或 103 的员工:
SELECT *
FROM employees
WHERE department_id IN (101, 103);
结果:
| employee_id | first_name | last_name | salary | department_id |
|---|---|---|---|---|
| 1 | Alice | Smith | 60000 | 101 |
| 2 | Bob | Johnson | 70000 | 101 |
| 5 | Eve | White | 90000 | 103 |
示例 4:BETWEEN 操作符
查询工资在 50000 到 70000 之间的员工:
SELECT *
FROM employees
WHERE salary BETWEEN 50000 AND 70000;
结果:
| employee_id | first_name | last_name | salary | department_id |
|---|---|---|---|---|
| 1 | Alice | Smith | 60000 | 101 |
| 2 | Bob | Johnson | 70000 | 101 |
| 3 | Charlie | Brown | 50000 | 102 |
示例 5:LIKE 操作符
查询名字以字母 “A” 开头的员工:
SELECT *
FROM employees
WHERE first_name LIKE 'A%';
结果:
| employee_id | first_name | last_name | salary | department_id |
|---|---|---|---|---|
| 1 | Alice | Smith | 60000 | 101 |
4、SQL 高级操作符
在 SQL 中,高级操作符可以帮助你更灵活和高效地操作数据库中的数据。以下是一些常见的高级操作符及其用法。
1. IS NULL 和 IS NOT NULL
IS NULL 和 IS NOT NULL 用于检查一个列是否为 NULL 或不为 NULL。
- IS NULL:检查列是否为 NULL。
- IS NOT NULL:检查列是否不为 NULL。
2. EXISTS 操作符
EXISTS 操作符用于检查子查询是否返回任何行。如果子查询返回至少一行,则 EXISTS 条件为 TRUE。
语法:
SELECT column1, column2
FROM table_name
WHERE EXISTS (SELECT 1 FROM another_table WHERE condition);
3. ALL 和 ANY 操作符
ALL 和 ANY 操作符用于比较一个值与子查询返回的值集。
- ALL:与子查询返回的所有值进行比较。
- ANY:与子查询返回的任意一个值进行比较。
语法:
SELECT column1, column2
FROM table_name
WHERE column1 > ALL (SELECT column1 FROM another_table WHERE condition);
假设有一个 employees 表,包含以下数据:
| employee_id | first_name | last_name | salary | department_id |
|---|---|---|---|---|
| 1 | Alice | Smith | 60000 | 101 |
| 2 | Bob | Johnson | 70000 | 101 |
| 3 | Charlie | Brown | NULL | 102 |
| 4 | David | Davis | 80000 | 102 |
| 5 | Eve | White | 90000 | 103 |
示例1:IS NULL 和 IS NOT NULL
查询工资为 NULL 的员工:
SELECT *
FROM employees
WHERE salary IS NULL;
结果:
| employee_id | first_name | last_name | salary | department_id |
|---|---|---|---|---|
| 3 | Charlie | Brown | NULL | 102 |
查询工资不为 NULL 的员工:
SELECT *
FROM employees
WHERE salary IS NOT NULL;
结果:
| employee_id | first_name | last_name | salary | department_id |
|---|---|---|---|---|
| 1 | Alice | Smith | 60000 | 101 |
| 2 | Bob | Johnson | 70000 | 101 |
| 4 | David | Davis | 80000 | 102 |
| 5 | Eve | White | 90000 | 103 |
示例2:EXISTS 操作符
现在,我们想查询所有工资不低于表中任何其他员工工资的员工。这里可以使用 EXISTS 操作符来实现。
SELECT e1.employee_id, e1.first_name, e1.last_name, e1.salary
FROM employees e1
WHERE EXISTS (
SELECT 1
FROM employees e2
WHERE e2.salary IS NOT NULL AND e1.salary >= e2.salary
);
子查询:
- 子查询也从 employees 表中选择数据,但使用别名 e2。
- 子查询的条件是
e2.salary IS NOT NULL,确保不比较 NULL 值。 - 子查询的条件是
e1.salary >= e2.salary,确保外层查询的员工工资高于子查询中的任何员工工资。
EXISTS 操作符:
- 如果子查询返回至少一行,则 EXISTS 条件为 TRUE。
- 这意味着外层查询的员工工资不低于表中任何其他员工的工资。
结果:
| employee_id | first_name | last_name | salary |
|---|---|---|---|
| 5 | Eve | White | 90000 |
员工 Eve 的工资是 90000,这是表



















