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