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