SQL学习笔记
简介
- SQL 全称 Structured Query Language (结构化查询语言)
- SQL 是一个用于数据库管理的语言
- SQL 现在是一个 ANSI 和 ISO 标准
- SQL 可以做以下事情:
- 执行数据库查询命令
- 在数据库中进行 CRUD(增删改查)
- 创建新的数据库、在数据库中创建新表
- 在数据库中创建视图
- 设置对表、过程、视图的权限
- 尽管SQL是一个标准,但有不同的版本差异,不过它们都支持最基本的操作
命令
- 主要 SQL 命令:
命令 | 作用 |
---|---|
SELECT | 获取数据 |
UPDATE | 更新数据 |
DELETE | 删除数据 |
INSERT INTO | 添加数据 |
CREATE DATABASE | 创建新数据库 |
ALTER DATABASE | 修改数据库 |
CREATE TABLE | 创建新表 |
ALTER TABLE | 修改表 |
DROP TABLE | 删除表 |
CREATE INDEX | 创建索引(查找关键字) |
DROP INDEX | 删除索引 |
SELECT
- 作用:获取(查找)表中某几列数据
- 格式:
SELECT column1, column2, ... FROM table_name;
- 示例:
SELECT name, id FROM Students;
- 作用: 获取表的全部数据
- 格式:
SELECT * FROM table_name;
- 示例:
SELECT * FROM Students;
SELECT DISTINCT
- 作用:获取(查找)表中几列不同的数据
- 格式:
SELECT DISTINCT column1, column2, ... FROM table_name;
- 示例:
SELECT DISTINCT name, id FROM Students;
SELECT TOP
- 作用:查找表中最大的几个元素
- 该语句在不同的 SQL 版本中用法不一,故不在此介绍
WHERE
- 作用:筛选数据,保留符合条件的数据
- 格式:
... WHERE condition;
- 逻辑运算符:在
condition
中,可以使用如下逻辑运算符(包括有类似逻辑运算符作用的命令):
运算符 | 作用 |
---|---|
= | 等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
<> | 不等于(部分 SQL 版本是 != ) |
BETWEEN | 在区间内 (详见下文) |
LIKE | 符合格式 (详见下文) |
IN | 在集合内 (详见下文) |
EXISTS | 子查询是否有结果 |
ANY | 子查询符合任何一个条件 |
ALL | 子查询全部符合条件 |
AND | 连接两个条件,表示与 |
OR | 连接两个条件,表示或 |
NOT | 写在一个条件前面,表示非 |
IS NULL | 空 |
IS NOT NULL | 非空 |
- 示例:
SELECT * FROM Students WHERE name='Alice' AND id='13';
BETWEEN
- 作用:表示在区间(两端均为闭区间)内的条件
- 格式:
... BETWEEN value1 AND value2;
- 示例:
SELECT * FROM Students WHERE score BETWEEN 80 AND 90;
IN
- 作用:表示在给出的集合中的条件
- 格式:
... IN (value1, value2, ...);
- 示例:
SELECT * FROM Students WHERE class IN ('Class1', 'Class2');
LIKE
- 作用:表示符合给出的格式的条件
- 格式:
... LIKE pattern;
- 格式 (pattern) 的描述:
在描述格式时,通常会使用通配符代替不确定的部分。在 SQL 中,有以下几个通配符:
通配符 | 表示 | 示例 |
---|---|---|
% | 可空的字符串 | 'a%' :以a开头的字符串 |
_ | 单个字符 | 'a_' :以a开头且a后面有且只有一个字符的字符串 |
[] | 在该通配符中的任一字符(在 PostgreSQL 和 MySQL 中不受支持) | [abc] :'a' 或'b' 或'c' |
^ | 不在[] 通配符中的任一字符(在 PostgreSQL 和 MySQL 中不受支持) | ^[abc] :除'a' 和'b' 和'c' 之外的任一字符 |
- | 在指定范围内的字符(在 PostgreSQL 和 MySQL 中不受支持) | a-d :从 'a' 到 'd' 的字符 |
- 示例:
SELECT * FROM Students WHERE name LIKE 'a_%';
EXISTS
- 作用:表示子查询有结果的条件
- 格式:
SELECT column_name(s) FROM table_name
WHERE EXISTS
(SELECT column_name FROM table_name WHERE condition);
- 示例:
SELECT name FROM Students WHERE EXISTS (SELECT * FROM Students WHERE score >= 80);
HAVING
- 作用:与
WHERE
一样,表示查询条件,但适用于带有聚合函数的条件 - 格式:
... HAVING condition;
- 示例:
-- 获取人数不少于30的班级的人数
SELECT COUNT(*), className FROM Students GROUP BY className HAVING COUNT(*) >= 30;
ANY
- 作用:逻辑运算符,判断子查询是否有符合条件的结果
- 格式:
SELECT column_name(s) FROM table_name
WHERE column_name operator ANY
(SELECT column_name FROM table_name WHERE condition)
- 示例:
-- 查询1班中成绩大于2班任一学生的学生
SELECT name FROM Students
WHERE class = "1" AND score > ANY (SELECT score FROM Students WHERE class = "2")
ALL
- 作用:逻辑运算符,判断子查询是否全部符合条件
- 格式:
SELECT column_name(s) FROM table_name
WHERE column_name operator ALL
(SELECT column_name FROM table_name WHERE condition)
- 示例:
-- 查询1班中成绩大于2班所有学生的学生
SELECT name FROM Students
WHERE class = "1" AND score > ALL (SELECT score FROM Students WHERE class = "2")
ORDER BY
- 作用:按照关键字排序(对于字符串按字典序排序)
- 格式:
... ORDER BY column1, column2, ... ASC | DESC;
- 示例:
SELECT * FROM Students ORDER BY Name DESC;
其中, ASC
表示升序, DESC
表示降序
GROUP BY
- 作用:指定分组依据,通常与聚合函数搭配使用
- 格式:
SELECT column_name(s) FROM table_name GROUP BY column_name(s)
- 示例:
SELECT COUNT(*), className FROM Students GROUP BY className;
AS
- 作用:为数据起别名( Aliases ),常与
SELECT
搭配使用 - 格式:
SELECT column_name AS alias_name FROM table_name;
- 示例:
SELECT student_id AS id FROM Students;
-- 也可用于多列数据
SELECT students_id AS id, students_name AS name FROM Students;
JOIN
- 作用:通过关系列将将来自多个表的数据拼接到一起
- 操作类型:
- INNER:所有表中都有的数据(交集)
- LEFT:所有左边的表的数据和右边的表中与左边的表匹配的数据
- RIGHT:所有右边的表的数据和左边的表中与右边的表匹配的数据
- FULL:至少一个表中有的数据(并集)
- 格式:
SELECT column_name(s) FROM table1 [MODE] JOIN table2 ON table1.column_name=table2.column_name;
- 示例:
SELECT Students.name, Classes.name FROM Students
LEFT JOIN Classes ON Students.classId=Classes.classId;
UNION
- 作用:将多个表中的几列合并到一起(列数不变,行数合并),要求两个表中要合并的列数相同。
- 格式:
SELECT column_name(s) FROM table1
UNION (ALL)
SELECT column_name(s) FROM table2;
注:如不使用 ALL
,则 UNION
会自动去重
- 示例:
SELECT name From Students
UNION ALL
SELECT name From Teachers;
INSERT INTO
- 作用:向表中添加数据
- 格式:
- 指定列名
INSERT INTO table_name (colum1, column2, column3, ...) VALUE (value1, value2, value3, ...);
- 不指定列名(向所有列添加数据且顺序与列的顺序一致)
INSERT INTO table_name VALUES (value1, value2, value3, ...);
- 添加多条数据
INSERT INTO table_name (colum1, column2, column3, ...) VALUES (value1, value2, value3, ...) (value1_, value2_, value3_, ...);
- 示例:
INSERT INTO Students (id, name, score) VALUES ('20', 'Bob', 95);
UPDATE
- 作用:修改已有数据的内容
- 格式:
UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;
注意:如果不使用 WHERE
,将修改表中的所有数据!
- 示例:
UPDATE Students SET name='Floyd' WHERE id='3265';
DELETE
- 作用:删除已有数据
- 格式:
DELETE FROM table_name WHERE condition;
注意:如果不使用 WHERE
,将删除表中的所有数据!
- 示例:
DELETE FROM Students WHERE id='114514';
聚合函数
- 聚合函数是 STL 中的常用求值计算函数,常与
SELECT
搭配使用。 - 若要使用聚合函数作为查询条件,应使用
HAVING
而非WHERE
MIN()/MAX()
- 作用:得出数据中的最大值/最小值
- 格式:
SELECT MAX(column_name) FROM table_name WHERE condition;
- 示例:
SELECT MAX(score) FROM Students;
COUNT()
- 作用:统计数量
- 格式:
SELECT COUNT(column_name) FROM table_name;
- 示例:
-- 统计80分以上数据条数
SELECT COUNT(*) FROM Students WHERE score >= 80;
-- 统计name非空的数据条数
SELECT COUNT(name) FROM Students;
SUM()
- 作用:求和
- 格式:
SELECT SUM(column_name) FROM table_name;
- 示例:
SELECT SUM(score) FROM Students WHERE score >= 80;
-- 也可以在参数中写表达式
SELECT SUM(score * 0.1 + base) FROM Students;
AVG()
- 作用:求平均数
- 格式:
SELECT AVG(column_name) FROM table_name;
- 示例:
SELECT AVG(score) FROM Students;