内链接查询,外链接查询,子查询,自关联查询

一对一:
 
一对多
使用场景:一个用户有多个订单,一个分类下有多个商品
使用:在多的一方建立外键,关联用户主键
建表原则:在多的一方建立外键,关联一的一方主键
 
多对多
使用场景:一个学生对应多个课程,一个课程可被多个学生选择
使用:建立第三张表至少有两列,作为两个外键分别关联学生的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 ('张三','李四');