笔记-SQL查询

176 阅读3分钟

利用这段时间,在家恶补一下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 ) 。