内链接查询,外链接查询,子查询,自关联查询
一对一:
一对多:
使用场景:一个用户有多个订单,一个分类下有多个商品
使用:在多的一方建立外键,关联用户主键
建表原则:在多的一方建立外键,关联一的一方主键
多对多:
使用场景:一个学生对应多个课程,一个课程可被多个学生选择
使用:建立第三张表至少有两列,作为两个外键分别关联学生的id,课程的id
多表查询:
内链接查询:查询表与表之间有关联的部分(取交集)交集:对应关联
-
1.显示内连接:语法:
select * from A inner join B on A中的外键=B中的主键; 查找A与B表有关联的字段
例:select * from user inner join oder on user.oid=o.id;查找user表和order表有关联的字段
-
2.隐士内链接:
语法:
select * from A,B where A中的外键=B中的主键
例:SELECT * FROM USER u,orderlist o WHERE u.id=o.uid
外链接查询:
-
左外连接:查询表与表之间有关联的部分(取交集)和左表中全部数据
select * from A left outer join B on 条件;
A:左表名
B:右表名
例:查询所有用户,以及用户对应的订单信息
SELECT u.*,o.number FROM USER u left outer JOIN orderlist o on u.id=o.uid
USER:左表名
orderlist:右表名
u.*: 左表全部数据
o.number: 交集数据
-
右外连接:
查询表与表之间有关联的部分(取交集)和右表中全部数据
select * from A right outer join B on 条件;
子查询:查询里面嵌套查询,被嵌套的语句就是子查询(将一个表分成多个)
查询出来的结果不同使用的方式也不同
-
结果当行单列
例:查询最大年龄的用户
select * from user where age=(select max(age) from user);
-
结果单行多列
可以作为条件,使用in 或not in判断
例:查询A和B的订单信息
select * from user where age [not] in(select id from user where in('A',‘B’));
select id from user where in('A',‘B’): 张三和李四的id(根据id在查对应的信息)
-
结果多行多列
就相当于一张表
自关联查询:
将A表表自己复制成另一张表B 并主外键关联
例:
-- 查询所有员工的姓名及其直接上级的姓名,没有上级的员工也需要查询
分析
将员工信息 employee表复制一份为上级表
每个员工对应的上级(内关联查询取交集):employee.mgr = employee.id
查询左表的全部数据,和左右两张表有交集部分数据,左外连接
SELECT
e1.*, --员工所有信息
e2.name --员工对应上级的name
FROM
employee e1 --员工表
LEFT OUTER JOIN
employee e2 --上级表
ON
e1.mgr = e2.id;
视图:
练习:
套路:
1.哪些字段
2.字段所在表
3.去重(取交集)
/*
创建视图
标准语法
CREATE VIEW 视图名称 [(列名列表)] AS 查询语句;
*/
-- 创建city_country视图,保存城市和国家的信息(使用指定列名)
CREATE VIEW city_country (city_id,city_name,country_name) AS
SELECT
c1.id,
c1.name,
c2.name
FROM
city c1,
country c2
WHERE
c1.cid=c2.id;
-- 查询视图
SELECT * FROM city_country;
-- 1.查询用户的编号、姓名、年龄。订单编号
/*
分析
用户的编号、姓名、年龄 user表 订单编号 orderlist表
条件:user.id=orderlist.uid
*/
SELECT
u.id,
u.name,
u.age,
o.number
FROM
USER u,
orderlist o
WHERE
u.id=o.uid;
-- 2.查询所有的用户。用户的编号、姓名、年龄。订单编号
/*
分析
用户的编号、姓名、年龄 user表 订单编号 orderlist表
条件:user.id=orderlist.uid
查询所有的用户,左外连接
*/
SELECT
u.id,
u.name,
u.age,
o.number
FROM
USER u
LEFT OUTER JOIN
orderlist o
ON
u.id=o.uid;
-- 3.查询所有的订单。用户的编号、姓名、年龄。订单编号
/*
分析
用户的编号、姓名、年龄 user表 订单编号 orderlist表
条件:user.id=orderlist.uid
查询所有的订单,右外连接
*/
SELECT
u.id,
u.name,
u.age,
o.number
FROM
USER u
RIGHT OUTER JOIN
orderlist o
ON
u.id=o.uid;
-- 4.查询用户年龄大于23岁的信息。显示用户的编号、姓名、年龄。订单编号
/*
分析
用户的编号、姓名、年龄 user表 订单编号 orderlist表
条件:user.id=orderlist.uid AND user.age > 23
*/
SELECT
u.id,
u.name,
u.age,
o.number
FROM
USER u,
orderlist o
WHERE
u.id=o.uid
AND
u.age > 23;
-- 5.查询张三和李四用户的信息。显示用户的编号、姓名、年龄。订单编号
/*
分析
用户的编号、姓名、年龄 user表 订单编号 orderlist表
条件:user.id=orderlist.uid AND user.name IN ('张三','李四')
*/
SELECT
u.id,
u.name,
u.age,
o.number
FROM
USER u,
orderlist o
WHERE
u.id=o.uid
AND
u.name IN ('张三','李四');
-- 6.查询商品分类的编号、分类名称。分类下的商品名称
/*
分析
商品分类的编号、分类名称 category表 商品名称 product表
条件:category.id=product.cid
*/
SELECT
c.id,
c.name,
p.name
FROM
category c,
product p
WHERE
c.id=p.cid;
-- 7.查询所有的商品分类。商品分类的编号、分类名称。分类下的商品名称
/*
分析
商品分类的编号、分类名称 category表 商品名称 product表
条件:category.id=product.cid
查询所有的商品分类,左外连接
*/
SELECT
c.id,
c.name,
p.name
FROM
category c
LEFT OUTER JOIN
product p
ON
c.id=p.cid;
-- 8.查询所有的商品信息。商品分类的编号、分类名称。分类下的商品名称
/*
分析
商品分类的编号、分类名称 category表 商品名称 product表
条件:category.id=product.cid
查询所有的商品信息,右外连接
*/
SELECT
c.id,
c.name,
p.name
FROM
category c
RIGHT OUTER JOIN
product p
ON
c.id=p.cid;
-- 9.查询所有的用户和该用户能查看的所有的商品。显示用户的编号、姓名、年龄。商品名称
/*
分析
用户的编号、姓名、年龄 user表 商品名称 product表 中间表 us_pro
条件:us_pro.uid=user.id AND us_pro.pid=product.id
*/
SELECT
u.id,
u.name,
u.age,
p.name
FROM
USER u,
product p,
us_pro up
WHERE
up.uid=u.id
AND
up.pid=p.id;
-- 10.查询张三和李四这两个用户可以看到的商品。显示用户的编号、姓名、年龄。商品名称
/*
分析
用户的编号、姓名、年龄 user表 商品名称 product表 中间表 us_pro
条件:us_pro.uid=user.id AND us_pro.pid=product.id AND user.name IN ('张三','李四')
*/
SELECT
u.id,
u.name,
u.age,
p.name
FROM
USER u,
product p,
us_pro up
WHERE
up.uid=u.id
AND
up.pid=p.id
AND
u.name IN ('张三','李四');