一、外键:
1、作用:就是可以把多张表的关系联系起来。
2、解释:从表的外键对应的都是主表的主键。
3、要求:外键的大小、长度、类型必须与主键的一样。
4、给从表添加外键:
alter table 从表名 add constraint 外键名 foreign key(从表字段名) references 主表名(主表字段名);
注意:1、从表字段名定义的时候最好与主表主键名一样。
2、删除grade表里id为1那行数据,失败,因为它有外键关联,下面添加级联操作就好了。
5、删除外键:
alter table 表名 drop foreign key 外键名;
注意:1、这样删除会还有索引,不过没关系。
6、添加层叠关系,删除主键的数据,从表外键的数据也会删除:
alter table 从表名 add constraint 外键名 foreign key(从表字段名) references 主表名(主表字段名) on delete cascade;
7、添加set null关系,在删除主表的同时把相关联的从表数据都设为NULL:
alter table 从表名 add constraint 外键名 foreign key(从表字段名) references 主表名(主表字段名) on delete set null;
注意:1、删除主表grade id为1的数据,然后从表外键字段那个值为null。
二、DQL复杂查询(连接查询):
1、内连接查询:inner join 表名2 别名2 on 别名2.有关系字段名=别名1.有关系字段名 有条件就用where
例子1:把参加考试的同学信息查出来
select s.StudentName,r.StudentResult from student s inner join result r on r.StudentNo=s.StudentNo;
例子2:查询参加考试的同学信息(学号、姓名、科目、分数),注意一般先找到中间表
SELECT s.StudentNo,s.StudentName,sb.SubjectName,r.StudentResult FROM student s
INNER JOIN result r ON r.StudentNo=s.StudentNo
INNER JOIN `subject` sb ON r.SubjectNo=sb.SubjectNo;
解读:匹配原则,左表的每一行数据 与右表的每一行数据进行匹配,只要ON后面条件满足就把数据拿出来。
2、左外连接查询:left join 右表名 右别名 on 右别名.有关系字段名=左别名.有关系字段名 有条件加where
例子1:将所有同学全部查出来,不考试的也查出来
select s.StudentName,r.StudentResult from student s left join result r on r.StudentNo=s.StudentNo;
例子2:单独把缺考的学生查出来,就是在最后面加一个条件 where StudentResult is null;
解读:以左表为基准,右表的数据与左边一一匹配,匹配上直接显示,匹配不上的,左表有数据的字段名依然显示,右表的数据设置为null。
3、右外连接查询:道理一样,自己思考。
4、等值查询:
select s.StudentNo,s.StudentName,r.StudentNo,r.StudentResult from student s,result r where s.StudentNo=r.StudentNo;
解读:与上面内连接效果一样的。
5、子查询:一个完整的查询嵌套另一个完整的查询。
例子:查询课程为《高等数学-2》 且分数不小于80分的学生学号和姓名,注意思路是写三个select语句,想办法分级嵌套
select s.StudentNo,s.StudentName FROM student s
WHERE s.StudentNo IN( SELECT r.StudentNo FROM result r WHERE r.SubjectNo IN (
SELECT sb.SubjectNo FROM `subject` sb WHERE sb.SubjectName="高等数学-2"
) AND r.studentResult>=80);
三、视图:
1、概念:就是一个假表;
2、作用:直观,便于我们对数据进行观察。
3、创建视图:
create view 视图名 as select 字段名1,字段名2 from 表名;
注意:多少个字段名你自己加。
4、查看视图结构:desc 视图名;
5、查看视图全部数据:SELECT * FROM 视图名;
四、索引:
1、作用:方便快速查找;对sql的优化非常有帮助。
2、注意:
1、字段经常被当作查询对象操作才加索引。
2、一张表里面与其他表里面关系重合的,不适合加索引。
3、查看所有索引:
show index from 表名;
4、添加主键索引:
alter table 表名 add primary key(字段名(一般是id));
5、添加唯一索引:
alter table 表名 add unique(字段名);
注意:一张表可以有多个唯一索引,主键索引只能有一个。
6、添加全局索引:
alter table 表名 add index(表名);
7、删除索引:
alter table 表名 drop index 字段名;
五、触发器:
1、查看触发器:show triggers;
2、添加插入类型的触发器:
create trigger 触发器名 before insert on emp
for each row
insert into jixiao values(NEW.ename,NEW.esalary*0.5);
注意:插入数据的表的字段个数一定要大于或者等于被触发的表的字段个数。
#想emp表插入数据,jixiao表的数据也跟着变化
insert into emp(ename,esalary) value("Rain",200);
3、添加修改类型的触发器:
create trigger 触发器名 before update on emp
for each row
update jixiao set jmoney=NEW.esalary;
#emp修改一条数据,jixiao表也会变
update emp set esalary=500;
4、删除触发器:drop trigger 触发器名;
六、备份数据库的方法:
1、mysqldump -uroot -proot 表名 >d:/mysqlday2.sql
2、sqlyong 右击表名-->导出-->一sql转储文件-->选择路径即可。
七、顺序:
[where] [group by] [having] [order by] [limit]