相关资料
参考链接1:SQL 语法(超级详细)
参考链接2:史上超强最常用SQL语句大全
SQL练习网站:CSDN、牛客、LeetCode、LintCode
SQL相关视频:
推荐书籍:
基础部分
进阶部分
SQL 语法结构
SQL 语法结构包括:
SQL 语法要点
-- 一行 SQL 语句
UPDATE user SET username='robot', password='robot' WHERE username = 'root';
-- 多行 SQL 语句
UPDATE user
SET username='robot', password='robot'
WHERE username = 'root';
## 注释1
-- 注释2
/* 注释3 */
SQL 分类
DML语句(数据操纵语言)用法部分
插入完整的行
INSERT INTO user
VALUES (10, 'root', 'root', 'xxxx@163.com');
插入行的一部分
INSERT INTO user(username, password, email)
VALUES ('admin', 'admin', 'xxxx@163.com');
插入查询出来的数据
INSERT INTO user(username)
SELECT name
FROM account;
UPDATE 语句用于更新表中的记录
UPDATE user
SET username='robot', password='robot'
WHERE username = 'root';
删除表中的指定数据
DELETE FROM user
WHERE username = 'robot';
清空表中的数据
TRUNCATE TABLE user;
DQL语句(数据查询语言)用法部分
查询单列
SELECT prod_name
FROM products;
查询多列
ELECT *
FROM products;
查询不同值
SELECT DISTINCT
vend_id FROM products;
限制查询结果
-- 返回前 5 行
SELECT * FROM mytable LIMIT 5;
SELECT * FROM mytable LIMIT 0, 5;
-- 返回第 3 ~ 5 行
SELECT * FROM mytable LIMIT 2, 3;
子查询的子查询
SELECT cust_name, cust_contact
FROM customers
WHERE cust_id IN (SELECT cust_id
FROM orders
WHERE order_num IN (SELECT order_num
FROM orderitems
WHERE prod_id = 'RGAN01'));
SELECT 语句中的 WHERE 子句
SELECT * FROM Customers
WHERE cust_name = 'Kids Place';
UPDATE 语句中的 WHERE 子句
UPDATE Customers
SET cust_name = 'Jack Jones'
WHERE cust_name = 'Kids Place';
DELETE 语句中的 WHERE 子句
DELETE FROM Customers
WHERE cust_name = 'Kids Place';
IN示例
SELECT *
FROM products
WHERE vend_id IN ('DLL01', 'BRS01');
between示例
SELECT *
FROM products
WHERE prod_price BETWEEN 3 AND 5;
AND示例
SELECT prod_id, prod_name, prod_price
FROM products
WHERE vend_id = 'DLL01' AND prod_price <= 4;
OR示例
SELECT prod_id, prod_name, prod_price
FROM products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';
NOT示例
SELECT *
FROM products
WHERE prod_price NOT BETWEEN 3 AND 5;
%示例
SELECT prod_id, prod_name, prod_price
FROM products
WHERE prod_name LIKE '%bean bag%';
_示例
SELECT prod_id, prod_name, prod_price
FROM products
WHERE prod_name LIKE '__ inch teddy bear';
内连接(INNER JOIN)
SELECT vend_name, prod_name, prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id;
自连接
SELECT c1.cust_id, c1.cust_name, c1.cust_contact
FROM customers c1, customers c2
WHERE c1.cust_name = c2.cust_name
AND c2.cust_contact = 'Jim Jones';
自然连接(NATURAL JOIN)
SELECT *
FROM Products
NATURAL JOIN Customers;
左连接(LEFT JOIN)
SELECT customers.cust_id, orders.order_num
FROM customers LEFT JOIN orders
ON customers.cust_id = orders.cust_id;
右连接(RIGHT JOIN)
SELECT customers.cust_id, orders.order_num
FROM customers RIGHT JOIN orders
ON customers.cust_id = orders.cust_id;
组合查询
SELECT cust_name, cust_contact, cust_email
FROM customers
WHERE cust_state IN ('IL', 'IN', 'MI')
UNION
SELECT cust_name, cust_contact, cust_email
FROM customers
WHERE cust_name = 'Fun4All';
ORDER BY
SELECT * FROM products
ORDER BY prod_price DESC, prod_name ASC;
分组
SELECT cust_name, COUNT(cust_address) AS addr_num
FROM Customers GROUP BY cust_name;
分组后排序
SELECT cust_name, COUNT(cust_address) AS addr_num
FROM Customers GROUP BY cust_name
ORDER BY cust_name DESC;
使用 WHERE 和 HAVING 过滤数据
SELECT cust_name, COUNT(*) AS num
FROM Customers
WHERE cust_email IS NOT NULL
GROUP BY cust_name
HAVING COUNT(*) >= 1;
TCL语句(事务控制语言)用法部分
事务在数据库中的作用是确保一组相关的操作要么全部执行成功,要么全部不执行。这有助于维护数据库的一致性、可靠性和完整性。以下是事务运行的基本过程和在实际项目中的作用:
开始事务: 事务的执行始于 BEGIN TRANSACTION
命令。开始事务后,所有后续的数据库操作都被看作是一组原子操作。
执行数据库操作: 在事务中执行一系列数据库操作,比如插入数据、更新数据、删除数据等。这些操作形成了一个数据库操作序列。
判断事务成功或失败: 在事务执行期间,如果任何一个操作失败,系统会判定整个事务失败。
提交事务: 如果事务中的所有操作都成功执行,可以通过 COMMIT
命令提交事务,使得所有的修改永久生效。
回滚事务: 如果事务中的任何操作失败或者发生错误,可以通过 ROLLBACK
命令回滚事务,取消所有的修改,使数据库回到事务开始前的状态。
确保数据一致性: 事务保证了数据库从一个一致的状态到另一个一致的状态的过渡。如果事务中的任何操作失败,数据库会回滚到事务开始前的状态,确保数据的一致性。
处理并发操作: 在多用户并发访问数据库的环境中,事务隔离性确保了每个事务的操作互相独立,避免了相互干扰和数据冲突。
支持原子操作: 事务确保一组操作要么全部执行成功,要么全部失败。这对于执行一系列相关的数据库操作,如转账等,是非常关键的。
持久性保证: 事务的持久性特性确保了一旦事务提交,其结果将永久存储在数据库中,即使系统故障也不会导致数据丢失。
提高系统可靠性: 通过使用事务,可以更好地处理系统故障和异常,从而提高系统的可靠性和稳定性。
总的来说,事务是数据库管理系统中非常重要的概念,它为开发人员提供了一种有效的方式来维护数据的完整性和一致性,特别是在复杂的应用程序中,事务管理对于确保数据的正确性至关重要。
-- 开始事务
START TRANSACTION;
-- 插入操作 A
INSERT INTO `user`
VALUES (1, 'root1', 'root1', 'xxxx@163.com');
-- 创建保留点 updateA
SAVEPOINT updateA;
-- 插入操作 B
INSERT INTO `user`
VALUES (2, 'root2', 'root2', 'xxxx@163.com');
-- 回滚到保留点 updateA
ROLLBACK TO updateA;
-- 提交事务,只有操作 A 生效
COMMIT;
DCL语句(数据控制语言)用法部分
USE mysql;
SELECT user FROM user;
创建账户
CREATE USER myuser IDENTIFIED BY 'mypassword';
修改账户名
UPDATE user SET user='newuser' WHERE user='myuser';
FLUSH PRIVILEGES;
删除账户
DROP USER myuser;
查看权限
SHOW GRANTS FOR myuser;
授予权限
GRANT SELECT, INSERT ON *.* TO myuser;
删除权限
REVOKE SELECT, INSERT ON *.* FROM myuser;
更改密码
SET PASSWORD FOR myuser = 'mypass';