day09

一、五大约束

1.1 主键约束

 特点:非空 唯一 一张表只能有一个主键

1.2 唯一约束

 1.关键字:unique
 2.特点:唯一  不重复 可以为空
 3.主键约束与唯一约束的区别
     A.主键约束一张表只能由一个   唯一约束一张表可以有多个
     B.主键约束不能为空          唯一约束可以为空
     C.唯一约束可以设置为联合唯一约束(多个列组成唯一约束)
 4.唯一约束创建的两种方法:
     A.创建表时候创建唯一约束
     B.创建表之后添加约束                 

第一种方法:

 CREATE DATABASE day09;
 USE day09;
 ​
 #创建表时候创建唯一约束
 CREATE TABLE p1(
     pid INT(11) PRIMARY KEY AUTO_INCREMENT,
     pname VARCHAR(20) UNIQUE
 );
 ​

第二种方法

 #添加唯一约束、
 ALTER TABLE p2 ADD UNIQUE(pname);
 语法:alter table 表名 add constraint 唯一约束的名称 unique(列名)
 #设置唯一约束的时候设置唯一约束的名称
 ALTER TABLE p2 ADD CONSTRAINT u_name UNIQUE(pname);
 语法:alter table 表名 drop index 唯一约束名(列名)
 #删除唯一约束
 ALTER TABLE p2 DROP INDEX pname;

联合唯一约束

 #联合唯一约束
 CREATE TABLE p3 (
     pid INT (11) PRIMARY KEY AUTO_INCREMENT,
      pname VARCHAR(20),
      page INT(10),
      UNIQUE(pname,page)
 ); 
 #验证联合唯一约束
 INSERT INTO p3(pname,page) VALUES("张三",15);

验证:

 

1.3 非空约束

 1.关键字;not null
 2.说明;在插入数据的时候必须插入数据,不能为空
 3.在创建表的时候进行设置
 ​
 #创建表的时候设置非空
 CREATE TABLE p4 (
     pid INT(11) PRIMARY KEY AUTO_INCREMENT,
     pname VARCHAR(20) NOT NULL
     
 );

1.4 默认约束

 1.关键字:default
 2.在创建表的时候进行设置
 3.作用:用于设置列的默认值
 4.说明:
     A.指定列设置默认值后,为插入数据,默认列显示默认值
     B.在插入数据后,插入default,也是默认值
     C.只有在插入不是默认值时候,才会替换掉默认值
      
#创建表设置默认值
CREATE TABLE p5(
	pid INT(11) PRIMARY KEY AUTO_INCREMENT,
	pname VARCHAR(20) DEFAULT "张三"
);

CREATE TABLE p6(
	pid INT(11) PRIMARY KEY AUTO_INCREMENT,
	pname VARCHAR(20) DEFAULT '张三'
);

在设置默认值时候,使用单引号和双引号都可以

二、表与表之间的联系

2.1简介

1.mysql是关系型数据库,表与表之间存在联系
2.表与表之间的关系:一对多 、多对一 、多对多
3.创建表之后添加外键

2.2 一对一的关系

#创建丈夫表
CREATE TABLE man(
	`mid` INT(11) PRIMARY KEY AUTO_INCREMENT,
	mname VARCHAR(20) 
	
);

#创建妻子表
CREATE TABLE women(
	wid INT(11) PRIMARY KEY AUTO_INCREMENT,
	wname VARCHAR(20),
	`mid` INT(11)
); 

语法:alter table 主表 add constraint 外键名 foreign key(`列名`) reference 副表名(`列名`)
#添加外键约束
ALTER TABLE women ADD CONSTRAINT fk_mid FOREIGN KEY(`mid`) REFERENCES man(`mid`);

注意点:

  • 设置外键的 ` 这个不是单引号,而是1旁边的那个

  • 设置外键一般都会有一个主表,相关联的外键所在的表为从表(子表),另外一个为主表

外键图

 

定义外键的规则:

  • 主表必须存在于数据库里面,或者主表正在创建。如果是后者,主表和从表是同一个表,这种表为自参照表,这个结构为自参照结构

  • 外键中的数据类型必须与主键里面的一致

  • 主表里面必须定义主键

2.3 一对多的关系

 

#创建部门表
CREATE TABLE dept(
	did INT(11) PRIMARY KEY AUTO_INCREMENT,
	dname VARCHAR(20)
);

#创建员工表
CREATE TABLE emp(
	eid INT(11) PRIMARY KEY AUTO_INCREMENT,
	ename VARCHAR(20),
	did INT(11)
);
#添加外键关系
ALTER TABLE emp ADD CONSTRAINT fk_did FOREIGN KEY (did) REFERENCES dept(did);

效果图

 

2.4 删除外键

  • 先删除外键外键

    语法:alter table 表名 drop foreign key 外键名(列名)
    例子:ALTER TABLE emp DROP FOREIGN KEY fk_eid
  • 删除外键的索引

 

2.5 多对多的关系

表设计--使用中间表来进行设计

 

 
#创建演员表
CREATE TABLE actor (
	aid INT(11) PRIMARY KEY AUTO_INCREMENT,
	aname VARCHAR(20)
);

#创建角色表
CREATE TABLE role (
	rid INT(11) PRIMARY KEY AUTO_INCREMENT,
	rname VARCHAR(20)
);

#创建中间表
CREATE TABLE a_r(
	a_r_id INT(11) PRIMARY KEY AUTO_INCREMENT,
	aid INT(11),
	rid INT(11)
);

#添加外键
#演员表和中间表
ALTER TABLE a_r ADD CONSTRAINT fk_aid FOREIGN KEY (aid) REFERENCES actor(aid);
#角色表和中间表
ALTER TABLE a_r ADD CONSTRAINT fk_rid FOREIGN KEY (rid) REFERENCES role(rid);

效果图

 

四、 三大泛式

1.三大范式:用来约束数据库的,保证数据的完整性,以及正确性
2.三大范式:
	A.第一大范式:表中的每一列都是最小的原子单位,不能在进行拆分
	B.第二大范式:每一张表里面只能描述一种事物
	C.在遵从前面的两个范式的基础上,不能出现局部依赖,只能与主键建立依赖关系

第一大范式:

 

第二大范式:

 

第三大范式:

 

五、多表查询

5.1 素材

创建表

#创建学生表
CREATE TABLE student(
	pid INT(11) PRIMARY KEY AUTO_INCREMENT,
	pname VARCHAR(20),
	page INT(5),
	psex CHAR(2) ,
	sid int(11)
	
);
#创建学科表
CREATE TABLE `subject`(
	sid INT(11) PRIMARY KEY AUTO_INCREMENT,
	sname VARCHAR(20),
	sGPA INT(2)
);

添加数据:

#学生表插入数据
INSERT INTO student(pname,page,psex,sid) 
VALUES("罗志祥",25,'男',1),("林伟翔",22,'男',1),
("林伟翔",22,'男',2),("刘佳",15,'女',2),
("薛之谦",25,'男',2),("徐至琦",25,'女',3),
("张三",18,'男',3),("欧巴",35,'女',4);

#学科表插入数据
INSERT INTO `subject`(sname,sGPA ) VALUES("java",4),("c语言",3),("瑜伽",2),("网球",2);

5.2 表结构

 

5.3 非等值查询

1.语法:select * from 表1,表2
2.案例:
	#查询学生以及学生的学科
	select * from 表1,表2
	SELECT stu.*,sub.*  FROM student stu,`subject` sub;
3.问题:
	出现了笛卡尔乘积的现象

     

 

5.4 连接查询

5.4.1 显示内连接

 1.关键字:inner join 这个来进行连接 这就是显示内连接
 2.语法:select * from 左表 inner join 右表 on 关联条件
         #查询所有学生信息和学科名字
         SELECT stu.*,sub.sname,sub.sGPA FROM student stu INNER JOIN `subject` sub  ON stu.sid=sub.sid;
         

取值范围:

 

5.4.2 隐式外连接

 1.关键字:inner join 来进行查询连接
 2.语法:select * from 左表 inner join 右表  where 关联条件
 3.案例:
     #查询所有学生信息和学科名字(隐式外连接)
     SELECT * FROM student stu INNER JOIN `subject` sub WHERE stu.sid= sub.sid;

5.5 左连接

 1.语法:select * from 左表 left join 右表 on 匹配规则
 2.匹配规则:以左表为基准,右表一一匹配,如果匹配成功,两行进行显示,匹配没有成功,左表依然显示,右表设置           为null
 3.案例:
     #不管这么学科是否有这个学生,查询所有的学科的信息
     SELECT sub.*,stu.* FROM `subject` sub LEFT JOIN student stu ON sub.sid = stu.sid;

 

5.6 右外连接

 语法:select * from 左表 right join 右表 on 匹配条件
 2.匹配规则:以右表为基准,左表一一匹配,如果匹配成功,两行进行显示,匹配没有成功,右表依然显示,左表设置           为null
 3.案例:
     #不管是否有这门学科,查询所有的学生的信息
     SELECT * FROM `subject` sub RIGHT JOIN student stu ON sub.sid=stu.sid;

 

取值部分

 

5.7 子查询

 1.概念:一个完成的查询语句嵌套另外的一个查询语句
 2.两中体现:
     A.一个查询的结果当作另外一个查询语句的查询条件0
     B.一个查询语句的结果当作当前的查询语句的列来使用
 3.第一种体现:
     #查询java学课下的所有的学生
     A.查询所有的学生   select * from student  
     B.查询java学科      select * from ·subject· sub where sub.sname=“java”;
     select * from student stu where stu.sid in(select sub.sid from  `subject` sub where         sub.sname=“java”)
 4.第二种体现:
     #查询所有的学生以及选的学科
     A.查询所有的学生信息     select * from student  
     B.查询学科              select * from `subject` 
     C.两个的关联:sid
     SELECT stu.*,(SELECT sub.sname FROM `subject` sub WHERE stu.sid=sub.sid) as sname FROM              student stu;

六、多表的查询

6.1 备份与还原

6.1.1 第一种方法 使用dos窗口来进行备份与还原

 1.备份:
     指令:mysqldump -u用户名 -p密码  数据库的库名  >  备份存放的地址
 2.还原
     指令:mysql -u用户名 -p密码 数据库名 <  备份文件存放的地址

备份:

 

还原:

 

6.1.2第二种方法 可视化工具

备份:

 

还原:

 

6.2 素材

 

6.3 表结构

6.4 多表查询

 #查询参加了考试的同学信息(学号、学生姓名、科目编号、分数)
  SELECT stu.StudentNo,stu.StudentName,r.SubjectNo,r.StudentResult
   FROM student stu 
   INNER JOIN result r
    ON stu.StudentNo=r.StudentNo;
    
 #查询参加了考试的同学信息(学号、学生姓名、科目名称、分数)
 SELECT stu.StudentNo,stu.StudentName,sub.SubjectName,r.StudentResult 
 FROM student stu 
 INNER JOIN result r ON stu.StudentNo=r.StudentNo 
 INNER JOIN `subject` sub ON r.SubjectNo=sub.SubjectNo;
 ​
 ​
 #查询出了所有同学,不考试的也查出来(应该使用左连接) 关键字 left join on 匹配规则
 SELECT stu.StudentNo,stu.StudentName,r.StudentResult 
 FROM student stu 
 LEFT JOIN result r ON stu.StudentNo=r.StudentNo;
 ​
 #查一下缺考的同学(没有成绩)
 SELECT stu.StudentNo,stu.StudentName,r.StudentResult 
 FROM student stu 
 LEFT JOIN result r ON stu.StudentNo=r.StudentNo 
 WHERE r.StudentResult IS NULL;
 ​
 #思考题:查询参加了考试的同学信息(学号、学生姓名、科目名、分数)
 SELECT stu.StudentNo,stu.StudentName,sub.SubjectName,r.StudentResult 
 FROM student stu 
 INNER JOIN result r ON stu.StudentNo=r.StudentNo
 INNER JOIN `subject` sub ON r.SubjectNo= sub.SubjectNo;
 ​
 # 查询《数据库结构-1》的所有考试结果,并按成绩由高到低排列(升序asc 降序desc)
 SELECT sub.SubjectName,r.StudentResult  
 FROM result r 
 INNER JOIN `subject` sub ON r.SubjectNo=sub.SubjectNo 
 WHERE sub.SubjectName="数据库结构-1"
 ORDER BY r.StudentResult DESC;
 ​
 #查询所有课程《数据库结构-2》的考试成绩,并按照由高到低的显示,同时把该成绩对应的学生的学号、姓名打印出来
 SELECT stu.StudentNo,stu.StudentName,r.StudentResult
  FROM student stu 
  INNER JOIN result r ON stu.StudentNo=r.StudentNo
  INNER JOIN `subject` sub ON r.SubjectNo =sub.SubjectNo
  WHERE sub.SubjectName="数据库结构-2"
  ORDER BY r.StudentResult DESC;
 ​
  #查询课程为《高等数学-2》且分数不小于80分的学生的学号和姓名
  SELECT stu.StudentNo,stu.StudentName,r.StudentResult
  FROM student stu 
  INNER JOIN result r ON stu.StudentNo=r.StudentNo
  INNER JOIN `subject` sub ON r.SubjectNo=sub.SubjectNo
  WHERE sub.SubjectName="高等数学-2" AND r.StudentResult >=80; 
  
 #案例 :查询《C语言-1》的前5名学生成绩信息(需要进行排序:关键字:order by 升序(asc) 降序(desc))
 SELECT stu.StudentNo,stu.StudentName,r.StudentResult
 FROM student stu 
 INNER JOIN result r ON stu.StudentNo = r.StudentNo
 INNER JOIN `subject` sub ON r.SubjectNo = sub.SubjectNo
 WHERE sub.SubjectName="C语言-1"
 ORDER BY r.StudentResult DESC
 LIMIT 0,5;
 ​
 #查询课程为《JAVA第一学年》成绩前10名分数大于80的学生信息(学号,姓名,课程名,分数)
  SELECT stu.StudentNo,stu.StudentName,sub.SubjectName,r.StudentResult
  FROM student stu 
  INNER JOIN result r ON stu.StudentNo=r.StudentNo
  INNER JOIN `subject` sub ON r.SubjectNo = sub.SubjectNo
  WHERE sub.SubjectName="JAVA第一学年" AND r.StudentResult>80
  ORDER BY r.StudentResult DESC 
  LIMIT 0,10;
  
 #按照不同的课程,分别算出其平均分、最高分和最低分,对于低于60分平均分的不予显示(使用左连接 需要进行分组,之后进行过滤)
 SELECT sub.SubjectName AS "课程名称",
 ROUND(AVG(r.StudentResult),2) AS "平均分",
 MAX(r.StudentResult) AS "最高分",
 MIN(r.StudentResult) AS "最低分" 
 FROM `subject` sub 
 LEFT JOIN result r ON sub.SubjectNo=r.SubjectNo
 GROUP BY sub.SubjectName
 HAVING AVG(r.StudentResult)>=60;
 ​
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一个胖小白

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

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

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

打赏作者

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

抵扣说明:

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

余额充值