MySQL多表

一、外键约束

多表的概念_外键约束:

1、外键:'从表中'引用'主表中'主键字段的字段。
2、外键字段的取值的特点:
    1).允许为NULL
    2).可以重复;
    3).所有的值,必须在主表的主键中出现。
3、创建外键约束:
    alter table 从表 add [constraint] [外键名称] foreign key (从表外键字段名) references 主表 (主表的主键);
    示例:
    ALTER TABLE emp ADD CONSTRAINT fk_emp FOREIGN KEY (deptId) REFERENCES dept (deptId);

二、多表查询:

1、内连接:也叫:等值连接。结果:两个表中的"等值部分"的记录
    A).隐式内连接【常用】:
        select 字段列表 from 表1 , 表2 where 两个表的等值条件 and 其它条件 and ...;
        示例:
        SELECT * FROM product,category WHERE product.cid = category.cid;
       1).from 表1,表2:表1和表2的顺序可以随意,会影响结果的列的排列顺序,但不会影响结果。
       2).where 两个表的等值条件:等号两边的左右位置也可以随意。
       3).select 字段列表:字段列表可以来自于两个表,如果两个表中的字段没用同名的,那么可以不使用"表名限定",
          但如果两个表中有同名字段,必须使用"表名限定";建议:使用"表名限定"。
          可以为"表"起个"别名",之后可以使用"别名"来限定:
        SELECT p.pname,p.price,c.cname FROM product p,category c WHERE p.cid = c.cid;
       4).练习:查询电脑类商品,要同时显示类别名称:
        SELECT * FROM product p,category c WHERE p.cid = c.cid AND c.cname = '电脑';
    B).显示内连接:
        select 字段列表 from 表1 INNER JOIN 表2 ON 两个表的等值关系 where 其它条件 and ... and ...;
        示例:
        SELECT * FROM product p INNER JOIN category c ON p.cid = c.cid WHERE c.cname = '电脑';
    C).两种连接的写法说明:
        1).select * from 表1 , 表2 ON 两个表的等值关系;//错误
        2).select * from 表1 INNER JOIN 表2 where 两个表的等值关系;//OK的
2、外连接:
    A).左外连接:查询出左表的所有记录 + 右表的等值记录
        select 字段列表 from 表1 LEFT JOIN 表2 ON 两个表的等值关系;
        示例:
        SELECT * FROM product p LEFT JOIN category c ON p.cid = c.cid;
    B).右外连接:查询出右表的所有记录 + 左表的等值记录
        select 字段列表 from 表1 RIGHT JOIN 表2 ON 两个表的等值关系;
        示例:
        SELECT * FROM product p RIGHT JOIN category c ON p.cid = c.cid;

三、三表联查:

#隐式内连接:
    select * from 表1,中间表,表2 where 表1和中间表的等值关系 and 中间表和表2的等值关系;
    例如:
    SELECT * FROM orders o , order_product op , product p 
        WHERE o.oid = op.oid AND op.pid = p.pid 
        AND o.orderDate = '2018-01-30' 
        ORDER BY o.orderNO;
#显示内连接:
    select * from 表1 INNER JOIN 中间表 ON 中间表和表1的等值关系
              INNER JOIN 表2 ON 中间表和表2的等值关系
    例如:

    SELECT * FROM orders o INNER JOIN order_product op ON o.oid = op.oid
                   INNER JOIN product p ON op.pid = p.pid
                   WHERE o.orderDate = '2018-01-30' 
                   ORDER BY o.orderNO;
#左外连接
    select * from 表1 LEFT JOIN 中间表 ON 中间表和表1的等值关系
              LEFT JOIN 表2 ON 中间表和表2的等值关系
    例如:
SELECT * FROM orders o LEFT JOIN order_product op ON o.oid = op.oid
               LEFT JOIN product p ON op.pid = p.pid
               WHERE o.orderDate = '2018-01-30' ORDER BY o.orderNO;
#右外连接
    select * from 表1 RIGHT JOIN 中间表 ON 中间表和表1的等值关系
              RIGHT JOIN 表2 ON 中间表和表2的等值关系
    例如:
SELECT * FROM orders o RIGHT JOIN order_product op ON o.oid = op.oid
               RIGHT JOIN product p ON op.pid = p.pid
               ORDER BY o.orderNO;

四、五表联查:

#隐式内连接
SELECT u.uname,p.pname FROM USER u,user_role ur,role r,role_privilage rp,privilage p 
    WHERE u.uid = ur.userId AND
         ur.roleId = r.rid AND
         r.rid = rp.roleId AND
         rp.privilageId = p.pid
#显示内连接:
SELECT u.uname,p.pname FROM  USER u INNER JOIN user_role ur ON u.uid = ur.userId
        INNER JOIN role r ON ur.roleId = r.rid
        INNER JOIN role_privilage rp ON r.rid = rp.roleId
        INNER JOIN privilage p ON rp.privilageId = p.pid;
#左外连接
SELECT u.uname,p.pname FROM  USER u LEFT JOIN user_role ur ON u.uid = ur.userId
            LEFT JOIN role r ON ur.roleId = r.rid
            LEFT JOIN role_privilage rp ON r.rid = rp.roleId
            LEFT JOIN privilage p ON rp.privilageId = p.pid;
#右外连接
SELECT u.uname,p.pname FROM  USER u RIGHT JOIN user_role ur ON u.uid = ur.userId
            RIGHT JOIN role r ON ur.roleId = r.rid
            RIGHT JOIN role_privilage rp ON r.rid = rp.roleId
            RIGHT JOIN privilage p ON rp.privilageId = p.pid;

五、子查询:

1).查询价格高于"劲霸"的商品:
    select * from product where price > (select price from product where pname = '劲霸')
2).概念:写在一个查询内部的查询就是:子查询。
3).作用:
    1).作为外部查询的"查询条件"
    2).作为外部查询的"虚拟表"
4).示例:
    1).查询条件的示例:查询所有的电脑、服装类商品
        select * from product where cid in (select cid from category where cname in ('电脑','服装'));
    2).作为虚拟表:查询所有的电脑、服装类商品
        select * from product p,category c where p.cid = c.cid and c.cname in ('电脑','服装');
        使用子查询:
        select * from product p,(select * from category where cname in('电脑','服装')) c where p.cid = c.cid;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容

  • MySQL的多表操作 1 多表关系 MySQL多表之间的关系可以概括为:一对一、一对多/多对一关系,多对多 1.1...
    AdRainty阅读 215评论 0 1
  • 一、多表查询: 1.1首先准备两张表来用作举例: # 创建部门表 CREATE TABLE dept( id IN...
    小陈工阅读 647评论 0 1
  • 1. 多表查询 2. 事务 3. DCL ## 多表查询: * 查询语法: select 列名列表 from 表名...
    吕游_b601阅读 618评论 0 0
  • 在设计数据库时,一般而言要求遵循数据库三范式(3 NF)(面试题)1、设计的字段具有原子性(字段具有不可分割性)2...
    LoseDemon阅读 1,084评论 0 0
  • 来自拉钩教育-JAVA就业集训营 1. 多表 2. 多表关系设计 3. 多表查询 4. 子查询 (SubQuery...
    Yuanc丶阅读 581评论 0 0