利用这段时间,在家恶补一下sql相关的基础知识
数据准备
person表 包括主键、人名、存款信息、工资卡
| id | name | deposit | cardId |
|---|---|---|---|
| 1 | 张三 | 1000 | 1 |
| 2 | 李四 | 2000 | 2 |
| 3 | 王五 | 2100 | 2 |
| 4 | 赵六 | 3000 | 3 |
| 5 | 孙七 | 4400 | 4 |
| 6 | 周八 | 5000 | 6 |
| 7 | 吴九 | 2800 | 2 |
| 8 | 郑十 | 3500 | 1 |
card表 包括主键、卡名
| id | name |
|---|---|
| 1 | 交行卡 |
| 2 | 建行卡 |
| 3 | 农行卡 |
| 4 | 工行卡 |
| 5 | 邮政卡 |
条件查询
查询范围
查询存款在2000到4000之间的人
- 1.between
select * from person WHERE deposit between 2000 and 4000 - 2.运算符
select * from person WHERE deposit >= 2000 and deposit <= 4000
多表查询
查询人拥有的卡名 (这边注意结果不会出现周八,因为周八的cardId为6,没有ID为6的工资卡)
select person.name as person_name,card.name as card_name from person,card where person.cardId = card.id
in的运用
查询拥有交行卡和建行卡的人的信息
select * from person where cardId in (select id from card where name in ('交行卡','建行卡'))
any和all的运用
查询拥有交行卡人的存款大于拥有建行卡的人
- any
select * from person where cardId = 1 and deposit > any(SELECT deposit from person where cardId = 2) - all
select * from person where cardId = 1 and deposit > all(SELECT deposit from person where cardId = 2)
max\min\top\count的运行
- 此处不做示例
- 若放置在条件中,需使用having而不是where
四种连接查询
用一张图概括:
内连接 (inner join)
两张表中的数据,通过某个字段相对,查询出相关记录
代码示例:
select * from person inner join card on person.cardId = card.id(inner可省略)
| id | name | cardId | id | name |
|---|---|---|---|---|
| 1 | 张三 | 1 | 1 | 饭卡 |
| 2 | 李四 | 3 | 3 | 农行卡 |
左外连接 (left join)
将左边表中所有数据取出来,而右边表中的数据如果有就显示出来,如果没有则为null
代码示例:
select * from person left outer join card on person.cardId = card.id(outer可省略)
| id | name | cardId | id | name |
|---|---|---|---|---|
| 1 | 张三 | 1 | 1 | 饭卡 |
| 2 | 李四 | 3 | 3 | 农行卡 |
| 3 | 王五 | 6 | null | null |
右外连接(right join)
代码示例:
select * from person right outer join card on person.cardId = card.id(outer可省略) 与左连接相反,将右边表中所有数据取出来,而左边表中的数据如果有就显示出来,如果没有则为null
| id | name | cardId | id | name |
|---|---|---|---|---|
| 1 | 张三 | 1 | 1 | 饭卡 |
| 2 | 李四 | 3 | 3 | 农行卡 |
| null | null | null | 2 | 建行卡 |
| null | null | null | 4 | 工商卡 |
| null | null | null | 5 | 邮政卡 |
全外连接(full join)
mysql不支持full join
代码示例:
select * from person full outer join card on person.cardId = card.id(outer可省略)
MySql示例:
select * from person left outer join card on person.cardId = card.id
union
select * from person right outer join card on person.cardId = card.id
| id | name | cardId | id | name |
|---|---|---|---|---|
| 1 | 张三 | 1 | 1 | 饭卡 |
| 2 | 李四 | 3 | 3 | 农行卡 |
| 3 | 王五 | 6 | null | null |
| null | null | null | 2 | 建行卡 |
| null | null | null | 4 | 工商卡 |
| null | null | null | 5 | 邮政卡 |
事务
在 MySQL 中,事务其实是一个最小的不可分割的工作单元。事务能够保证一个业务的完整性
比如我们的银行转账:
-- 张三 -> -100
UPDATE person set deposit = deposit - 100 WHERE name = '张三';
-- 李四 -> +100
UPDATE person set deposit = deposit + 100 WHERE name = '李四';
在实际项目中,假设只有一条 SQL 语句执行成功,而另外一条执行失败了,就会出现数据前后不一致。
因此,在执行多条有关联 SQL 语句时,事务可能会要求这些 SQL 语句要么同时执行成功,要么就都执行失败。
自动提交
查看自动提交状态:SELECT @@AUTOCOMMIT ;
设置自动提交状态:SET AUTOCOMMIT = 0 。
手动提交
- BEGIN
- START TRANSACTION
使用 COMMIT 命令提交事务。
事务回滚
使用 ROLLBACK 命令回滚事务。
ACID
A 原子性:事务是最小的单位,不可以再分割;
C 一致性:要求同一事务中的 SQL 语句,必须保证同时成功或者失败;
I 隔离性:事务1 和 事务2 之间是具有隔离性的;
D 持久性:事务一旦结束 ( COMMIT ) ,就不可以再返回了 ( ROLLBACK ) 。