第4章 必知必会SQL
4.1 SQL基础语法
SQL(Structured Query Language,结构化查询语言)是一种用于管理和操作关系型数据库的标准语言。
4.1.1 SQL语句的基本结构
SQL 语句通常包括以下部分:
- SELECT:用于从数据库中检索数据。
- INSERT:用于向数据库中插入数据。
- UPDATE:用于更新数据库中的数据。
- DELETE:用于从数据库中删除数据。
- CREATE:用于创建数据库和表。
- ALTER:用于修改数据库和表。
- DROP:用于删除数据库和表。
4.1.2 SQL语句的组成部分
- SELECT 列表:指定要检索的列。
- FROM 表名:指定数据来源的表。
- WHERE 条件:指定筛选数据的条件。
- GROUP BY 列表:按指定列对数据进行分组。
- HAVING 条件:对分组后的数据进行过滤。
- ORDER BY 列表:对数据进行排序。
4.2 数据定义语言(DDL)
数据定义语言(DDL)用于定义和管理数据库中的结构和对象。
4.2.1 CREATE 语句
-
创建数据库:
CREATE DATABASE mydatabase;
-
创建表:
CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(100), age INT );
4.2.2 ALTER 语句
-
添加新列:
ALTER TABLE users ADD COLUMN email VARCHAR(100);
-
修改列类型:
ALTER TABLE users MODIFY COLUMN age SMALLINT;
4.2.3 DROP 语句
-
删除数据库:
DROP DATABASE mydatabase;
-
删除表:
DROP TABLE users;
4.3 数据操作语言(DML)
数据操作语言(DML)用于查询和修改数据。
4.3.1 SELECT 语句
-
查询所有列:
SELECT * FROM users;
-
查询指定列:
SELECT name, age FROM users;
-
使用 WHERE 条件查询:
SELECT * FROM users WHERE age > 30;
-
使用 ORDER BY 排序:
SELECT * FROM users ORDER BY age DESC;
-
使用 GROUP BY 分组:
SELECT age, COUNT(*) FROM users GROUP BY age;
4.3.2 INSERT 语句
-
插入新记录:
INSERT INTO users (name, age) VALUES ('Alice', 25);
-
插入多条记录:
INSERT INTO users (name, age) VALUES ('Bob', 30), ('Charlie', 35);
4.3.3 UPDATE 语句
-
更新记录:
UPDATE users SET age = 26 WHERE name = 'Alice';
-
更新多条记录:
UPDATE users SET age = age + 1 WHERE age < 30;
4.3.4 DELETE 语句
-
删除记录:
DELETE FROM users WHERE name = 'Alice';
-
删除所有记录:
DELETE FROM users;
4.4 数据控制语言(DCL)
数据控制语言(DCL)用于控制数据库的访问权限。
4.4.1 GRANT 语句
-
授予用户权限:
GRANT SELECT, INSERT ON mydatabase.* TO 'username'@'localhost';
-
授予所有权限:
GRANT ALL PRIVILEGES ON mydatabase.* TO 'username'@'localhost';
4.4.2 REVOKE 语句
-
撤销用户权限:
REVOKE INSERT ON mydatabase.* FROM 'username'@'localhost';
-
撤销所有权限:
REVOKE ALL PRIVILEGES ON mydatabase.* FROM 'username'@'localhost';
4.5 复杂查询(连接、子查询、集合操作)
复杂查询包括表的连接、子查询以及集合操作。
4.5.1 连接(JOIN)
-
内连接:
SELECT users.name, orders.order_id FROM users INNER JOIN orders ON users.id = orders.user_id;
-
左连接:
SELECT users.name, orders.order_id FROM users LEFT JOIN orders ON users.id = orders.user_id;
-
右连接:
SELECT users.name, orders.order_id FROM users RIGHT JOIN orders ON users.id = orders.user_id;
-
全连接:
SELECT users.name, orders.order_id FROM users FULL JOIN orders ON users.id = orders.user_id;
4.5.2 子查询
-
简单子查询:
SELECT name FROM users WHERE age > (SELECT AVG(age) FROM users);
-
相关子查询:
SELECT name FROM users u1 WHERE age > (SELECT AVG(age) FROM users u2 WHERE u1.id = u2.id);
4.5.3 集合操作
-
UNION:
SELECT name FROM users UNION SELECT name FROM customers;
-
UNION ALL:
SELECT name FROM users UNION ALL SELECT name FROM customers;
-
INTERSECT(某些数据库支持):
SELECT name FROM users INTERSECT SELECT name FROM customers;
-
EXCEPT(某些数据库支持):
SELECT name FROM users EXCEPT SELECT name FROM customers;
4.6 SQL优化技巧
SQL优化技巧帮助提高查询和操作的性能。
4.6.1 使用索引
-
创建索引:
CREATE INDEX idx_users_age ON users (age);
-
删除索引:
DROP INDEX idx_users_age;
4.6.2 查询优化
-
*避免 SELECT ,只查询需要的列:
SELECT name, age FROM users;
-
使用适当的 WHERE 条件过滤数据:
SELECT name FROM users WHERE age > 30;
-
避免使用非索引列进行过滤:
SELECT name FROM users WHERE age > 30; -- age 列已建立索引
4.6.3 分区和分表
- 分区表:
CREATE TABLE orders ( order_id INT, order_date DATE, ... ) PARTITION BY RANGE (order_date) ( PARTITION p0 VALUES LESS THAN (TO_DATE('2020-01-01')), PARTITION p1 VALUES LESS THAN (TO_DATE('2021-01-01')) );
4.6.4 定期维护
-
分析表和索引:
ANALYZE TABLE users;
-
重建索引:
REINDEX TABLE users;
通过掌握这些SQL基础语法、数据定义语言(DDL)、数据操作语言(DML)、数据控制语言(DCL)、复杂查询和SQL优化技巧,读者可以高效地管理和操作数据库。