SQL快速入门【转自牛客网】
来源:牛客网
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 1FROM employees e2WHERE 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,这是表