MYSQL汇总

Day01

1.SQL语言分类

DQL(Data QueryLanguage数据查询语言):查询语句,凡是select语句都是DQL
DML(Data Manipulation Language):insert,delete update,对表当中的数据进行增删改
DDL(Data Definition Language):create drop alter,对表结构的增删改
TCL(Transaction control language):事务控制语言
DCL(Data Controller Language):grant授权,revoke撤销权限等

2.导入数据

第一步:登录mysql数据库管理系统 dos命令窗口:mysql -uroot -proo
第二步:查看有哪些数据库 show databases;(这个不是SQL语句,属于MYSQL的命令)
第三步:创建属于我们自己的数据库 create database springdb;(这不是SQL语句,属于MYSQL的命令)
第四步:使用springdb数据库 use springdb;(这个不是SQL语句,属于MYSQL的命令)
第五步:查看当前使用的数据库中有哪些表? show tables;(这个不是SQL语句,属于MYSQL的命令)
第六步:初始化数据命令 mysql> source
C:\Users\ThinkPad\Desktop\springdb2.sql
第七步:删除数据库 drop darabase springdb;
第八步:查看表结构 desc 表名;
第九步:查看mysql版本 mysql --version mysql -V
第十步:查看当前的数据库 select database();
第十一:查询数据库版本 select version();
第十二:终止一条语句 如果要终止一条正在编写的语句,可键入\c 第十三:退出mysql 可使用\q,QUIT或EXIT
第十四:查看创建表的语句 show create table 表名;

3.speingdb2.sql

这个文件以sql结尾,这样的文件被称为“sql脚本”。什么是sql脚本呢?
当一个文件的扩展名是.sql,并且该文件中编写了大量的sql语句,我们称这样的文件为sql脚本。
注意:直接使用的数据量太大的时候,无法打开,请使用source命令完成初始化。

4.简单的查询语句是(DQL)

查询多个字段:
	select 字段名1,字段名2,... from 表名;
查询全部字段:
	select * from emp;//实际开发中不建议使用*,效率较低
查询一个字段:
	select 字段名 from 表名;
查询员工的年薪?(字段可以参与数学运算)
	select ename,sql*12 from emp;
给查询结果的列重命名?
	select ename,sql*12 as yearsal from emp;
别名有中文?
	select ename,sql*12 as 年薪 from emp;//错误
	select ename,sql*12 as ‘年薪’ from emp;//正确写法

	注意:标准sql语句中要求字符串使用单引号括起来。虽然mysql支持双引号,尽量别用,不通用。
	提示:
	1.任何一条sql语句以“;”结尾
	2.sql语句不区分大小写

5.条件查询

条件查询需要用到where语句,where必须放到from语句表的后面
支持如下运算

运算符    说明
 =          等于
<>或!=    不等于
<          小于
<=         小于等于
>          大于
>=         大于等于
between ... and ...   两个值之间,等同于>= and <=
is null    为null
is not null  不为空
and        并且
or         或者
in         包含,相当于多个or
not in     不再这个范围
not        not可以取非,主要用在is 或 in中
like       like称为模糊查询,支持%或下划线匹配

条件查询语法格式:
	select
		字段,字段...
	from
		表名
	where 
		条件;
查询工资等于5000的员工姓名?
	select ename from emp where sal = 5000;
查询smith的工资
	select sal from emp where eanme='smith';   //注意:字符串需要使用单引号括起来
找出工资高于3000的员工?
	select ename sal from emp where sql>3000;
	select ename sal from emp where sql>=3000;
	select ename sal from emp where sql<3000;
	select ename sal from emp where sql<=3000;

找出工资不等于3000的员工?
	select ename sal from emp where sql<>3000;
	select ename sal from emp where sql!=3000;
找出工资在1100和3000之间的员工,包括1100和3000?
	select ename sal from emp where sql>=1100 and sql<=3000;
	//between...and...是闭区间[1100~3000]
	select ename sal from emp where sal between 1100 and 3000;
找出哪些人津贴为NULL?
	在数据库当中NULL不是一个值,代表什么也没有,为空
	空不是一个值,不能用等号衡量
	必须使用is null 或者 is not null
	select ename,sal,comm from emp where comm is null;
找出哪些人津贴不为NULL?
	select ename,sal,comm from emp where comm is not null;
找出哪些人没有津贴?
	select ename,sal,comm from emp where comm is null or comm = 0;
找出工作岗位是MANAGER和SALESMAN的员工?
	select ename,sal,comm from where job=‘MANAGER’ or job=‘SALESMAN’;
and和or联合使用:找出薪资大于1000的并且部门编号是20或30部分的员工?
	select ename,sal,deptno from emp where sal>1000 and (deptno = 20 or deptno = 30); //错误的
	select ename,sal,deptno from emp where sal>1000 and (deptno = 20 or deptno = 30); //正确的
	注意:当运算符的优先级不确定的时候加小括号。
in等同于or:找出工作岗位是MANAGER和SALESMAN的员工?
	select ename,sal,comm from emp where job in ('MANAGER','SALESMAN');

	select ename,sal,comm from emp where sal in (800,5000); // in后面的值不是区间,是具体的值
not in:不在这几个值当中。找出工资不是800和5000的员工?
	select ename,sal,comm from emp where sal not in (800,5000); // in后面的值不是区间,是具体的值
	
模糊查询like?
找出名字中含有..的?
	在模糊查询当中,必须掌握两个特殊的符号,一个是%,以实_
	(%代表任意多个字符,_代表任意1个字符)
	select ename from emp where eanme like ‘%o%’;
	
找出名字中第二个字母是A的?
	select ename from emp where eanme like ‘_A%’;
找出名字中有下划线的?
	select ename from emp where eanme like ‘%/_%’;  //使用‘/’来实现转义
找出名字中最后一个字母是T的?
	select ename from emp where eanme like ‘%T’;

6.数据排序

排序(升序、降序)

按照工资升序,找出员工名和薪资?
	select 
	 eanme,sal
	from 
	 emp
	order by
	 sal;
	注意:默认是升序。怎么指定升序或降序呢?asc表示升序,desc表示降序。
		select eanme,sal from emp order by sal;   //默认升序
		select eanme,sal from emp order by sal asc;  //升序
		select eanme,sal from emp order by sal desc; //降序
按照工资的降序排序,如果工资相同的时候再按照名字的升序排列?
	select eanme,sal from emp order by sal desc,eanme asc; //注意,多字段排序时,越靠前的字段的主导性越大
找出工作岗位是SALESMAN的员工,并且要求按照薪资的降序排列?
	select eanme,sal,comm from emp where comm='SALESMAN' order by sal desc;
	
	
	select查询语句的优先级
	select 
	    *           3
            from
                tablename   1
	where 
	    条件        2
	order by  
	    ...         4
		先看有没有这个表,然后看查询的条件,再看查询的结果要怎么排序

7.分组函数?(分组函数不可以直接使用在where关键字后面)

分组函数           用处
count          取得记录数
sum            求和
avg            取平均
max            取最大的数
min	       取最小的数

注意:分组函数自动忽略空指,不需要手动的加where条件排序空指。
select count(*) from emp where xxx;    符合条件的所有记录总数
select count(comm) from emp;   comm这个字段中不为空的元素总数
	分组函数不可以直接使用在where关键字后面

找出员工工资总和?
	select sum(sal) from emp;
找出最高工资?
	select max(sal) from emp;		
找出最低工资?
	select min(sal) from emp;
找出总人数?
	select count(ename) from emp;
	select count(*) from emp;

【面试】count(*)和count(字段)区别?
	count(*) 是查询该表的总条数
	count(字段) 是查询该字段中不为NULL的总数量
【面试】(分组函数不可以直接使用在where关键字后面),为什么?
	select ename,sal from emp where sal > avg(sal); //错误
	原因:SQL语句当中有一个语法规则,分组函数不可直接使用在where子句当中。why?
	怎么解释?
		因为gruop by是在where执行之后才会执行的,也就是优先级的问题
		
	
	select查询语句的优先级
	select 
	   ..          5
            from
               ..          1
	where 
	    条件       2
	gruop by
	    ..         3
	having by
	    ..         4
	order by  
	    ...        6   

【面试】select ename,sal from emp where sal > avg(sal); //错误  ,如何写?
	select ename,sal from emp where sal > (select avg(sal) from emp);
分组函数也可以组合起来用:
	select count(*),sum(*),avg(*),max(*),min(*) from emp;

总结:分组函数一共5个,分组函数还有另一个名字:多行处理函数。
	分行处理函数的特点:输入多行,最终输出的结果是1行。
	分组函数会自动排除为NULL的字段,进行计算的

8.单行处理函数?

什么是单行处理函数? 输入一行,输出一行 计算每个员工的年薪?

select eanme,(sal+comm)*12 as yearsql from emp;

重点:所有数据库都是这样规定的,只要有NULL参与的运算结果一定是NULL。 ifnull()
空处理函数? ifnull(可能含有NULL的字段,被当作什么处理):属于单行梳理函数。

 select eanme,ifnull(comm,0) as comm from emp;

9.聚合函数group by和having

gruop by:按照某个字段或者某些字段进行分组。
having:having是对分组之后的数据进行再次过滤。

找出每个工作岗位的最高薪资?
	select max(sal),job from emp group by job;

【面试】select ename,max(sal),job from emp group by job;此mysql语句对吗?
	以上在mysql语句中,查询结果是有的,但是结果并不对,在Oracle数据库当中会报错。语法错误。
	【重点】记住一个规则:当一条语句中有gruop by的话,select后面只能根分组函数和参与分组的字段。


每个工作岗位的平均薪资?
	select job,avg(sal) from emp group by job;

多个字段能不能联合起来一块分组?
找出不同工作岗位的最高薪资?
	select
	   deptno,job,max(sal)
	from
	   emp
	group by
	   depyno,job;
找出每个部门的最高薪资,要求薪资大于2900的数据?
	方法一(效率低):
		第一步:找出每个部门最高薪资
		select max(sal),deptno from emp group by deptno;
		第二步:找出薪资大于2900
		select max(sal),deptno from emp group by deptno having max(sal) > 2900; //这种方式效率低

	方法二(效率高):建议能使用where过滤的尽量使用是where
		select max(sal),deptno from emp where sal>2900 group by deptno; //这种方式效率高

找出每个部门的平均薪资,要求显示薪资大于2000的数据?
	方法一():
		第一步:找出每个部门的平均薪资
		select deptno,avg(sal) from emp group by deptno;
		第二步:找出薪资大于2000的数据
		select deptno,avg(sal) from emp group by deptno having avg(sal) > 2000;
		
		
		// 错误的写法,where后面不能使用分组函数,这种情况只能使用having过滤。
		select deptno,avg(sal) from emp where avg(sal)>2000 group by deptno;   //错误了

10.总结一个完整的DQL语句怎么写?

select查询语句的优先级
	select         5
	   ..          
            from           1
               ..          
	where          2
	    条件       
	gruop by       3
	    ..         
	having by      4
	    ..         
	order by       6
	    ...         

Day02

1.关于查询结果集去重?

select distinct job from emp;   //distinct 关键字去除重复记录

2.distinct只能出现在所有字段的最前面,下边sql语句时错误的

select ename,distinct job from emp; 

3.distinct 的联合去重:distinct出现在多个字段最前边,表示后边所有字段一起去重

select distinct job,deptno from emp;

统计岗位的数量?
	select count(distinct job) from emp;

4.连接查询

4.1什么是连接查询?
	在实际开发中,大部分的情况下都不是从单表中查询数据,一啊不能都是多张表联合查询取出最终的结果
	在实际开发中,一般一个业务都会对应多张表,比如:学生和班级,起码两张表。
	
	之前一张表的缺点:学生和班级信息存储到一张表中,数据会存在大量的重复,导致数据的冗余。

4.2连接查询的分类?
	内连接:
	    等值连接
	    非等值连接
	    自连接
	外连接:
	    左外连接(左连接)
	    右外连接(右连接)
	全连接:(这个很少用)
4.3在表的连接查询方面有一种现象被称为:笛卡尔积现象(笛卡尔乘积现象)
	案例:找出每一个员工的部门名称,要求显示员工名和部门名?
		EMP员工表
		   ename(员工名字)字段
		   deptno(对应的部门)字段
		DEPT部门表
		   deptno(部门no)字段
		   dname(部门名称)字段
		
		select ename,dname from emp,dept;
		最终会显示多条数据,笛卡尔积现象:当两张表进行连接查询时候,没有任何条件进行限制,最终的查询结果条数是两张表记录条数的乘积。
		关于表的别名:
			select e.ename,d.dname from emp e,dept d;
			表的别名有什么好处?
			    第一:执行效率高
			    第二:可读性好
4.4怎么避免笛卡尔积现象?当然加条件过滤。
    思考:避免了笛卡尔积现象,会减少记录的匹配次数吗?
	不会,次数还是两张表的成绩,只不过显示的是有效记录。
	
	案例:找出每一个员工对应的部门名称,要求显示员工名和部门名
		SQL92:(太老,不用了)
		select 
		   e.ename,d.dname
		from 
		   emp e,dept d
		where 
		   e.deptno = d.deptno

5.内连接

5.1内连接之等值连接:最大特点是:条件是等量关系
	案例:查询每个员工的部门名称,要求显示员工名和部门名?
		SQL92:(太老,不用了)
	        select 
		   e.ename,d.dname
		from 
		   emp e,dept d
		where 
		   e.deptno = d.deptno;

		SQL99:(常用的)
		select
		   e.ename,d.dname 
		from 
		   emp e
		join
		   dept d
		on 
		   e.deptno = d.deptno;
		
		//和上边语句是一样的,inner可以省略,带着inner目的是可读性好一些。
		select
		   e.ename,d.dname 
		from 
		   emp e
		inner join
		   dept d
		on 
		   e.deptno = d.deptno;

		语法:
		    ...
			A
		    join
			B
		    on
			连接条件
		    where 
			...
		SQL99语法结构更清晰一些:表的连接条件和后来的where条件分离了

5.2内连接之非等值连接:最大的特点是:连接条件中的关系是非等量关系(指非关系数据连接查询)。
	案例:找出每个员工工资等级,要求显示员工名,工资,工资等级?
		emp员工表
		   ename(员工名字)
		   deptno(对应的部门)
		
		salgrade工资等级表
		   grade(工资等级)
		   losal(最低工资)
		   hisal(最高工资)

		//inner可以省略
		select 
		   e.ename,e.sal,s.grage
		from
		   emp e
		join
		   salgrade s
		on
		   e.sal between s.losal and s.hisal;
		
5.3自连接:最大的特点是:一张表看做两张表。自己连接自己。
	案例:找出每个员工的上级领导,要求显示员工名和对应的领导名?
		(该表中有员工自己有所对应的领导,其中有自己也是领导的相关查询)
		emp a 员工表
		   empno(员工no)
		   ename(员工名字)
		    mgr(员工对应的领导no)
		
		emp b 领导表
		   empno(领导no)
		   ename(领导名字)
		    mgr(领导对应的领导no)
		select 
		  a.ename as '员工表',b.ename as '领导表'
		from
		  emp a
		inner join
		  emp b
		on
		  a.mgr = b.empno;

6.连接查询—外连接

6.1什么是外连接?和内连接有什么区别?
	内连接:
	  假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,这就是内连接。
	  AB两张表没有主父之分,两张表是平等的。
	外连接:
	  假设A和B表进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要查询主表中的数据,捎带着查询副表,
	  当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。
	外连接的分类?
	  左外连接(左连接):表示左边的这张表是主表
	  右外连接(右连接):表示右边的这张表是主表
		左连接有对应右连接的写法,右连接也有对应左连接的写法。
	案例:找出每个员工的上级领导?(所有的员工必须全部查询出来)
		emp a 员工表
		   empno(员工no)
		   ename(员工名字)
		    mgr(员工对应的领导no)
		
		emp b 领导表
		   empno(领导no)
		   ename(领导名字)
		    mgr(领导对应的领导no) 

	    第一种方法:
              使用左外连接:(outer可以省略)
		select
		  a.ename '员工',b.ename
		from
		  emp a
		left outer join
		  emp b
		on
		  a.mgr = b.empno;

	    第二种方法:
              使用右外连接:(outer可以省略)
		select
		  a.ename '员工',b.ename
		from
		  emp b
		right outer join
		  emp a
		on
		  a.mgr = b.empno;
	两种方法查询结果是一样的。

7.三张表怎么连接查询?

emp e 员工表
   empno(员工编号)
   ename(员工名字)
   sal(员工工资)
deptno(员工对应部门编号)
   dept d 部门表
   deptno(部门编号)
   dname(部门名称)
   loc(部门地点)
salgrade s 工资等级表
   grade(工资等级)
   losal(最低工资)
   hisal(最高工资
案例:找出每一个员工的部门名称以及工资等级?
	注意,解释以下:
		select ... 
		from
		   A
		join
		   B
		on
		   ...
		join
		   C
		on
		   ...
		上述表示:A表和B表先进行表连接,连接之后A表继续和C表进行连接。
	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;
案例:找出每一个员工的部门名称、工资等级、以及上级领导?
	select 
	   e.ename '员工',d.dname '部门',s.grade '工资等级',e1.ename '领导'
	from 
	   emp e
	join 
	   dept d
	on 
	   e.deptno = d.deptno
	join
	   salgrade s
	on
	   e.sal bttween s.losal and s.hisal
	left join
	   emp e1
	on
	   e.mgr = e1.empno;

8.子查询

8.1什么是子查询?子查询都可以出现在哪里?
   select语句当中嵌套select语句,被嵌套的select语句是子查询。
   子查询可以出现在哪里?
	select
	   ..(select).
	from
	   ..(select).
	where
	   ..(select).
8.2where子句中使用子查询
  案例:找出高于平均薪资的员工信息?
	select * from emp where sal > avg(sal); //错误写法
	
	第一步:找出平均薪资
	   select avg(sal) from emp;
	第二步:where过滤
	   select * from emp where sal > (select avg(sal) from emp);
	   
8.3from后面嵌套子查询
  案例:找出每个部门平均薪水的薪资等级?
	第一步:找出每个部门平均薪水(按照部门编号分组,求sal的平均值)
	   select deptno,avg(sal) as avgsal from emp group by deptno;
	第二部:将以上的查询作为查找范围,当作临时t表,让t表和salgrade s表连接,条件是 t.avgsal between s.losal and s.hisal
	   select 
	      t.*,s.grade
	   from
	      (select deptno,avg(sal) as avgsal from emp group by deptno) t
	   join
	      salgrade s
	   on
	      t.avgsal between s.losal and s.hisal;
  案例:找出每个部分平均的薪水等级?
	第一步:找出每个员工的薪资等级
	   select e.ename,e.sal,e.deptno,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;
	第二部(完成):
	   select  
		e.ename,e.sal,e.deptno,s.grade
	   from
		emp e
	   join
		salgrade s
	   on
	        e.sal bttween s.losal and s.hisal
	   group by
		e.deptno;
8.4在select后面嵌套子查询
	案例:查出每个员工所在的部门名称,要求显示员工名和部门名。
	第一种方法:
	select 
	   emp e,d.dname
	from
	   emp e
	join
	   dept d
	
	on
	   e.deptno = d.deptno;
	第二种方法:
	select
	   e.ename,e.deptno,
	   (select d.dname from dept d where e.deptno = d.deotno) as dname
	from
	   emp e;

9.UNION 与 UNION ALL 语法与用法

9.1MysqL UNION 用于把来自多个  语句的结果组合到一个结果集合中。
	
   语法为:
	select cloumn,... from table1
	union [all]
	select column,... from table2
	...
   注意:在多个 SELECT 语句中,对应的列应该具有相同的,且第一个 SELECT 语句中被使用的字段名称也被用于结果的字段名称。
9.2UNION 与 UNION ALL 的区别
   当使用 UNION 时,MysqL 会把结果集中重复的记录删掉,而使用 UNION ALL ,MysqL 会把所有的记录返回,且效率高于 UNION。
9.3使用 UNION 查询
	案例:查询两张表中的文章 id 号及标题,并去掉重复记录?
		SELECT aid,title FROM article UNION SELECT bid,title FROM blog
		UNION 查询结果说明:
		  1.重复记录是指查询中各个字段完全重复的记录,如上例,若 title 一样但 id 号不一样算作不同记录。
		  2.第一个 SELECT 语句中被使用的字段名称也被用于结果的字段名称,如上例的 aid。
		  3.各 SELECT 语句字段名称可以不同,但字段属性必须一致。
9.4使用 UNION ALL 查询
	案例:查询两张表中的文章 id 号及标题,并返回所有记录?
		SELECT aid,title FROM article UNION ALL SELECT bid,title FROM blog
		   使用 UNION ALL 的时候,只是单纯的把各个查询组合到一起而不会去判断数据是否重复。
		   因此,当确定查询结果中不会有重复数据或者不需要去掉重复数据的时候,应当使用 UNION ALL 以提高查询效率。
9.5UNION ORDER BY的使用
	如果想使用 ORDER BY 或 LIMIT 来对全部 UNION 结果进行分类或限制,则应对单个 SELECT 语句加圆括号,并把 ORDER BY 或 LIMIT 放到最后一个的后面。
	案例:查询文章和微博中id和标题?
		(SELECT aid,title FROM article)
		union all
		(SELECT bid,title FROM blog)
		ORDER BY aid EDSC
9.6UNION ORDER BY应用于别名
	案例:如果 SELECT 中使用到了,则 OEDER BY 必须引用别名
		(SELECT a AS b FROM table) UNION (SELECT ...) ORDER BY b
9.7MysqL UNION LIMIT的使用
	案例:在 MysqL UNION 中使用 LIMIT 用于限制返回的记录条数,如果对 SELECT 子句做限制,需要对 SELECT 添加圆括号
		(SELECT aid,title FROM article LIMIT 2) 
		UNION ALL
		(SELECT bid,title FROM blog LIMIT 2)

10.LIMIT(重点中的重点,以后分页查询全靠它)

10.1limit是mysql特有的,其他数据库中没有,不通用。	
10.2limit取结果集中的部分数据,这是它的作用。
10.3语法机制
	limit startIndex, length
	    startIndex:表示起始位置,从0开始,0表示第一条数据。
	案例:取出工资前5名的员工(思路:降序取5个)
		select ename,sal from emp order by sal desc;
	取前5个:
		select ename,sal from emp order by sal desc limit 0,5
		select ename,sal from emp order by sal desc limit 5(两种都想,只有一个数字时代表前边的0省略)
10.4limit是sql语句最后执行的一个环节:
	select 	    5
	   ...
	from        1
	   ...
	where       2
	   ...
	group by    3
	   ...
	having      4
	   ...
	order by    6
	   ...
	limit       7
	   ...;
10.5案例:找出工资排名在第4到第9名的员工?
	select ename,sal from emp order by desc limit 3,6;

1.创建表

1.1创建表
   语法格式:
	create table tablename(
		cloumnName dataType(length),
		...
		cloumnName dataType(length),
		
	)
	set character_set_result='gbk';
	show variable like '%char%';
	创建表的时候,表中有字段,每一个字段有:
		*字段名
		*字段数据类型
		*字段长度限制
		*字段约束
类型描述
Char(长度)定长字符串,存储空间大小固定,适合作为主键或外键 (String)
Varchar(长度)定长字符串,存储空间等于实际数据空间(StringBuffer/StringBuilder)
double(有效数字位数,小数位)数值型
Float(有效数字位数,小数位)数值型(Java中的float double)
int(长度)整型(java中的int)
bigint(长度)长整型(java中的long)
Date日期型 年月日(对应Java中java.sql.Date类型)
DateTime日期型 年月日 时分秒 毫秒
time日期型 时分秒
BLOBBinary Large OBject(二进制大对象,存储图片,视频等流媒体信息)
CLOBCharacter Large OBject(字符大对象,存储较大文本,比如,可以存储4G的字符串)
1.2Mysql常用数据类型
	类型                                 描述
	Char(长度)  
1.3char和varchar怎么选择?
	在实际的开发中,当某个字段中的数据长度不发生改变的时候,是定长的,例如:性别、生日等都是采用char。
	当一个字段的数据长度不确定,例如:简介、姓名等都是采用varchar。

1.4BLOB和CLOB类型的使用?
1.5insert语句插入数据
	语法格式:
	    1.insert into 表名(字段名1,字段名2,字段名3,...) values (值1,值2,值3,...)
		要求:字段的数量和值的数量相同,并且数据类型要对应相同。
	    2.insert into t_student(name) values ('王五');
		这个是除了name字段之外,剩下的所有字段自动插入NULL。
	    3.insert into t_student valuses(值1,值2,值3...);     全部字段都选哟插入
	    4.一次插入多行数据
		insert into t_student
			(字段1,字段2,字段3)
		values
			(值1,值2,值3),
			(值1,值2,值3);

2.表的复制

2.1表的复制语法:
    create table 表名 as select语句;
	例子:create table dept1 as select * from dept;
2.2将查询结果插入到一张表中?
    insert into dept1 select * from dept;

3.修改数据:update

3.1语法格式:
	update 表名 set 字段名1=值1,字段名2=值2...where 条件;
   注意:没有条件整张表数据全部更新。
   案例:将部门10的LOC修改为shanghai,将部门名称修改为renshibu
	update dept1 set loc = 'shanghai',dname='renshibu' where deptno = 10;
3.2更新所有记录
   update dept1 set loc = ‘x’,dname = ‘y’;

4.删除数据:delete

4.1语法格式:
   delete from 表名 where 条件;
   注意:没有条件全部删除
   删除10部门数据?
     delete from dept1 where deptno = 10;
   删除所有记录?
     delete from dept1;
   怎么删除大表?(重点)
     truncate table 表名;  //表被截断,不可回滚。永久丢失。

5.表结构的修改,不讲述了,可以使用工具完成即可。

6.约束

6.1什么是约束?常见的约束有哪些?
   约束是为了保证数据的安全性,合法性,完整性,有效性 。
   在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的
   合法性、有效性、完整性。
   常见的约束有哪些呢?
	非空约束(not null):约束的字段不能为null
	唯一约束(unique):约束的字段不能重复
	主键约束(primary key):约束的字段既不能为null,也不能重复(简称PK)
	外键约束(foreign key):()
	检查约束(check):注意Oracle数据库有check约束,但是mysql没有,目前mysql不支持该约束。
6.2非空约束(not null)
	    drop table if exists t_student;
	    create table t_user(
		id int,
		sname varchar(255) not null
		)
	
6.3唯一约束(unique)
	唯一约束修饰的字段具有唯一性,不能重复。但是可以为NULL。
	案例:列中添加约束【列级约束】
	    drop table if exists t_user;
	    create table t_user(
		id int,
		username varchar(255) unique   //【行级约束】
		)
	案例:多个字段联合起来添加约束【表级约束】

	    drop table if exists t_user;
	    create table t_user(
		id int,
		username varchar(255),
		usercode varchar(255),
		unique(username,usercode) //多个字段联合起来不能重复,需要是唯一的【表级约束】
		)
6.4主键约束
	怎么给一张表添加主键约束呢?
	    drop table if exists t_user;
	    create table t_user(
		id int primary key,   //主键约束【列级约束】
		username varchar(255) unique
		)
	根据以上的测试得出:id是主键,因为添加了主键约束,主键字段中的数据不能为null,也不能重复。
	【重点】主键的特点:不能为null,也不能重复。

	*主键线管的术语?
	  主键约束:primary key
	  主键字段:id字段添加primary key之后,id叫做主键字段
	  主键值:id 字段中的每一个值都是主键值
		

	*主键有什么作用?
	   - 表的设计三藩市中有要求,第一范式就要求任何一张表都应该有主键。
	   - 主键的作用:主键值是这行记录在这张表当中的唯一标识。(就像一个人的身份证号码一样)

	*主键的分类?
	   根据主键字段的字段数量来划分:
		单一主键(推荐的,常用的)
		复合主键(多个字段联合起来添加一个主键约束)【复合抓奸不建议使用,因为复合主键违背了三范式】
	   根据主键性质来划分:
		自然主键:主键值最好就是一个和业务没有任何关系的自然数(推荐)
		业务主键:主键值和系统的业务挂钩,例如:拿着银行卡的卡号做主键,拿着身份证号码作为主键。(不推荐使用)
			  最好不要拿着和业务挂钩的字段作为主键。因为以后的业务一旦发生改变的时候,主键值可能也需要随着发生变化,
			   但有的时候没有办法变化,因为变化可能会导致主键值重复。

	*一张表的主键约束只能有一个

	*使用表级约束方式定义主键
	   drop table if exists t_user;
	   create table t_user(
		id int,
		username varchar(255),
		primary key(id)   //【表级约束方式定义主键】
		);
	  
	*复合主键约束(不建议掌握,,id和username不能同时相同)

	   drop table if exists t_user;
	   create table t_user(
		id int,
		username varchar(255),
		primary key(id,username)   //【表级约束方式定义主键】
		);
	
	*mysql提供主键值自增
	    drop table if exists t_user;
	    create table t_user(
		id int primary key auto_increment,   //【主键自动增长】
		username varchar(255),
		primary key(id)  
		);
6.5外键约束(foreign key)
	*关于外键相关术语
	   外键约束:(foreign key)
	   外键字段:添加有外键的约束的字段
	   外简直:外键字段中的每一个值
	*业务背景:
	  请设计数据库表,用来维护学生和班级的信息?
		在设计表的时候如果出现冗余可以创建两张表来弥补这样的缺点
	  两张表:
		t_class 班级表
		cno(PK)   cname
		101         二中1班
		102         二中2班
		
		t_student 学生表
		sno(PK)   sname        calssno
		1           zs1           101
		2           zs2           102
		3           zs3           101
                4           zs4		  102
	       * 将以上表种的建表语句写出来:
		   t_student中的classno字段引用t_class表中的cno字段,此时t_student表叫做子表。
		   t_class表叫做父表。
		创建顺序要求:
		   删除数据的时候,先删除子表,再删除父表。
		   添加数据的时候,先添加副表,再添加子表。
		   创建表的时候,先创建父表,再创建子表。
		   删除表的时候,先删除子表,再删除父表。

		*创建两张表让他们有关联
		   create table t_class(
			cno int,
			cname varchar(255),
			primary key(cno)
			);
		   create table t_student(
			sno int,
			sname varchar(255),
			classno int,
			foreign key(calssno) references t_calss(cno)
			);
		* 外键字段引用其他表的某个字段的时候,被引用的字段必须是主键吗?
			注意:被约束的字段不一定是主键,但止少育有unique约束。

7什么是事务?

一个事务是一个完整的业务逻辑单元,不可再分。
比如:银行账户转账,从A账户向B账户转账10000.需要执行两条update语句。
	update t_act set balance = balance - 1000 where actno = 'ctn-001';
				
	update t_act set balance = balance + 1000 where actno = 'ctn-002';
以上两条DML语句必须同时成功,或者同时失败,不允许出现一条成功,一条失败。
要想保证以上的两条DML语句,同时成功或者同时失败,那么就需要使用数据库的”事务机制“。
7.1和事务相关的语句只有:DML语句。(insert delete update)
    为什么?因为它们这三个语句都是和数据库表当中的”数据“相关的
    事务的存在是为了保证数据的完整性、安全性
7.2事务的特性?
   事务包括四大特性:ACID
	A:原子性:事务的最小工作单元,不可再分。
	C:一致性:事务必须保证多条DML语句同时成功或者同时失败。
	I:隔离性:事务A与事务B之间具有隔离。
	D:持久性:持久性说的是最终数据必须持久化到鹰派文件中,事务才算成功的结束。
7.3关于事务之间的隔离性
	事务隔离性存在隔离级别,理论上隔离级别包括4个:
	    第一级别:读未提交(read uncommitted)
		对方事务还没有提交,我们当前事务可以读取到对方未提交的数据。
	    第二级别:读已提交(read committed)
		对象事务提交之后的数据我方可以读取到。
 		读已提交存在的问题是:不可重复读。
	    第三级别:可重复读(repeatable read)
		这种隔离级别解决了:不可重复读问题。
		这种隔离级别解决了:不可重复读的问题。

	    第四级别:序列化读/串行化读
		解决了所有问题。
		效率低。需要事务排队。
	
	    【oracle数据库默认的隔离级别是:读已提交】
	    【mysql数据库默认的隔离级别是:可重复读】
	    	7.4关于事务的隔离级别?
	理论上事务的隔离级别有4个(依次从低到高):
		读未提交(read uncommitted)
		   这种隔离级别最低,一般都是只停留在理论上,实际的数据库一般是止少二档起步。
		   这种隔离级别存在的问题是:脏读现象
		   对方事务没有提交的数据,我方事务可以读取到,称之为读到了脏数据。
		读已提交(read committed)
		   这种隔离级别是多数数据库的默认隔离级别,比较具有代表的就是oracle
		   这种隔离级别表示对方事务提交之后,我方事务才可以读到数据。
			这种隔离级别解决了脏读现象,那么它存在什么问题呢?
			这种隔离级别存在“不可重复读”现象
		可重复读(repeatable read):
		   对方事务提交之后的数据,我方还是读不到。
		   采用这种隔离级别可以保证:只要当前事务没结束,读到的数据永远都是一样的。第一次读取和第二次读取的结果完全一致。
			这种隔离级别解决了“不可重复读”问题,那么它存在什么问题?
		 	存在幻想读问题,读取的数据不是真实的,是幻想。
		序列化读/串行化读(serializable)
			事务A和事务B不能并发,只能排队。这种隔离级别特别高,效率最低。数据最安全。
			解决了所有的问题。
7.5演示事务
	* mysql事务默认情况下是自动提交的,也就是自动提交一条sql语句则自动提交。
	(什么是自动提交?只要执行任意一条DML语句则提交一次)怎么关闭自动提交?
		直接开启事务就关闭了自动提交了,start transaction;
	* 演示
		(1)平时直接使用insert语句,则数据会保存到数据库
		(2)演示事务回滚。使用start transaction;和rollback;
			2.1输入start transaction;语句
			2.2使用insert添加数据
			2.3继续insert添加数据
			2.4使用rollback;语句,则以上的insert添加数据则全部回滚,不会保存到数据库
		(3)演示事务提交。使用start transaction;和commit;
			3.1输入start transaction;语句
			3.2使用insert添加数据
			3.3继续insert添加数据
			3.4使用commit;语句,则以上的insert添加数据则全部提交,保存到数据库
7.6使用两个事务演示以上隔离级别
	第一:演示read uncommitted
	   设置事务的隔离级别read uncommitted读未提交:
		set global transaction isolation level read uncommitted;
	   查看事务的全局隔离级别:
		select @@global.tx isolation;

8.索引

8.1什么是索引,有什么用?
  索引就相当于一本书的目录,通过目录可以快速找到相应的资源,
  数据库查询一张表有两种检索方式:
	第一种:全表扫描
	第二种:根据索引检索(效率高)
  索引根本原理是缩小了扫描范围。
  索引可以提高检索效率,但是不能随意添加索引,因为索引也是数据库当中的对象,也需要数据库不断的维护,是有维护成本的。
  表中数据经常被修改是不适合添加索引的,因为数据一旦修改,索引需要重新排序,进行维护。
8.2怎么创建索引对象?
	使用select ename,sal from emp where ename = 'SMITH';
	当eanme字段没有添加索引的时候,以上sql语句进行全表扫描。
	当eanme字段添加索引的时候,以上sql语句会根据索引扫描,快速扫描。
8.3什么时候考虑给字段添加索引?
	* 数据量庞大
	* 该字段很少的DML操作(增删改少的字段,因为索引需要维护)
	* 该字段经常出现在where子句中(经常根据哪个字段查询)
8.4注意:
	主键和具有unique(唯一)约束的字段自动会添加索引。
	根据主键查询效率较高。尽量根据主键检索。
8.5查看sql语句的执行计划
explain select ename,sal from emp where sal = 5000;此语句可以查看sql语句的执行相关内容

8.6给字段添加索引语句:
	create index sal_index on emp(sal);   //给表为emp,字段为sal添加索引,索引名字为sal_index
	后边可以根据索引名称删除索引
8.7索引底层采用的数据结构是:B+Tree
8.8索引的实现原理?
	当使用语句创建索引时,有可能在内存或是硬盘会存在一个索引,到底存储在哪里需要知道自己的数据库使用的引擎。
	生成的索引资源会分区,当再次查找数据时候,会根据自己索引进行检索,提高了查询效率。
	
8.9索引的分类?
	单一索引:给单个字段添加索引
	复合索引:给多个字段联合起来添加1个索引
	主键索引:主键会自动添加索引
	唯一索引:有unique约束的字段上回自动添加索引
8.10索引的失效?
	select ename form emp where ename like '%A%';
	模糊查询的时候,第一个通配符使用的是%,这个时候索引是失效的。

在这里插入图片描述

9.视图(百度自查)

10.DBA命令(了解)

10.1新建用户
10.2授权
10.3回收权限
10.4导出导入

11.三范式

11.1什么是设计范式?
	设计表的依据。按照这个三范式设计的表不会出现数据冗余。
11.2三范式都有哪些?
   第一范式:任何一张表都应该有主键,并且每一个字段原子性不可再分。
   第二范式:建立在第一范式的基础上,所有非主键字段完全依赖主键,不能产生部分依赖。
   	多对多?三张表,关系表两个外键。
   第三范式:建立在第二范式的基础之上,所有非主键字段直接依赖主键,不能产生传递依赖。
11.3创建表口诀
	一对一两种方案
	   (1)主键共享
	   (2)外键唯一
	一对多
	   多的表加外键
	多对多
	   三张表 一个关系表  两个外键表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值