一、SQL 概述
SQL (Structured Query Language) 是一种标准的数据库查询语言,用于管理和操作关系数据库。SQL 包含两部分:数据定义语言 (DDL) 和数据操作语言 (DML)。
二、数据定义语言 (DDL)
DDL 用于定义和修改数据库结构,包括创建、修改和删除数据库对象。
-
创建表
sqlCREATE TABLE 表名 ( 列名 数据类型 [约束条件], ... [PRIMARY KEY (主键列名)], [FOREIGN KEY (外键列名) REFERENCES 参考表(参考列名)] );
示例:
sqlCREATE TABLE Sailors ( sid INTEGER, sname CHAR(20), rating INTEGER, age FLOAT, PRIMARY KEY (sid) );
-
修改表
sqlALTER TABLE 表名 ADD 列名 数据类型 [约束条件]; ALTER TABLE 表名 DROP COLUMN 列名;
-
删除表
sqlDROP TABLE 表名;
三、数据操作语言 (DML)
DML 用于查询和修改数据库中的数据,包括插入、更新、删除和查询操作。
-
插入数据
sqlINSERT INTO 表名 (列名1, 列名2, ...) VALUES (值1, 值2, ...);
示例:
sqlINSERT INTO Sailors (sid, sname, rating, age) VALUES (1, 'Fred', 7, 22);
-
更新数据
sqlUPDATE 表名 SET 列名1 = 值1, 列名2 = 值2, ... WHERE 条件;
示例:
sqlUPDATE Sailors SET rating = 8 WHERE sname = 'Fred';
-
删除数据
sqlDELETE FROM 表名 WHERE 条件;
示例:
sqlDELETE FROM Sailors WHERE sname = 'Fred';
-
查询数据
sqlSELECT [DISTINCT] 列名1, 列名2, ... FROM 表名 [WHERE 条件] [GROUP BY 列名] [HAVING 条件] [ORDER BY 列名 [ASC|DESC]] [LIMIT 数量];
示例:
sqlSELECT sname, age FROM Sailors WHERE age > 25 ORDER BY age DESC;
四、查询语句的执行顺序
SQL 查询语句的执行顺序通常如下:
- FROM:确定查询的数据来源。
- WHERE:过滤数据。
- GROUP BY:对数据进行分组。
- HAVING:过滤分组后的数据。
- SELECT:选择要显示的列。
- DISTINCT:去除重复行。
- ORDER BY:对结果排序。
- LIMIT:限制返回的行数。
五、常用的SQL功能和操作
-
DISTINCT
去除查询结果中的重复行。
sqlSELECT DISTINCT 列名 FROM 表名;
-
排序 (ORDER BY)
按指定列对查询结果进行排序,默认升序排列。
sqlSELECT 列名 FROM 表名 ORDER BY 列名 [ASC|DESC];
-
聚合函数
AVG()
: 计算平均值SUM()
: 计算总和COUNT()
: 计算数量MAX()
: 计算最大值MIN()
: 计算最小值
示例:
sqlSELECT AVG(age) FROM Sailors;
-
分组 (GROUP BY)
将查询结果按指定列进行分组,并对每个分组应用聚合函数。
sqlSELECT 列名, 聚合函数(列名) FROM 表名 GROUP BY 列名;
-
HAVING
用于过滤分组后的数据,类似于
WHERE
,但作用于分组结果。sqlSELECT 列名, 聚合函数(列名) FROM 表名 GROUP BY 列名 HAVING 聚合函数(列名) 条件;
-
LIMIT
限制返回的行数。
sqlSELECT 列名 FROM 表名 LIMIT 数量;
六、示例数据库
以下是一个示例数据库,包括三张表:Sailors, Boats, Reserves。
-
Sailors 表
sqlCREATE TABLE Sailors ( sid INTEGER PRIMARY KEY, sname CHAR(20), rating INTEGER, age FLOAT );
示例数据:
sid sname rating age 1 Fred 7 22 2 Jim 2 39 3 Nancy 8 27 -
Boats 表
sqlCREATE TABLE Boats ( bid INTEGER PRIMARY KEY, bname CHAR(20), color CHAR(10) );
示例数据:
bid bname color 101 Nina red 102 Pinta blue 103 Santa Maria red -
Reserves 表
sqlCREATE TABLE Reserves ( sid INTEGER, bid INTEGER, day DATE, PRIMARY KEY (sid, bid, day), FOREIGN KEY (sid) REFERENCES Sailors(sid), FOREIGN KEY (bid) REFERENCES Boats(bid) );
示例数据:
sid bid day 1 102 2023-09-12 2 102 2023-09-13
七、高级查询
-
多表连接
-
内连接(INNER JOIN):返回两个表中匹配的行。
sqlSELECT Person.name, Orders.order_id FROM Person INNER JOIN Orders ON Person.person_id = Orders.person_id;
-
左连接(LEFT JOIN):返回包括左表中所有行及右表中匹配的行。
sqlSELECT Person.name, Orders.order_id FROM Person LEFT JOIN Orders ON Person.person_id = Orders.person_id;
-
右连接(RIGHT JOIN):返回包括右表中所有行及左表中匹配的行。
sqlSELECT Person.name, Orders.order_id FROM Person RIGHT JOIN Orders ON Person.person_id = Orders.person_id;
-
全连接(FULL JOIN):返回包括左右表中所有行。
sqlSELECT Person.name, Orders.order_id FROM Person FULL JOIN Orders ON Person.person_id = Orders.person_id;
-
-
集合操作
-
UNION 操作:用于合并两个或多个SELECT语句的结果集。
sqlSELECT name FROM Person UNION SELECT name FROM Employees;
-
INTERSECT 操作:用于返回两个SELECT语句结果集的交集。
sqlSELECT name FROM Person INTERSECT SELECT name FROM Employees;
-
EXCEPT 操作:用于返回第一个SELECT语句结果集中存在但在第二个SELECT语句结果集中不存在的行。
sqlSELECT name FROM Person EXCEPT SELECT name FROM Employees;
-
-
子查询
-
基本子查询 :子查询用于在另一个查询的
WHERE
子句中嵌套查询。sqlSELECT num FROM enrollment WHERE students >= ( SELECT AVG(students) FROM enrollment );
-
相关子查询:子查询依赖于外部查询。
sqlSELECT * FROM classes WHERE EXISTS ( SELECT * FROM enrollment WHERE classes.num = enrollment.num );
-
-
谓词逻辑
-
常用的谓词逻辑操作符包括
EXISTS
、ANY
、ALL
、IN
等。 -
示例:
sqlSELECT name FROM Sailors WHERE age > ALL ( SELECT age FROM Sailors WHERE rating > 7 );
-
八、示例查询及其结果
-
查询所有年龄为27的水手的姓名和等级:
sqlSELECT sname, rating FROM Sailors WHERE age = 27;
结果:
sname rating Nancy 8 -
查询评级大于5的水手的ID及其预定的船只ID:
sqlSELECT S.sid, R.bid FROM Sailors AS S JOIN Reserves AS R ON S.sid = R.sid WHERE S.rating > 5;
结果:
sid bid 1 102
九、结论
这份SQL学习笔记涵盖了基本的SQL查询、复杂查询、多表连接、集合操作及高级查询技术。通过这些例子和解释,可以帮助理解SQL的基本概念及其在实际数据库操作中的应用。