(第六章)多表查询

多表查询

内连接查询

  • 1.自连接查询
  • 2.等值或不等值查询

外连接查询

  • 1.左外连接查询
  • 2.右外连接查询

子查询

  • 1.in ,exists
  • 2.any,all

自连接查询

表与其自身进行笛卡儿积连接、根据相同名称的字段进行记录匹配,查询结果仅包含符合连接条件与筛选条件的行。为了区别该表的每一次出现,需要为表分别定义别名。

INNER JOIN使用比较运算符“ = ”匹配每个表共有列 的列值,查询结果仅包含符合连接条件与筛选条件的行。

select A.col_name1,B,col_name2 from table1 A inner join table1 B on A.col_nameY=B.col_nameX

table1:表示数据表
table1 A inner join table1 B:一个表用两次,并起别名,避免混淆
A,B:标注表的别名
from:从哪个表格里面查询数据
自连接的数据查询通过 inner join on 实现
inner join:连接待查询的表
on 后面连接【表与表连接匹配条件】

实例
查询至少借了书名id为1,2两本的学生
下面的表记录了学生借阅书籍的记录

数据表t_borrow_record

读者id 读者名字 借取数量 书id 书名
reader_id reader_name borrow_count book_id book_name
1
小一
1
1
python终极
2
小二
1
1
python终极
3 小三 1 5 python初级
4 小四 1 2 python高级
5 小五 1 5 python初极
2
小二 1
2
python高级
1
小一 1
2
python高级
操作语句 同一张表连接两次
SELECT
A.reader_name
FROM
t_borrow_record A
INNER JOIN
t_borrow_record B
ON
A.reader_id = B.reader_id
WHERE
A.book_id = 1
AND
B.book_id = 2;
选择
A表的reader_name【字段为搜索结果】
从哪个表
是t_borrow_record表,并且把表起别名为:A
前面的哪个表和后面的这个表连接
t_borrow_record表 并且把表起别名为:B
【ON】连接里面相同的字段
是 A表的reader_id=B表的reader_id
筛选条件为:
A表的book_id等于1的值,
与…并且
B表的book_id等于2的值

思路

先匹配 A.reader_id = B.reader_id
A表reader_id等于B表的reader_id的数据提取(黄色的4条)
where 再次筛选 得出4条数据
A表book_id等于1的值(红色)
B表book_id等于2的值(浅蓝色)
最终筛选select + 显示哪个表的字段,最终显示两个学生名
A表的reader_name

得到的输出结果

reader_name
小一
小二
搜索reader_name的语句【写为一行】
select A.reader_name from t_borrow_record A inner join t_borrow_record B on A.reader_id = B.reader_id WHERE A.book_id = 1 and B.book_id = 2;
搜索reader_id的语句【写为一行】
select A.reader_id from t_borrow_record A inner join t_borrow_record B on A.reader_id = B.reader_id WHERE A.book_id = 1 and B.book_id = 2;

创建表的语句
create table t_borrow_record(
reader_id int,
reader_name varchar(20),
borrow_count int,
book_id int,
book_name varchar(20)
);
添加数据内容语句
insert into t_borrow_record values
(1,‘小一’,1,1,‘python终极’),
(2,‘小二’,1,1,‘python终极’),
(3,‘小三’,1,5,‘python初级’),
(4,‘小四’,1,2,‘python高级’),
(5,‘小五’,1,5,‘python初极’),
(2,‘小二’,1,2,‘python高级’),
(1,‘小一’,1,2,‘python高级’);

第二种查询方法
select A.reader_name
from t_reader_record A,t_reader_record B
where
A.reader_id=B.reader_id
and A.book_id=1 and B.book_id=2;

科学上没有所谓的真理,在课堂里面学到的所有定理,公理都是前人对自然现象的归纳总结,是现状下最好的归纳总结,可以有效解释自然现象,甚至推测一些未发生的现象,随着人类对周围环境和宇宙认知的加深,这些定理和公理都有失效的时候

你可能感兴趣的:(mysql,mysql)