mysql学习记录


数据定义语言(Data Definition Language)DDL

	CREATE 定义数据库实体结构

	ALTER 修改数据库实体结构

	DROP 删除数据库实体

	TRUNCATE 删除数据库实体的记录

数据操纵语言(Data Manipulation Language)DML

	INSERT

	UPDATE

	DELETE

数据查询语言(Data Query Language)DQL

	SELECT	

数据控制语言(Data Control Language)DCL

	GRANT

	REVOKE

事务控制语言(Transaction Control Language)TCL

	COMMIT

	ROLLBACK

	SAVEPOINT








条件查询:

	select colomn[0],colomn[1]...
	form [table]
	where 条件
	
	- 常见条件运算符
		- > < = <>(!=) >= <= between...and... (not)in
		- 条件可用 and or not链接
		- ()可以改变优先级 不确定运算符的优先级时可以添加(),有()一定先执行
		- 模糊查询 like
		
	- betwenn ... and ...
		- 用于数字查询是前后都是闭区间
		- 用于字母的查询是前开后闭(几乎不用)
		
	- is (not) null
		- null表示空值,什么也没有,和0含义不同 0!=null
		- 语法只能用 x is null, 不能是 x = null
		
	- in 等同于 or
		- x=a or x=c --> x in (a, c)
		
	- like
		- 两个特殊符号
			- % 任意多个字符
			- _ 任意一个字符
			
		- eg:
			- 名字中含有o
				select ename form emp where ename like '%o%';
			- 第二个字母是a
				select ename from emp where ename like '_a%';
				
		- 查找的内容中包含特殊字符的用转义符"\"
			- '\_' '\%' 表示普通的_ 和 %
			- 查找含有_的名字
				select ename from emp where ename like '%\_%';
		
		
		
排序:
	order by... (默认升序)
	
	- 语句
		select ...
		form...
		order by [排序字段]
		
	- 指定升降序状态
		- asc 升序
		- desc 降序
		- select ename, sal from emp order by sal asc;
		- select ename, sal from emp order by sal descsc;
		
	- 多条件排序
		- 按照工资降序排序,工资相同按名字的升序排序
			select ename,sal from emp order by sal desc, ename asc;
		- 后面的字段起作用 当且仅当前面的条件相等
		- 越靠前的字段越能起到主导作用,只有前面的字段无法排序时,才会使用后面的字段排序
	
	- order by [index](不建议使用,表结构改变时语句无效)
		- 按照选取的列的第几列排序
		- select ename, sal from emp order by 2 descsc; 表示使用sal降序排列
		
	- 找出工作岗位是salesman的员工,按照工资的降序排列
		select ename, job, sal
		from emp
		where job='salesman'
		order by sal desc;
		
		- 执行顺序
			select ename, job, sal		3
			from emp                    1
			where job='salesman'		2
			order by sal desc;			4
			
			- order by 最后执行




分组函数(多行处理函数)(聚合函数):
	
	count 计数
	sum 求和
	avg 平均数
	max 最大值
	min 最小值
	
	- 跨行计算
	- 分组函数都是对某一组数据进行操作的
	- 输入多行 输出一行
	- 只有五个
	- 分组函数不可以直接使用在where后 !!!
	
	- 工资总和
		select sum(sal) from emp;
	- 最高工资
		select max(sal) from emp;
		
	- 分组函数自动忽略null !!!
		+-------+--------+-----------+------+------------+---------+---------+--------+
		| EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
		+-------+--------+-----------+------+------------+---------+---------+--------+
		|  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
		|  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
		|  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
		|  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
		|  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
		|  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
		|  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
		|  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |
		|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
		|  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
		|  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |
		|  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
		|  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
		|  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
		+-------+--------+-----------+------+------------+---------+---------+--------+
		
		- select count(comm) from emp;	
			+-------------+
			| count(comm) |
			+-------------+
			|           4 |
			+-------------+
			
	- count(*) 统计总记录条数
	- count(comm) 统计字段里不为null的数量
	
	
	
	
单行处理函数:

	- 不跨行计算
	- 输入一行,输出一行
	
	- 计算每个员工的年薪
		select ename, (sal+comm)*12 as yearsal from emp;
	
	- 在所有的数据库中,运算式中只要含有null 结果一定为null !!!!!!!
	
	-  处理含有null的数据用 ifnull()函数
		- ifnull(可能是null的数据,null替换成什么)
		- select ename, (sal+ifnull(comm, 0))*12 from emp;
		
		
group by 和 having:

	- group by : 按照某个或者是某些字段进行分组
	- having :对分组之后的数据进行再次过滤
	
	- 查询每个工作岗位的最高薪资
		select max(sal) from emp group by job;
	
	注意: 
		分组函数一般都会和group by连用,这也是其被称分组函数的原因 !!!!
		每一个分组函数都是在group by结束之后才会执行
		当sql语句中没有group by时,整张表自成一组
		
		
		!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		所以where不能和分组函数连用:
			- 分组函数只能在group by之后执行
			- group by 在where 之后执行 如果where后有分组函数 此时还没有进行分组所以会报错
			- where > group by > max
			- 必须先分组,才能使用分组函数
			- 当sql语句中没有group by时,整张表自成一组,默认分为一组
			- 执行顺序
				select ...		5
				from ...		1
				where ...		2
				group by...		3
				having ...		4
				order by...		6
		!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		
	- 找出工资高于平均工资的员工
		- 	嵌套查询
			select ename, sal from emp where sal > (select avg(sal) from emp);
			
	- 语句中有group by时,select后只能跟分组函数和参与分组的字段 !!!!!!!!!!!!!!
		- 每个工作岗位的平均薪资
			select job, avg(sal) from emp group by job;
				+-----------+-------------+
				| job       | avg(sal)    |
				+-----------+-------------+
				| ANALYST   | 3000.000000 |
				| CLERK     | 1037.500000 |
				| MANAGER   | 2758.333333 |
				| PRESIDENT | 5000.000000 |
				| SALESMAN  | 1400.000000 |
				+-----------+-------------+
	
	- 多个字段联合分组
		- 案例:找出每个部门不同工作岗位的最高薪资
			select deptno, ename, max(sal) from emp group by deptno, job;
			+--------+--------+----------+
			| deptno | ename  | max(sal) |
			+--------+--------+----------+
			|     10 | MILLER |  1300.00 |
			|     10 | CLARK  |  2450.00 |
			|     10 | KING   |  5000.00 |
			|     20 | SCOTT  |  3000.00 |
			|     20 | SMITH  |  1100.00 |
			|     20 | JONES  |  2975.00 |
			|     30 | JAMES  |   950.00 |
			|     30 | BLAKE  |  2850.00 |
			|     30 | ALLEN  |  1600.00 |
			+--------+--------+----------+
		
		
	案例:找出每个部门的最高薪资,显示大于2900的数据
		1. 找出每个部门最高薪资
			select max(sal) from emp group by deptno;
				+----------+--------+
				| max(sal) | deptno |
				+----------+--------+
				|  5000.00 |     10 |
				|  3000.00 |     20 |
				|  2850.00 |     30 |
				+----------+--------+
		2. 显示大于2900.
			select max(sal) from emp group by deptno having max(sal) > 2900; 
				+----------+--------+
				| max(sal) | deptno |
				+----------+--------+
				|  5000.00 |     10 |
				|  3000.00 |     20 |
				+----------+--------+
			注意:该方式效率低 要求两次最大值
		3. 最优方法
			select max(sal),deptno from emp where sal > 2900 group by deptno;
				+----------+--------+
				| max(sal) | deptno |
				+----------+--------+
				|  5000.00 |     10 |
				|  3000.00 |     20 |
				+----------+--------+
			先减少数据,在分组,最后求最大值
			
		- 能用where的就用where
		
	案例:找出每个部门的平均薪资, 显示平均薪资大于2000数据
		1. select avg(sal), deptno from emp group by deptno;
			+-------------+--------+
			| avg(sal)    | deptno |
			+-------------+--------+
			| 2916.666667 |     10 |
			| 2175.000000 |     20 |
			| 1566.666667 |     30 |
			+-------------+--------+
		2. select avg(sal),deptno from emp group by deptno having avg(sal) > 2000;
			+-------------+--------+
			| avg(sal)    | deptno |
			+-------------+--------+
			| 2916.666667 |     10 |
			| 2175.000000 |     20 |
			+-------------+--------+
		- 这里不能用where avg(sal) > 2000; where 不能和分组函数连用,这里只能用having
		- 能用where的就用where,不能用的就用having
		- having 只能和group by 连用
		
		
		
	
去除重复记录:

	- distinct
		select distinct job from emp;
		+-----------+
		| job       |
		+-----------+
		| CLERK     |
		| SALESMAN  |
		| MANAGER   |
		| ANALYST   |
		| PRESIDENT |
		+-----------+
	- distinct 只能出现在所有字段的最前面 表示的含义是后面所有的字段联合去重



完整的DQL语句:
	select ...		5
	from ...		1
	where...		2
	group by ...	3
	having ....		4
	order by ...	6

	- 案例:找出每个部门最早入职的时间
		
	
	
	
	


连接查询:

	- 内连接 外连接 全连接

	
	- 多张表联合查询
	
	- 数据库中笛卡尔积现象
		两张表连接查询没有加以条件限制时,显示的结果长度是两张表长度的乘积。
	
	- 表的别名:
		select e.ename, d.dname from emp e, dept d;
		- 好处: 可读性高,执行效率高
		
	
	内连接:
	
		- 等值连接
			- 条件是等量关系
			
			- sql92语法:
				select ...
				from a,b
				where 连接条件
				
			- sql99语法:(常用)
				select ...
				from ..
				(inner) join.. (inner表示内连接 可以省略)
				on 连接条件
				where...查询条件
				- 优点 连接条件和查询条件分离 结构清晰
			
			案例:查询员工名称和部门名称
				92:
				select e.ename, d.dname
				from emp e, dept d 
				where e.deptno = d.deptno
				
				99:
				select e.ename, d.dname
				from emp e
				join dept d 
				on e.deptno = d.deptno;
				
		- 非等值连接
			
			- 连接条件是非等量关系
			
			- 案例:找出每个员工的工资等级,显示员工名,工资,工资等级
				select e.ename, e.sal, s.grade
				from emp e
				join salgrade s
				on e.sal between s.losal and s.hisal;
				+--------+---------+-------+
				| ename  | sal     | grade |
				+--------+---------+-------+
				| SMITH  |  800.00 |     1 |
				| ALLEN  | 1600.00 |     3 |
				| WARD   | 1250.00 |     2 |
				| JONES  | 2975.00 |     4 |
				| MARTIN | 1250.00 |     2 |
				| BLAKE  | 2850.00 |     4 |
				| CLARK  | 2450.00 |     4 |
				| SCOTT  | 3000.00 |     4 |
				| KING   | 5000.00 |     5 |
				| TURNER | 1500.00 |     3 |
				| ADAMS  | 1100.00 |     1 |
				| JAMES  |  950.00 |     1 |
				| FORD   | 3000.00 |     4 |
				| MILLER | 1300.00 |     2 |
				+--------+---------+-------+
				
				
					
		- 自连接
			
			- 一张表看成两张表使用,自己连接自己
		
			- 找出每个员工的上级领导,显示员工名和领导名
				
				select e.ename as '员工' ,m.ename as '领导'
				from emp e
				join emp m
				on e.mgr = m.empno;
				+--------+-------+
				| 员工   | 领导  |
				+--------+-------+
				| SMITH  | FORD  |
				| ALLEN  | BLAKE |
				| WARD   | BLAKE |
				| JONES  | KING  |
				| MARTIN | BLAKE |
				| BLAKE  | KING  |
				| CLARK  | KING  |
				| SCOTT  | JONES |
				| TURNER | BLAKE |
				| ADAMS  | SCOTT |
				| JAMES  | BLAKE |
				| FORD   | JONES |
				| MILLER | CLARK |
				+--------+-------+
				
	- 外连接:
	
		- 左外连接:左边的是主表,显示左边表查询内容的所有信息
		- 右外连接:右边的是主表,显示右边所有信息
	
		- 两张表有一张表是主表,一张是副表,主要查询的是主表中的信息,附带查询副表中的信息,如果副表中没有对应的信息会自动补全null
		- 显示的是主表中查询的所有信息和副表中有的信息,副表中没有的显示null
		
		
		- 与内连接的区别
			内连接的表没有主次之分
			内连接查询的是两张表能对应的信息
			对应不上的信息不显示
		
		- 案例:查询员工的上级领导, 必须显示所有员工的领导信息
			- 内连接查询:
				select e.ename as '员工' ,m.ename as '领导'
				from emp e
				join emp m
				on e.mgr = m.empno;
				+--------+-------+
				| 员工   | 领导  |
				+--------+-------+
				| SMITH  | FORD  |
				| ALLEN  | BLAKE |
				| WARD   | BLAKE |
				| JONES  | KING  |
				| MARTIN | BLAKE |
				| BLAKE  | KING  |
				| CLARK  | KING  |
				| SCOTT  | JONES |
				| TURNER | BLAKE |
				| ADAMS  | SCOTT |
				| JAMES  | BLAKE |
				| FORD   | JONES |
				| MILLER | CLARK |
				+--------+-------+
				- 使用内连接查询的结果不全,员工没有领导的数据没有显示
			
			- 使用外连接:
				- 左外连接
				select e.ename as '员工' ,m.ename as '领导'
				from emp e
				left (outer) join emp m //outer可以省略 和inner一样
				on e.mgr = m.empno;
				+--------+-------+
				| 员工   | 领导  |
				+--------+-------+
				| SMITH  | FORD  |
				| ALLEN  | BLAKE |
				| WARD   | BLAKE |
				| JONES  | KING  |
				| MARTIN | BLAKE |
				| BLAKE  | KING  |
				| CLARK  | KING  |
				| SCOTT  | JONES |
				| KING   | NULL  | <----
				| TURNER | BLAKE |
				| ADAMS  | SCOTT |
				| JAMES  | BLAKE |
				| FORD   | JONES |
				| MILLER | CLARK |
				+--------+-------+
				- 没有领导的员工 领导栏显示null
				
				- 对应的右连接写法
				select e.ename as '员工' ,m.ename as '领导'
				from emp m
				right join emp e
				on e.mgr = m.empno;
				+--------+-------+
				| 员工   | 领导  |
				+--------+-------+
				| SMITH  | FORD  |
				| ALLEN  | BLAKE |
				| WARD   | BLAKE |
				| JONES  | KING  |
				| MARTIN | BLAKE |
				| BLAKE  | KING  |
				| CLARK  | KING  |
				| SCOTT  | JONES |
				| KING   | NULL  | <---
				| TURNER | BLAKE |
				| ADAMS  | SCOTT |
				| JAMES  | BLAKE |
				| FORD   | JONES |
				| MILLER | CLARK |
				+--------+-------+
				- 所得的结果相同
				
				
			- 每一种左连接都有对应的右连接写法, 反之也一样。
			- 外连接使用居多
		
		- 外连接的主要特点:主表的信息全部无条件显示出来
		
		
		- 案例:找出那个部门没有员工
			
			- 所有部门的员工情况
			select e.*, d.*
			from emp e
			right join dept d
			on e.deptno = d.deptno
			+-------+--------+-----------+------+------------+---------+---------+--------+--------+------------+----------+
			| EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO | DEPTNO | DNAME      | LOC      |
			+-------+--------+-----------+------+------------+---------+---------+--------+--------+------------+----------+
			|  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |     20 | RESEARCH   | DALLAS   |
			|  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |     30 | SALES      | CHICAGO  |
			|  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |     30 | SALES      | CHICAGO  |
			|  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |     20 | RESEARCH   | DALLAS   |
			|  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |     30 | SALES      | CHICAGO  |
			|  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |     30 | SALES      | CHICAGO  |
			|  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |     10 | ACCOUNTING | NEW YORK |
			|  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |     20 | RESEARCH   | DALLAS   |
			|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |     10 | ACCOUNTING | NEW YORK |
			|  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |     30 | SALES      | CHICAGO  |
			|  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |     20 | RESEARCH   | DALLAS   |
			|  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |     30 | SALES      | CHICAGO  |
			|  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |     20 | RESEARCH   | DALLAS   |
			|  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |     10 | ACCOUNTING | NEW YORK |
			|  NULL | NULL   | NULL      | NULL | NULL       |    NULL |    NULL |   NULL |     40 | OPERATIONS | BOSTON   |
			+-------+--------+-----------+------+------------+---------+---------+--------+--------+------------+----------+
			
			- 显示没有员工的部门即可
			select  d.*
			from emp e
			right join dept d
			on e.deptno = d.deptno
			where e.ename is null;
			+--------+------------+--------+
			| DEPTNO | DNAME      | LOC    |
			+--------+------------+--------+
			|     40 | OPERATIONS | BOSTON |
			+--------+------------+--------+
			
		
	- 全连接:
		- 两张都是主表
		- 两张表的查询的所有信息都显示,没有的显示null
		
		
	- 三张表以上的连接查询
	
		...
		from a
		join b
		on... ab连接条件
		join c
		on... c的连接条件
		
		- a和b先连接,得到的结果在和c连接
	
		案例:每一个员工的部门名称和工资等级
		emp e:
		+-------+--------+-----------+------+------------+---------+---------+--------+
		| EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
		+-------+--------+-----------+------+------------+---------+---------+--------+
		|  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
		|  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
		|  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
		|  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
		|  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
		|  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
		|  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
		|  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |
		|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
		|  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
		|  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |
		|  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
		|  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
		|  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
		+-------+--------+-----------+------+------------+---------+---------+--------+
		dept d:
		+--------+------------+----------+
		| DEPTNO | DNAME      | LOC      |
		+--------+------------+----------+
		|     10 | ACCOUNTING | NEW YORK |
		|     20 | RESEARCH   | DALLAS   |
		|     30 | SALES      | CHICAGO  |
		|     40 | OPERATIONS | BOSTON   |
		+--------+------------+----------+
		salgrade s:
		+-------+-------+-------+
		| GRADE | LOSAL | HISAL |
		+-------+-------+-------+
		|     1 |   700 |  1200 |
		|     2 |  1201 |  1400 |
		|     3 |  1401 |  2000 |
		|     4 |  2001 |  3000 |
		|     5 |  3001 |  9999 |
		+-------+-------+-------+
		
		- 查询
		select 
			e.ename, d.dname, s.grade
		from 
			emp e
		join 
			dept d
		on 
			e.deptno = d.deptno
		join 
			salgrade s
		on 
			e.sal between s.losal and s.hisal;
			
		+--------+------------+-------+
		| ename  | dname      | grade |
		+--------+------------+-------+
		| SMITH  | RESEARCH   |     1 |
		| ALLEN  | SALES      |     3 |
		| WARD   | SALES      |     2 |
		| JONES  | RESEARCH   |     4 |
		| MARTIN | SALES      |     2 |
		| BLAKE  | SALES      |     4 |
		| CLARK  | ACCOUNTING |     4 |
		| SCOTT  | RESEARCH   |     4 |
		| KING   | ACCOUNTING |     5 |
		| TURNER | SALES      |     3 |
		| ADAMS  | RESEARCH   |     1 |
		| JAMES  | SALES      |     1 |
		| FORD   | RESEARCH   |     4 |
		| MILLER | ACCOUNTING |     2 |
		+--------+------------+-------+
		
		案例:每一个员工的部门名称和工资等级和上级领导
		
		select 
			e.ename, d.dname, s.grade, m.ename
		from 
			emp e
		join 
			dept d
		on 
			e.deptno = d.deptno
		join 
			salgrade s
		on 
			e.sal between s.losal and s.hisal
		left join        //这里用外连接 不能漏掉没有上级的人                     
			emp m
		on 
			e.mgr = m.empno;
		 
		+--------+------------+-------+-------+
		| ename  | dname      | grade | ename |
		+--------+------------+-------+-------+
		| SMITH  | RESEARCH   |     1 | FORD  |
		| ADAMS  | RESEARCH   |     1 | SCOTT |
		| JAMES  | SALES      |     1 | BLAKE |
		| WARD   | SALES      |     2 | BLAKE |
		| MARTIN | SALES      |     2 | BLAKE |
		| MILLER | ACCOUNTING |     2 | CLARK |
		| ALLEN  | SALES      |     3 | BLAKE |
		| TURNER | SALES      |     3 | BLAKE |
		| JONES  | RESEARCH   |     4 | KING  |
		| BLAKE  | SALES      |     4 | KING  |
		| CLARK  | ACCOUNTING |     4 | KING  |
		| SCOTT  | RESEARCH   |     4 | JONES |
		| FORD   | RESEARCH   |     4 | JONES |
		| KING   | ACCOUNTING |     5 | NULL  |
		+--------+------------+-------+-------+
		
	

子查询:
	- select中嵌套select语句,被嵌套的select是子查询
	
	- 子查询出现的位置
		select
			(select)
		form 
			(select)
		where
			(select)
			
	
	- where中使用子查询
		- 案例:找出高于平均薪资的员工信息
			select * from emp where sal > (select avg(sal) from emp);
			+-------+-------+-----------+------+------------+---------+------+--------+
			| EMPNO | ENAME | JOB       | MGR  | HIREDATE   | SAL     | COMM | DEPTNO |
			+-------+-------+-----------+------+------------+---------+------+--------+
			|  7566 | JONES | MANAGER   | 7839 | 1981-04-02 | 2975.00 | NULL |     20 |
			|  7698 | BLAKE | MANAGER   | 7839 | 1981-05-01 | 2850.00 | NULL |     30 |
			|  7782 | CLARK | MANAGER   | 7839 | 1981-06-09 | 2450.00 | NULL |     10 |
			|  7788 | SCOTT | ANALYST   | 7566 | 1987-04-19 | 3000.00 | NULL |     20 |
			|  7839 | KING  | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL |     10 |
			|  7902 | FORD  | ANALYST   | 7566 | 1981-12-03 | 3000.00 | NULL |     20 |
			+-------+-------+-----------+------+------------+---------+------+--------+
				
	- from中使用子查询
		- 案例:找出每个部门平均薪水的薪资等级
			1. 找出部门平均工资表
			select deptno, avg(sal) avgsal from emp group by deptno;
			+--------+-------------+
			| deptno | avgsal      |
			+--------+-------------+
			|     10 | 2916.666667 |
			|     20 | 2175.000000 |
			|     30 | 1566.666667 |
			+--------+-------------+
			2. 连接工资等级表查询
			select 
				s.grade, d.deptno
			from 
				(select deptno, avg(sal) avgsal from emp group by deptno) d
			left join 
				salgrade s
			on 
				d.avgsal between s.losal and s.hisal;
			+-------+--------+
			| grade | deptno |
			+-------+--------+
			|     3 |     30 |
			|     4 |     10 |
			|     4 |     20 |
			+-------+--------+
	
		- 案列:找出每个部门平均的的薪资等级
			1.找出员工的薪资等级表 ds
			select e.sal, s.grade, e.deptno 
			from emp e
			join salgrade s
			on e.sal between s.losal and s.hisal;
			+---------+-------+--------+
			| sal     | grade | deptno |
			+---------+-------+--------+
			|  800.00 |     1 |     20 |
			| 1600.00 |     3 |     30 |
			| 1250.00 |     2 |     30 |
			| 2975.00 |     4 |     20 |
			| 1250.00 |     2 |     30 |
			| 2850.00 |     4 |     30 |
			| 2450.00 |     4 |     10 |
			| 3000.00 |     4 |     20 |
			| 5000.00 |     5 |     10 |
			| 1500.00 |     3 |     30 |
			| 1100.00 |     1 |     20 |
			|  950.00 |     1 |     30 |
			| 3000.00 |     4 |     20 |
			| 1300.00 |     2 |     10 |
			+---------+-------+--------+
			
			2.按照部门分组,再求部门等级的平均值
			
			select avg(s.grade), e.deptno 
			from emp e
			join salgrade s
			on e.sal between s.losal and s.hisal
			group by deptno;
			+---------------+--------+
			| avg(ds.grade) | deptno |
			+---------------+--------+
			|        3.6667 |     10 |
			|        2.8000 |     20 |
			|        2.5000 |     30 |
			+---------------+--------+
			
		
		- 子表的嵌套使用,只需要在连接的时候嵌套使用,其他时候不需要嵌套,会降低效率!!!!!!!
		
	
	- select后面嵌套
		案例:找出每个员工所在的部门名称,要求显示员工名和部门名。
		1.  select e.ename, e.deptno, d.dname
			from emp e
			join dept d
			on e.deptno = d.deptno;
			+--------+--------+------------+
			| ename  | deptno | dname      |
			+--------+--------+------------+
			| SMITH  |     20 | RESEARCH   |
			| ALLEN  |     30 | SALES      |
			| WARD   |     30 | SALES      |
			| JONES  |     20 | RESEARCH   |
			| MARTIN |     30 | SALES      |
			| BLAKE  |     30 | SALES      |
			| CLARK  |     10 | ACCOUNTING |
			| SCOTT  |     20 | RESEARCH   |
			| KING   |     10 | ACCOUNTING |
			| TURNER |     30 | SALES      |
			| ADAMS  |     20 | RESEARCH   |
			| JAMES  |     30 | SALES      |
			| FORD   |     20 | RESEARCH   |
			| MILLER |     10 | ACCOUNTING |
			+--------+--------+------------+
		2. select 
				e.ename, e.deptno,
				(select d.dname from dept d where e.deptno = d.deptno) as dname
			from 
				emp e;
			+--------+--------+------------+
			| ename  | deptno | dname      |
			+--------+--------+------------+
			| SMITH  |     20 | RESEARCH   |
			| ALLEN  |     30 | SALES      |
			| WARD   |     30 | SALES      |
			| JONES  |     20 | RESEARCH   |
			| MARTIN |     30 | SALES      |
			| BLAKE  |     30 | SALES      |
			| CLARK  |     10 | ACCOUNTING |
			| SCOTT  |     20 | RESEARCH   |
			| KING   |     10 | ACCOUNTING |
			| TURNER |     30 | SALES      |
			| ADAMS  |     20 | RESEARCH   |
			| JAMES  |     30 | SALES      |
			| FORD   |     20 | RESEARCH   |
			| MILLER |     10 | ACCOUNTING |
			+--------+--------+------------+
					
					
					
union (可以将查询结果集相加)
	
	- select ename, job from emp where job in ('MANAGER','ANALYST')
		等同于
		
		select ename, job from emp where job = 'MANAGER'
		union
		select ename, job from emp where job = 'ANALYST'
		
		- union可以两个毫不相干的数据拼接在一起
		- union使用时两组数据的列数要相等



limit  重点!!!!!!!!!!!!!!!!!!!!!!!!!!!

	- 分页查询全靠它,mysql特有的功能
	- 作用是去结果集中的一部分数据
	
	- 语法
		limit 起始位置, 长度
		- 起始位置从0开始 表示第一组数据
		- 只写长度默认起始位置为0
		- limit在语句中是最后执行的
			select    	5
			from		1
			where		2
			group by 	3
			having		4
			order by 	6
			limit		7
		
		- 实例:取工资排名前五的员工信息
		select ename, sal from emp order by sal desc limit 0, 5;
		+-------+---------+
		| ename | sal     |
		+-------+---------+
		| KING  | 5000.00 |
		| FORD  | 3000.00 |
		| SCOTT | 3000.00 |
		| JONES | 2975.00 |
		| BLAKE | 2850.00 |
		+-------+---------+
		
		
	- 通用的分页sql !!!!!!!!!!!!!!!
		例:每页显示3条
			limit语句
			第1页:limit 0, 3
			第2页:limit 3, 3
			第3页:limit 6, 3
			....
		- 当页码为pageNo, 每页的显示长度为pageSize, 则
			第pageNo页显示的内容为:
			limit (pageNo-1) * pageSize, pageSize
			
			
			
			
创建表:

	语法:
		create table 表名(
			字段1 数据类型,
			字段2 数据类型,
			......
		);
		
	- 指定默认值
		create table 表名(
			字段1 数据类型 default xx,
			字段2 数据类型 default xx,
			......
		);
		不指定默认为null
		
	
	- mysql常见数据类型
		int			整型
		bigint		长整型
		float		浮点型
		double		双精度浮点型
		char		定长字符串
		varchar		可变长字符串(255长度)
		data		日期类型
		BLOB		二进制大对象(图片,视频等流媒体信息)
		CLOB		字符大对象(存储较大文本,可以存储4G的字符串)
		..........
		
	- 表名一般以t_和tbl开头
	
	- 实例:创建学生表
		- 包含学号,姓名,性别,班级,生日
		create table t_student(
			id bigint,
			name varchar(255),
			sex char(1),
			class varchar(255),
			birth char(10)
		);
		
		mysql> desc t_student;
		+-------+--------------+------+-----+---------+-------+
		| Field | Type         | Null | Key | Default | Extra |
		+-------+--------------+------+-----+---------+-------+
		| id    | bigint(20)   | YES  |     | NULL    |       |
		| name  | varchar(255) | YES  |     | NULL    |       |
		| sex   | char(1)      | YES  |     | NULL    |       |
		| class | varchar(255) | YES  |     | NULL    |       |
		| birth | char(10)     | YES  |     | NULL    |       |
		+-------+--------------+------+-----+---------+-------+
		

    - 向表中插入数据
		语法:
			insert into 表名(字段1, 字段2,....) values(value1,value2.....)
			- 字段要和值的数量相同并且对应,值的类型要和对应
			- 如果直插入一项,其他的默认为null, 如果需要添加其他值,需要用update更新
		
		insert into t_student(id, name, sex, class, birth) values(10000, 'wcy', '1', 'class1','1999-09-05');
		insert into t_student(id) values(10000);
		insert into t_student values(10000, 'wcy', '1', 'class1','1999-09-05'); //必须和字段对应,并且数量相等!!!!!!
		
		- 当insert语句执行成功后, 一定会多一行数据
	
		- 一次插入多行数据
		insert into t_student(id, name, sex, class, birth) values(10000, 'wcy', '1', 'class1','1999-09-05'),(10000, 'wcy', '1', 'class1','1999-09-05');
		
	
	- 表的复制
	
		- 将查询结果当做表复制
		create table 表名 as select语句;
		- 将查询结果插入一张表中 字段要相同
		insert into xx select语句;
	
	
	
修改数据:
	语法:
		updata 表名 set 字段名1=值1, 字段名2=值2..... where 条件;
		没有条件所有的值都会更新
		
	

删除数据:

	语法:delete from 表名 where 条件;
		- 没有条件全部删除!!!!!!!
		- 删完可以回滚
	
	- 如何删除大表中的数据?(重点)
		- 表中数据被截断,删完不能回滚!!!!!!!!!!!!!!
		- truncate table 表名;
		
	
增删改查的一个术语:CRUD


约束:

	非空约束(not null):约束的字段不能为null
	唯一约束(unique): 约束的字段不能重复
	主键约束(primary key)(FK):约束的字段既不能为null也不能重复
	外键约束(foreign key)(PK):....
	检查约束(check):oracle有,mysql没有
	
	
	- 非空约束(not null)
		- 只有列级约束!
		
		drop table if exists t_user;
		create table t_user(
			id bigint,
			username varchar(255) not null, // not null约束
			password varchar(255)
		);
		+----------+--------------+------+-----+---------+-------+
		| Field    | Type         | Null | Key | Default | Extra |
		+----------+--------------+------+-----+---------+-------+
		| id       | bigint(20)   | YES  |     | NULL    |       |
		| username | varchar(255) | NO   |     | NULL    |       |
		| password | varchar(255) | YES  |     | NULL    |       |
		+----------+--------------+------+-----+---------+-------+
		- 此时如果不添加username则会报错
		insert into t_user(id, password) values(1, '123');
		ERROR 1364 (HY000): Field 'username' doesn't have a default value
	
	-  唯一性约束(unique)
		- 唯一性约束具有唯一性,不能重复,但可以为null
		
		- 列级约束
			 drop table if exists t_user;
			 create table t_user(
				id int,
				username varchar(255) unique, 
				password varchar(255)
			 );
			 insert into t_user (id, username, password) values (1, '123', '234343');
			 insert into t_user (id, username, password) values (2, '123', '234343');
			 // usename重复
			 ERROR 1062 (23000): Duplicate entry '123' for key 'username'
			 - 唯一性约束可以不赋值使其为null,可以存在多个null,但是数据不能重复
			 
			 
			 - 可以同时给多个字段添加唯一性约束
			 - 实际加了两个约束
			 create table t_user(
				id int unique,
				username varchar(255) unique, 
				password varchar(255) 
			 );
			 insert into t_user (id, username, password) values (1, '123', '234343');
			 insert into t_user (id, username, password) values (2, '123', '234343');
			 // 报错 字段重复
			 - 但是给多个字段添加唯一性约束 是每个字段都不能重复,和表级约束不一样!!!!!!!!		 
		 
		
		- 表级约束
			表示联合字段不能重复 实际表示加了一个约束
			drop table if exists t_user;
			 create table t_user(
				id int,
				username varchar(255), 
				password varchar(255),
				unique(id, username)
			 );
			 insert into t_user (id, username, password) values (1, '123', '234343');
			 insert into t_user (id, username, password) values (2, '123', '234343');
			 // 这里可以正常添加
			+------+----------+----------+
			| id   | username | password |
			+------+----------+----------+
			|    1 | 123      | 234343   |
			|    2 | 123      | 234343   |
			+------+----------+----------+
			
	- 主键约束(primary key)
		- 主键约束的字段不能为空并且不能重复
		
		- 添加主键约束
			- 可以使用列级约束添加主键,也可使用表级约束添加
			drop table if exists t_user;                           
			 create table t_user(
				id int primary key,
				username varchar(255),                            
				password varchar(255)
			 );
			 
			+----------+--------------+------+-----+---------+-------+
			| Field    | Type         | Null | Key | Default | Extra |
			+----------+--------------+------+-----+---------+-------+
			| id       | int(11)      | NO   | PRI | NULL    |       |
			| username | varchar(255) | YES  |     | NULL    |       |
			| password | varchar(255) | YES  |     | NULL    |       |
			+----------+--------------+------+-----+---------+-------+
			 insert into t_user (id, username, password) values (1, '123', '234343');
			 insert into t_user (id, username, password) values (1, '124', '234389');
			 // ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY' 主键重复
			 
			 
			drop table if exists t_user;
			 create table t_user(
				id int ,
				username varchar(255), 
				password varchar(255),
				primary key(id)
			 );
			
			 
		- 主键相关的术语
			- 主键约束:primary key
			- 主键字段: 添加主键约束的字段
			- 主键值:主键字段的值
		
		- 主键的作用
			- 数据局设计三范式有要求,第一范式要求任何一张表都需要主键
			- 主键值是这行记录在这张表里的唯一标识,就好比身份证号,主键值不一样就表示这两行数据不一样!!!!!!!!!
			
		- 主键的分类
		
			- 根据主键字段和字段数量划分:
				- 单一主键(常用)
				- 复合主键:多个字段联合添加主键(不建议使用,违背三范式)
				
			- 根据主键性质划分:
				- 自然主键: 主键值是一个和业务完全不相干的自然数(推荐使用)
				- 业务主键:主键值和业务相关,例如银行卡号,身份证号(不推荐使用)
					最好不要拿业务相关的字段做主键,一旦业务发生改变,主键改变就可能重复
				
		- 一张表只能有一个主键约束
		
		
		- 主键值自增!!!!!!!(mysql)
			- 使用auto_increment
			drop table if exists t_user;                           
			 create table t_user(
				id int primary key auto_increment, // 自增
				username varchar(255),                            
				password varchar(255)
			 );
			insert into t_user (username, password) values ('123', '234343');
			insert into t_user (username, password) values ('124', '234343');
			insert into t_user (username, password) values ('125', '234343');
			// 主键自增
			+----+----------+----------+
			| id | username | password |
			+----+----------+----------+
			|  1 | 123      | 234343   |
			|  2 | 124      | 234343   |
			|  3 | 125      | 234343   |
			+----+----------+----------+
			
			
	- 外键约束
	
		 - 基本术语
			- 外键约束
			- 外键字段
			- 外键值
			
		- 案例:在t_student的classno字段引用t_class表中的cno字段,此时t_student叫做子表,t_class叫父表
		- 顺序要求:
			删除数据:先删除子表,再删除父表
			添加数据:先添加父表,再添加子表
			
			删除表:先删子表,再删除父表
			创建表:先创父表,在创子表
			
		drop table if exists t_student;
		drop table if exists t_class;
		create table t_class(
			cno int primary key,
			cname varchar(255)
		);
		create table t_student(
			sno int,
			sname varchar(255),
			classno int,
			primary key(sno),
			foreign key(classno) references t_class(cno)   //外键的语法格式
		);
		
		insert into t_class values(01, '31');
		insert into t_class values(02, '32');
		insert into t_student values(1001, 'wcy', 02);
		insert into t_student values(1002, 'sss', 01);
		
		- 此时在t_student中添加classno的值只能是t_class中的con字段中的值
		insert into t_student values(1002, 'sss', 07);
		ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`wcy`.`t_student`, CONSTRAINT `t_student_ibfk_1` FOREIGN KEY (`classno`) REFERENCES `t_class` (`cno`))
		
		- 外键值可以为null
		
		- 外键字段引用其他表的某字时,被引用的字段不一定是主键,但是至少具有唯一性,一般来说引用的都是引用主键字段!!!!
		
		
		
	
		- 完整的建表语句
			mysql> show create table t_user;
			+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
			| Table  | Create Table                                                                                                                                                                                                                 |
			+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
			| t_user | CREATE TABLE `t_user` (
			  `id` int(11) NOT NULL AUTO_INCREMENT,
			  `username` varchar(255) DEFAULT NULL,
			  `password` varchar(255) DEFAULT NULL,
			  PRIMARY KEY (`id`)
			) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 |
			+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
			`号可以不用
			



事务(transaction): !!!!!!!!!!!!
	
	- 事务是一个完整的业务逻辑单元,不可再分
		- 案例:银行账户的转账,a转给b1000元,需要执行两条语句
			updata t_act set balande = balande-1000 where name = 'a';
			updata t_act set balande = balande+1000 where name = 'b';
			这两条语句必须同时成功或者同时失败
			不允许一条成功一条失败
			
			
	- 和事务相关的语句只有DML(insert delete updata)
		- 原因
			- 这三个语句都是和数据库表当中的数据相关
			- 事务的存在是为了保证数据的完整性,安全性
	

		
	- 事务的四大特性(ACID)
		- A 原子性:事务是最小的工作单元,不可再分
		- C 一致性:事务必须保证多条DML语句同时成功或者同时失败
		- I 隔离性:事务A与事务B具有隔离
		- D 持久性:数据必需持久化到硬盘文件中,事务才算完全成功
		
		
	- 关于事务之间的隔离性
	
		事务隔离性存在隔离级别,理论上隔离级别包括4个:
		
			第一级别:读未提交(read uncommitted)
				- 对方事务还未提交,我们当前事务可以读取到对方未提交的数据
				- 存在的问题
					脏读现象:表示读到了脏的数据
					
			第二级别:读已提交(read committed)
				- 对方事务提交后的数据我方可以读取到
				- 解决的问题:
					不存在脏读现象
				- 存在的问题
					不可重复读
					
			第三级别:可重复读(repeatable read)
				对方提交之后我方也读取不到,每次读取到的都是第一次读取到的数据,即使对方更改了也是一样,读到的是虚幻的数据,只有等该次事务结束后才会读取到真实的数据。
				- 解决的问题:	
					可以重复读
				- 存在的问题
					读取到的数据是幻想
					
			第四级别:序列化读/串行化读(serializable)
				只有等到提交之后,另一方才可以查询数据
				解决了之前所有问题
				- 缺点:
					效率低,需要事务排队
		
		
		- oracle数据库默认的隔离级别是读已提交,mysql是可重复读
		
		
	- 演示事务
		- mysql默认情况是开启自动提交事务,手动提交要先使用start transaction;
		
		- rollback 和 commit
			- rollback 回滚
			- commit 提交
		- 设置事务的全局隔离级别:
			set global transaction isolation level read uncommitted; // 其他级别替换成相应的单词就行
			
		- 查看事务的全局隔离级别
			mysql> select @@global.tx_isolation;
			+-----------------------+
			| @@global.tx_isolation |
			+-----------------------+
			| READ-UNCOMMITTED      |
			+-----------------------+
			
		
		
	
索引:
	
	- 索引是什么,又什么作用?
		索引相当于一张表的目录,通过目录可以快速的找到对应的资源
		数据库查表的两种 检索方式:
			- 全表扫描
			- 索引检索(效率很高)
			索引提高效率的根本原因是缩小了检索范围
		索引虽然可以提高检索效率,但是不能随意添加索引,因为索引也是数据库中的对象,也需要数据库不断的维护,是有维护成本的。
		如果表中的数据经常被更改就不适合添加索引,数据一旦修改,索引也需要重新排序。
	
	- 考虑添加索引的条件
		- 数据量庞大
		- 该字段很少DML操作(字段改变索引也会改变)
		- 该字段经常出现在where字句中(经常根据那个字段查询)
		
	- 注意:
		主键和具有unique约束的字段会自动加上索引,所以用主键字段查询效率较高
		
	- 索引的创建和删除
	
		- create index 索引名称 on 表名(字段);
		- drop index 索引名称 on 表名;
		
		- 查看sql语句的执行情况
			explain select ename, sal from emp where sal=5000;
			+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
			| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
			+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
			|  1 | SIMPLE      | emp   | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   14 |    10.00 | Using where |
			+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
			可以看到是全表扫描
			
		- 给该字段添加索引后
			create index emp_sal_index on emp(sal);
			
			mysql> explain select ename, sal from emp where sal=5000;
			+----+-------------+-------+------------+------+---------------+---------------+---------+-------+------+----------+-------+
			| id | select_type | table | partitions | type | possible_keys | key           | key_len | ref   | rows | filtered | Extra |
			+----+-------------+-------+------------+------+---------------+---------------+---------+-------+------+----------+-------+
			|  1 | SIMPLE      | emp   | NULL       | ref  | emp_sal_index | emp_sal_index | 9       | const |    1 |   100.00 | NULL  |
			+----+-------------+-------+------------+------+---------------+---------------+---------+-------+------+----------+-------+
			根据索引查询 只查询了一次
			
		- 删除索引后
			mysql> drop index emp_sal_index on emp;

			mysql> explain select ename, sal from emp where sal=5000;
			+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
			| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
			+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
			|  1 | SIMPLE      | emp   | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   14 |    10.00 | Using where |
			+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
			又变成全表查询

	- 索引底层第数据结构: B + tree
	
	- 索引的实现原理
		通过B tree缩小扫描范围,底层索引进行了排序,分区。索引会携带数据在表中的物理地址
		通过索引检索到数据之后,获取到关联的物理地址,通过定位物理地址中的数据,效率是最高的
		select * from emp where ename = 'SMITH'
		转换为
		select * from emp where ename = 0X33
		
	
	- 索引的分类
		单一索引:给单个字段添加索引
		符合索引:多个字段联合添加一个索引
		主键索引:主键会自动添加索引
		唯一索引:有唯一约束(unique)会自动添加索引
		
		- 根据主键查询 效率最高
		
	- 索引失效
		使用like模糊查询时第一个通配符是%时,索引无效
		所以模糊查询第一个通配符最好不要用%
		
	
	
	
视图(view):
	
	- 什么是视图
		站在不同的角度去看待数据
	- 创建和删除视图
		create view myview as select * from emp; //这里只能是DQL语言
		drop view myview;
		
	- 对视图可以进行增删改查,但是会影响到原表的数据,但是并不是直接操作的原表的数据。
	
	- 视图的作用:
		视图可以隐藏表的实现细节,保密级别较高的系统,数据库只向外提供相关的视图。
	
	
	
DBA命令:
	- 数据库中数据导出:
		在windows的dos窗口执行 不用登陆数据库
			- 整个数据库
				mysqldump wcy>E:\wcy.sql -uroot -proot //或者-p再输入密码
			- 指定表的导出
				mysqldump wcy 表名>E:\wcy.sql -uroot -proot //或者-p再输入密码
		
	- 导入
		create database XXX;
		use XXX;
		source E:\wcy.sql
	


数据库设计三范式(重点):

	- 什么是设计范式
		设计表的依据,按照三范式设计的表不会有数据冗余
		
	- 三范式
		第一范式:每一张表都应该有一个主键,并且每一个字段都原子不可再分。
		
		第二范式:建立在第一范式的基础之上,所有非主键字段完全依赖于主键字段,不能产生部分依赖
			多对多情况?
				三张表,关系表,两个外键
				
		第三范式:第二范式基础,非主键字段不能传递依赖于主键字段(不要产生传递依赖)
			一对多?
				两张表,多的表加外键
				
				
	- 实际的开发中,以客户的需求为主,有时候会以数据的冗余换取执行速度。
	
	


- 经典表的设计
	- 一对一
		第一种:主键共享
		第二种:外键唯一
	
	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值