第一节 MySQL 数据库(二)

MySQL数据库(二)

1. MySQL字段约束(引)

  • 上一遍文章中已经学过mysql的 三种约束,主键约束,非空约束,唯一约束 那么还有第四种约束,外键约束。

1.1 外键约束

  1. 外键约束(Foreign Key) 即:数据库中,两个数据表之间的, 通过 某个列 建立的一种联系。

    • 例如:公司的 部门表,和员工表 之间的关系。

1.2 外键创建的条件

  1. 外键的数据类型必须与主键的数据类型保持一致。
  2. 从表里的外键通常为主表的主键。
  3. 最重要的一点: 创建外键的表和列要存在。

1.3 外键创建的语法

  1. mysql支持创建表之后在创建外键。
    • 创建表时添加外键 foreign key(需要加外键表的字段) references 主表名(主表字段)
      在建立外键关系后,MySQL数据库会约束上述两种行为,每次对数据进行插入或者删除时,都会检查数据完整性,使得我们的操作必须符合实际情况。

第一节 MySQL 数据库(二)_第1张图片

1.4 导入empdb2数据测试

第一节 MySQL 数据库(二)_第2张图片

  1. 无外键关联,删除主表部门表数据,从表员工表是否发生变化。

    • 删除主表数据,从表无变化,这样导致后果,数据 完整性和一致性 不存在。
      第一节 MySQL 数据库(二)_第3张图片
  2. 先恢复数据,然后添加外键关联有外键关联之后,操作主表数据。

    • 添加外键关联,在创建表之后添加,比较麻烦一些。
  命令: alter table 需加外键的表 add constraint 外键名 foreign key(需加外键表的字段名) referencnes 关联表名(关联字段名);
 -- 注意:外键名不能重复,按照规范(fk_主表_从表)
	 alter table employ add constraint fk_deparment_employ foreign key(dep_id) references department(id);

	删除外键:
	  alter table employ drop foreign key fk_deparment_employ;

第一节 MySQL 数据库(二)_第4张图片

2. 表关系设计

  1. 常见的表关分为以下3种:
    • 一对多(多对一), 一对一,多对多

2.1 一对多(多对一)

  1. 一对多(也叫多对一) :是数据表中最常见的一种关系。
    • 如同:班级与学生之间的关系, 一个班级可以有多个学生;而一个学生不能属于多个班级只属于某一个班级。
    • 方案设计:在一对多的表关系中,应将外键设在多的一方 ,以免造成数据的冗余。
      第一节 MySQL 数据库(二)_第5张图片

2.2 一对一

  1. 一对一 :在开发过程中,一对一的关联关系很少见;
    • 方案设计: 但是这种方式存储的信息通常会放在同一张表中。
      第一节 MySQL 数据库(二)_第6张图片

2.3 多对多

  1. 多对多 :在开发过程中,多对多的关联关系在数据库中也能看见;
    • 如同: 多对多是数据表中常见的一种关系。例如:学生与老师之间的关系,一个学生可以有多个老师而且一个老师有多个学生。
    • 方案设计: 通常情况下,为了实现这种关系需要定义一张中间表(亦称为连接表)该表会存在两个外键分别参照老师表和学生表。

第一节 MySQL 数据库(二)_第7张图片

3. 多表查询

在练习之前需要先导入数据
第一节 MySQL 数据库(二)_第8张图片

3.1 连接查询

  1. 查询: 部门和部门对应员工信息

    • 提示: 多表查询时,表和表之间用 “,” 逗号分隔。
    --  相同的id怎么指定!? id = dep_id ?
    	select * from employ ,department where department.id = employ.dep_id;
    

    第一节 MySQL 数据库(二)_第9张图片

3.2 左外连接查询

  1. 查询: 所有部门和部门对应员工,主要显示部门表如果部门没有员工,员工就显示为null

    • 语法格式: left join ... on 主要显示左表的数据。
    	select *from department left join employ on  department.id = employ.dep_id;
    

第一节 MySQL 数据库(二)_第10张图片

3.3 右外连接查询

  • 查询: 所有部门和部门对应员工,主要显示员工表 如果员工没有对应部门,部门就显示为null

    • 语法格式: right join ... on。 主要显示右表的数据
      select * from department right join employ on  department.id= employ.dep_id;
    

第一节 MySQL 数据库(二)_第11张图片

3.4 子查询

  • 需要导入新的数据库进行练习 empdb4
    第一节 MySQL 数据库(二)_第12张图片
  1. 查询: 列出薪资比“徐三”高的所有员工,显示姓名,薪资 。

    • 提示:思考怎么分步骤解决问题。
    -- 提示 可以先得到徐三的薪资,然后再查询比徐三高的即可。
    	select emp_name,salary from employ where salary>(select salary from employ where emp_name="徐三");
    

    第一节 MySQL 数据库(二)_第13张图片

  2. 查询: 列出与“冯宝宝”从事相同职位所有员工,显示姓名,职位 。

    • 提示:分步骤思考问题。
    select emp_name,job from employ where job =(select job from employ where emp_name="冯宝宝");
    

    第一节 MySQL 数据库(二)_第14张图片

  3. 查询: 列出薪资比“财务部”部门编号(30)所有员工薪资都高的员工信息,显示姓名,薪资,部门名称 。

    • 提示:要知道财务部薪资最高的员工是谁? 还要注意 null 部门的人薪资是否也大于财务最高薪资?
    	-- 先查询财务部最高薪资的人是谁?只要比他高即可。
    		select max(salary) from employ where dep_id =30;  
    
    	--  需要注意的是,用子查询还是 外连接查询? 以部门表为主,还是员工表为主!?
    
    		select emp_name,salary ,dep_namefrom employ left join department on employ.dep_id = department.id; 
    
    	--合并前2步骤:
    	
    		select emp_name,salary ,dep_name from employ left join department on employ.dep_id =  department.id 
    		where salary>(select max(salary) from employ where dep_id =30);
    
    

    在这里插入图片描述

4. 练习: 多表查询

  1. 查询: 列出在 “销售部” 任职的员工,假设不知道销售部门编号,显示部门名称和员工名称 。

    • 提示: 两张表连接查询。 不只一种方法!!
    select emp_name,dep_name from department,employ 
    	where department.id = employ.dep_id and dep_name="销售部";
    

    第一节 MySQL 数据库(二)_第15张图片

  2. 查询: (自查询)列出在 所有员工及其直接上级 ,并显示员工姓名,上级编号 上级姓名。
    - 提示: 一个表能查询两次么!? 能,需要起别名。

    	-- 分析一下,有的员工即使员工又是上级。 
    	-- 需要关注的  employ e1 员工表     employ  e2 上级表
    	--  关联条件  e1.id = e2.topid;
    
    select e1.emp_name,e2.topid ,e2.emp_name from employ e1,employ e2 
    	where e1.id = e2.topid;
    

    第一节 MySQL 数据库(二)_第16张图片

  3. 查询: 列出最低薪资,大于1500的各种职位,显示职位和该职位最低薪资

    • 提示: 首先列出所有职位的最低薪资,然后再求出每一个职位薪资大于1500。
    • 分组使用group by 后面接的筛选 ?having
	-- 求出每个职位的最低薪资。
	1.   select min(salary),job from employ group by job;

	--错误想法  分组之后 where 筛选不能接多行函数。
	 select min(salary),job from employ group by job 
	 		where min(salary) >1500;

	-- 正确  使用having关键字。
	select min(salary),job from employ group by job 
		having min(salary) >1500;

第一节 MySQL 数据库(二)_第17张图片

  1. 查询: 列出每个部门就职的员工数量,平均工资。 显示,部门编号,员工数量,平均薪资

    • 提示: 列出每个部门的,group by dep_id 需要以部门相同的分组。
    	1. select avg(salary),count(*) ,dep_id from employ 
    	 group by dep_id;
    

    第一节 MySQL 数据库(二)_第18张图片

4.1 扩展练习 20分钟:加强版分析

  1. 查询: 列出受雇日期早于直接上级,并显示员工的编号,姓名,部门名称。

    • 提示: 这里就需要查询三张表, 第一个员工表,第二个 上级表,第三个部门表。
    • 提示2: 受雇时间早于 相当于比较的话 e1.hdate< e2.hdate;
    • 提示3: 查询的显示 员工编号, 员工姓名, 部门名称。
    -- 需要自查询 和  多表查询
    	-- 查询表 员工表 employ e1    上级表employ e2    部门表 department 
    	-- 查询连接条件? e1.topid=e2.id        e1.dep_id = department.id
    	-- 筛选条件?  
    	-- 查询列名?
    
    
    

    第一节 MySQL 数据库(二)_第19张图片

  1. 查询: 列出每个部门薪资最高的员工信息, 显示部门编号,薪资,员工姓名。

    • 提示: 可以将查询的结果单独当做一张表。返回employ去查询。
     1. 想法正确,但是实际错误  name哪个就不对。
     	错误: 	select max(salary), dep_id,name from employ group by dep_id;
     	 
     	 因为人名就拿每一个分组的第一个人名,但是实际不是....   那么怎么求人名
    
    

第一节 MySQL 数据库(二)_第20张图片
第一节 MySQL 数据库(二)_第21张图片

1. 如何正确处理  name人名。--select max(salary), dep_id from employ group by dep_id; 将该查询结果当成一个表。
	 
	

第一节 MySQL 数据库(二)_第22张图片

5. 扩展了解: 数据库备份与恢复操作

5.1 备份数据库

  1. 使用Dos命令窗口,注意是未登录状态下,备份一个数据库。

    • mysqldump -u用户名 -p 数据库名称 > 备份文件位置
		操作:如 将数据库mydb 备份到D:/ mydb/mydb.sql文件中。
			1. mysqldump -uroot -p mydb > D:/mydb/mydb.sql
		如果没有提示则备份成功。
		

在这里插入图片描述

  1. 使用Dos命令窗口,注意是为登录状态下,备份多个数据库。

    • mysqldump -u用户名 -p --all-database > 备份文件位置
    		操作:如 将数据库mydb 备份到D:/mydb/mydb.sql文件中。
    		1.	mysqldump -uroot -p --all-databases > D:\all.sql
    
    		如果没有提示则备份成功。
    		
    

    在这里插入图片描述

5.2 恢复数据库

  1. 恢复单个数据库,首先你需要有数据库,假设没有可以先创建任意一个相同类型的数据库在恢复。
    • mysqldump -u用户名 -p 数据库名称 < 备份文件位置
		操作: 恢复 D:/ mydb/mydb.sql文件中。到 mydb1中
			1. create database mydb1 charset utf8;   --创建的恢复数据库名称
			1.1 mysql -uroot -p mydb1 < D:/mydb/mydb.sql
		
		假设恢复数据库和已知不同名称。
		

cb2f8184fd99add51f7163c3926.png)

  1. 恢复单个数据库第二种方式,首先你需要有数据库,在登录状态下进行恢复。

    • source D://mydb//mydb.sql
    • 先创建,在进入,在恢复。
    1.在登录状态下,创建恢复的数据库
    	create database mydb3 charset utf8;
    	use  mydb3;
    
    2.恢复动作	source D://mydb//mydb.sql
    

6. 可视化软件的使用

6.1 啥叫可视化软件

  1. 早期使用windows的时候会发现,你可使用dos命令窗口去新建文件,包括:复制,拷贝,删除等动作,但是为了操作方便,出现了windows 操作界面,你可以使用鼠标操作系统,用眼睛直接能看见。
  2. 现在的 数据库也是如此,大部分使用Dos命令窗口操作,但是也是不那么方便,所以类似于窗口的可视化的软件就应运而生。 如 SQLyog , Navicat 等等。

6.2 Navicat 图像化软件

  1. 可以连接市面上大多数数据库,只要你能想的到的,关系型数据库,都可以使用。
    • 使用Dos操作数据库的功能,Navicat都可以。
    • 增加,删除,修改,查询,关于数据库,表,都可以。

6.3 扩展内容—操作软件

  1. 创建数据库,右键新建数据库, 数据库名称,和字符集。
    第一节 MySQL 数据库(二)_第23张图片
  2. 创建表,相当于create table ... 关联外键时,需要参考外键关联表,需要两张表都建立好,之后在建立外键。
    第一节 MySQL 数据库(二)_第24张图片
    第一节 MySQL 数据库(二)_第25张图片
  3. 插入数据,注意栏目星号位置。星号位置处于下方,才保存上一条数据。
    第一节 MySQL 数据库(二)_第26张图片
  4. 操作语句。

第一节 MySQL 数据库(二)_第27张图片

  1. 其他操作,省略…

你可能感兴趣的:(数据库从入门到深入,mysql,数据库,sql)