MySQL多表关联及嵌套

1.多表之间的关联
  1.多表关联查询有相同的字段名,则必须在select 语句中明确字段的来源:表名.字段名
  2.表名(可以用别名).字段名
  3.笛卡尔乘积,解决方案:带where条件,将多表中相同含义的字段作为条件放入where
   实列:SELECTa.no,a.name,classid,report
           FROM report a,xueyuanxinxi b
           WHERE a.no=b.no;#笛卡尔乘积值是出现在未使用where条件语句之前
   
  4.多张表的关联避免笛卡尔乘积,其where条件的数量=表的数量-1
     实列:SELECTa.no,a.name,c.classid,report,kcmc#表里的字段名的数据
             FROM report a,xueyuanxinxi b,kcb c#表名的命名为a,b,c
             WHERE a.no=b.no AND a.classid=c.classid;
2.外连接查询:
 1. 条件:left/right/full + outerjoin
 2. 使用left顾左不顾右,right顾右不顾左,full两头相顾  
 3. 不使用where,使用ON才能显示,可使用where在后跟上,不能在ON之前出现
 4.目的:当多表数据不一致,查询中可能导致数据丢失,为了解决此问题。
 5. 实列:1.SELECT a.no,a.name,classid,report
             2.FROM report a left outerjoin xueyuanxinxi b
             3.ON a.no=b.no;
             4.Where 条件;
3.内连接:inner join   #可用where、on
 1. 实列:1.SELECT a.no,a.name,classid,report
             2.FROM report ainner join xueyuanxinxi b
             3.WHERE a.no=b.no
4.外键:foreignkey
  1.作用:保证两张表的数据一致
  2.创建前提:多张表的数据一致
  3.步骤:1.确定主、从表
             2.主表必须在关联字段上是主键(从表在关联字段上必须不是主键)
             3.由从表的非主键字段发起向主表的主键字段建立外键
             4.建立外键的字段在主、从表中要保持数据类型、长度一致(条件)
                格式:
                alter table 表名 addconstraint 约束名 约束类型………;
         
                实列:alter table score add constraintfk_score_stu_no foreign key(no)
                        references stu(no); #分行写,看的直观。
5.效果:
  1.从表不允许写入主表主键不存在的数据
     注:写数据必须先写主表,再写从表
   2.主表不允许修改或删除,从表中还存在的数据
     注:删数据必须先删从表,再删主表
6.WHERE嵌套:
   1. 语法格式:
       SELECT 字段名,... FROM 表名 WHERE NO IN
       (SELECT NO FROM 表名 WHERE 字段名=(SELECT (查询的需求) FROM 表名));
   2. 实列:1.SELECT NO,NAME,bir FROM stu WHERE NO IN
               2.(
               3.SELECT NO FROM report WHERE report=(SELECT MAX(report) FROM report)
               4.);  #分行写,看的直观。
   3.FROM 嵌套:
        语法格式:
        1.SELECT 表中的数据  FROM
        2.(SELECT 字段名,.... FROM 表名 WHERE 需求) a,
        3.(SELECT 字段名,.... FROM 表名 WHERE 需求) b
        4.WHERE 相同的数据相等;
   4. 实列:查询98后,考试80分以上的次数。代码堆积时,最好能分开写,确保正确性。
        1. SELECT a.no,a.name,b.classid,b.report FROM
        2.(SELECT NO,NAME,birFROM stu WHERE YEAR(bir)=1998) a,
        3.(SELECTNO,report,classid FROM report WHERE report>=80 GROUP BY NO)  b
        4.WHERE a.no=b.no
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南城猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值