MySQL基础记录,数据库的创建,引入sql,数据的查询,排序,模糊查询,分页,表的连接查询,子查询,增删改

MySQL 

1,sql,DB,DBMS 分别是什么,他们之间的关系?
DB:	
	DataBase(数据库,数据库实际上是在硬盘上以文件的形式存在!)
DBMS: 
	DataBase Management System(数据库管理系统,常见的有:MySQL Oracle DB2 Sybase SqlServer...)

SQL: 
	结构化查询语言,是一门标准通用的语言。标准的sql适合于所有的数据库产品。
	SQL属于高级语言。只要能看懂英语单词的,写出来的sql语句,可以读懂什么意思。
	SQL语句在执行的时候,实际上内部也会先进行编译,然后再执行sql。(sql语句的编译由DBMS完成。)
	
	DBMS负责执行sql语句,通过执行sql语句来操作DB当中的数据。
	DBMS -(执行)-> SQL -(操作)-> DB
	
2,表 table 
	表示数据库的基本组成单元,所有的数据都以表格的形式组织,目的是可读性强!
	一个表包括行,列MySQL 

1,sql,DB,DBMS 分别是什么,他们之间的关系?
DB:	
	DataBase(数据库,数据库实际上是在硬盘上以文件的形式存在!)
DBMS: 
	DataBase Management System(数据库管理系统,常见的有:MySQL Oracle DB2 Sybase SqlServer...)

SQL: 
	结构化查询语言,是一门标准通用的语言。标准的sql适合于所有的数据库产品。
	SQL属于高级语言。只要能看懂英语单词的,写出来的sql语句,可以读懂什么意思。
	SQL语句在执行的时候,实际上内部也会先进行编译,然后再执行sql。(sql语句的编译由DBMS完成。)
	
	DBMS负责执行sql语句,通过执行sql语句来操作DB当中的数据。
	DBMS -(执行)-> SQL -(操作)-> DB
	
2,表 table 
	表示数据库的基本组成单元,所有的数据都以表格的形式组织,目的是可读性强!
	一个表包括行,列
		行:被称为数据/记录(data)
		列:被称为字段(column)
		
		每个字段应该包括:字段名,数据类型,相关约束;
		
		
3、学习MySQL主要还是学习通用的SQL语句,那么SQL语句包括增删改查,SQL语句怎么分类呢?
	DQL(数据查询语言): 查询语句,凡是select语句都是DQL。(重难点)
	DML(数据操作语言):insert delete update,对表当中的数据进行增删改。
	DDL(数据定义语言):create drop alter,对表结构的增删改。
	TCL(事务控制语言):commit提交事务,rollback回滚事务。(TCL中的T是Transaction)--->(需要对事物的相关操作有深刻的理解)
	DCL(数据控制语言): grant授权、revoke撤销权限等。
	
	
4,导入数据

	1,登录数据库管理系统 以MySQL为例,mysql -uroot -proot (假设root的密码为root)
	2,查看有哪些数据库: show databases;(这个不是sql语句,是MySQL命令)
	3,创建我们自己的数据库:create database 数据库名;	(这个不是sql语句,是MySQL命令)
	4,使用创建好的数据库: use 数据库名;(这个不是sql语句,是MySQL命令)
	5,查看当前使用的数据库中有哪些表: show tables;(这个不是sql语句,是MySQL命令)
	6,初始化数据 : source 对应的sql文件(mysql> source F:\bjpowernode.sql)
		小提示:不会在没使用数据库的情况就引入吧?不会吧? 我有一次就是这样搞了(ERROR 1046 (3D000): No database selected)


5,删除数据库:drop database 数据库名;

6,查看表的结构: desc 表名; --->(这个命令在开发中比较常用 属性和字段要对应)
	mysql> desc dept;
	+--------+-------------+------+-----+---------+-------+
	| Field  | Type        | Null | Key | Default | Extra |
	+--------+-------------+------+-----+---------+-------+
	| DEPTNO | int         | NO   | PRI | NULL    |       |
	| DNAME  | varchar(14) | YES  |     | NULL    |       |
	| LOC    | varchar(13) | YES  |     | NULL    |       |
	+--------+-------------+------+-----+---------+-------+
	3 rows in set (0.03 sec)
	
7,查看表中的数据: select * from 表名;
	可以看到表中的全部数据!
	
8,一些常用的命令:
	a> 查看当前使用的数据库: select database();
		mysql> select database();
		+------------+
		| database() |
		+------------+
		| test_db    |
		+------------+
		1 row in set (0.00 sec)	
		在上面的实例中使用的数据库是test_db;
	b> 查看MySQL的版本号: select version();
	
	c> 	\c   命令,结束一条语句。
	
	d> 	exit 命令,退出MySQL。

9,简单的查询语句(DQL)
	1,语法格式:
		select 字段1,字段2,... from 表名;
		小提示: sql语句一 ’;’结尾。sql语句不区分大小写。
	2,字段是可以参与数学运算的:
		a> 查询员工的年薪的sql语句:(在下面的数据中的工资为原来的12倍,就是*12的结果)
			mysql> select ename,sal*12 from emp;
			+--------+----------+
			| ename  | sal*12   |
			+--------+----------+
			| SMITH  |  9600.00 |
			| ALLEN  | 19200.00 |
			| WARD   | 15000.00 |
			| JONES  | 35700.00 |
			| MARTIN | 15000.00 |
			| BLAKE  | 34200.00 |
			| CLARK  | 29400.00 |
			| SCOTT  | 36000.00 |
			| KING   | 60000.00 |
			| TURNER | 18000.00 |
			| ADAMS  | 13200.00 |
			| JAMES  | 11400.00 |
			| FORD   | 36000.00 |
			| MILLER | 15600.00 |
			+--------+----------+
			14 rows in set (0.00 sec)	
		b> 查询时给列起别名:
			select 字段1,字段2 as 别名 from 表名;(当别名中有用到中文注意别名用''包起来) as 是可以省略的
			mysql> select ename,sal*12 as '年薪' from emp;
				+--------+----------+
				| ename  | 年薪        |
				+--------+----------+
				| SMITH  |  9600.00 |
				| ALLEN  | 19200.00 |
				| WARD   | 15000.00 |
				| JONES  | 35700.00 |
			

10,条件查询
	语法格式 :select * from 表名 where 条件;
	
	条件语句:	
		> >= < <= 
		<> != (这两个都是不等于的意思)
		and 需要两个条件同时满足
		or 在多个条件中只需满足一条即可 
		between...and...是闭区间 [a~ b]
			易错:在使用上面的between..and.. 语句时只能时 小-->大,否则查询不到任何数据
			提示:between..and.. 还可以使用在字符串方面 左闭右开
			
		null--->is null,is not null (在数据库中null代表什么都没有不能等同于0,他不是一个值,所以判断是否为null不能用 =
				
	示例:and or 一起进行查询 ,在员工表中查询薪资大于1000并且部门编号是20或30的员工姓名
	select ENAME from emp where sal>1000 and (deptno = 20 or deptno = 30);  小提示:在这里的小括号是非常重要的!!
	如果没有小括号则成了工资大于1000并且部门编号为20,  或者部门编号30,对部门编号30的没了工资大于1000的条件,所以需要小括号
	小括号,不确定优先级时添加小括号不易出错,可读性更好!
		
		in 等同于 or
			示例:找出工作岗位是MANAGER和SALESMAN的员工?
			 1> select * from emp where job = 'MANAGER' or job = 'SALESMAN'; 注意不要落了单引号,否则(ERROR 1054 (42S22): Unknown column 'MANAGER' in 'where clause')
			 2> select * from emp where job in('MANAGER','SALESMAN'); 小提示:写的时候一定要以英文的标点符号,否则报错!!!
			 
		not in(a,b,c)  不在这些值中!
			查询工资不是3000,5000 的员工
			select ename,sal from emp where sal not in(3000,5000);	 
			  	+--------+---------+
				| ename  | sal     |
				+--------+---------+
				| SMITH  |  800.00 |
				| ALLEN  | 1600.00 |
				| WARD   | 1250.00 |
				| JONES  | 2975.00 |
				| MARTIN | 1250.00 |
				| BLAKE  | 2850.00 |
				| CLARK  | 2450.00 |
				| TURNER | 1500.00 |
				| ADAMS  | 1100.00 |
				| JAMES  |  950.00 |
				| MILLER | 1300.00 |
				+--------+---------+
				11 rows in set (0.00 sec)
				
11,模糊查询,这是在开发的实际需求中通常用到,最常见的形式是通过关键字的查询! 比如在一个水果库存系统中检索框的功能实现
通过在搜索框中输入水果名或相关的关键字,然后在水果名的字段和在描述中查询相关的结果然后返回!
	like
		在模糊查询中一定要牢记两个符号 % _
			% 代表任意多个字符
			_ 代表任意一个字符
				示例:查询名字中有字母w的:select ename from emp where ename like '%w%';	
				查询名字中第三个字母是N的员工:select ename from emp where ename like '__N%';						
				查询名字中有 _ 的员工名:select ename from emp where ename like '%_%';--->这是错误的会将所有的员工返回需要将_转义否则,MySQL会将它当成任意一个字符!
								select ename from emp where ename like '%\_%';
								
								
12,排序

	order by 字段名1  --> 以字段1升序排序
	示例:按照工资升序排序:select ename,sal from emp order by sal;(默认是升序排序)
								
		mysql> select ename,sal from emp order by sal;
		+--------+---------+
		| ename  | sal     |
		+--------+---------+
		| SMITH  |  800.00 |
		| JAMES  |  950.00 |
		| ADAMS  | 1100.00 |
		| WARD   | 1250.00 |
		| MARTIN | 1250.00 |
		| MILLER | 1300.00 |
		| TURNER | 1500.00 |
		| ALLEN  | 1600.00 |
		| CLARK  | 2450.00 |
		| BLAKE  | 2850.00 |
		| JONES  | 2975.00 |
		| SCOTT  | 3000.00 |
		| FORD   | 3000.00 |
		| KING   | 5000.00 |
		+--------+---------+
		14 rows in set (0.00 sec)						
	如何指定升序和降序:asc 升序,desc 降序;
	在上面的基础上小做改动就可以是降序排序, select ename,sal from emp order by sal desc;
								
	
		select 
			字段						3
		from
			表名						1
		where
			条件						2
		order by
			....						4
		
		order by是最后执行的。
13,分组函数
	count 计数
	sum 求和
	avg 平均值
	max 最大值
	min 最小值
	
	分组函数也叫做多行处理函数,特点:输入多行输出只有一行!
	易错点:分组函数会自动忽略null
	
	示例:找出工资高于平均工资的员工?
		1. select avg(sal) from emp;
			+-------------+
			| avg(sal)    |
			+-------------+
			| 2073.214286 |
			+-------------+
			1 row in set (0.00 sec)	
		2. select ename,sal from emp where sal>2073.214286;	
			+-------+---------+
			| ename | sal     |
			+-------+---------+
			| JONES | 2975.00 |
			| BLAKE | 2850.00 |
			| CLARK | 2450.00 |
			| SCOTT | 3000.00 |
			| KING  | 5000.00 |
			| FORD  | 3000.00 |
			+-------+---------+
	可能在这个示例的解决的过程中你可能会使用这个sql语句,select ename,sal from emp where sal>avg(sal);		
		报错:ERROR 1111 (HY000): Invalid use of group function	 (分组函数的使用无效)

			各个模块的执行顺序,这个需要很好地弄清!然后我们就可以知道为什么不能上面那样写,因为分组是在where之后执行的
 				select		5
					..			
				from			1
					..
				where			2
					..
				group by		3
					..
				having		4
					..
				order by		6
					..


	小细节:count 的使用,count(*),count(字段)区别:
		count(*) 是统计总记录条数,count(字段)统计的是在具体的字段中不为null的记录条数
		
	小提示:分组函数也可以组合着使用:
		select count(*),sum(sal),avg(sal),max(sal),min(sal) from emp;
			+----------+----------+-------------+----------+----------+
			| count(*) | sum(sal) | avg(sal)    | max(sal) | min(sal) |
			+----------+----------+-------------+----------+----------+
			|       14 | 29025.00 | 2073.214286 |  5000.00 |   800.00 |
			+----------+----------+-------------+----------+----------+


14,单行处理函数
	特点:输入一行,输出一行
	
	ifnull(a,b)  --> ifnull()就是属于单行处理函数,
		示例:计算每个员工的年薪:select ename,(sal+comm)*12 '年薪' from emp;
				+--------+----------+
				| ename  | 年薪     |
				+--------+----------+
				| SMITH  |     NULL |
				| ALLEN  | 22800.00 |
				| WARD   | 21000.00 |
				| JONES  |     NULL |
				| MARTIN | 31800.00 |
				| BLAKE  |     NULL |
				| CLARK  |     NULL |
				| SCOTT  |     NULL |
				| KING   |     NULL |
				| TURNER | 18000.00 |
				| ADAMS  |     NULL |
				| JAMES  |     NULL |
				| FORD   |     NULL |
				| MILLER |     NULL |
				+--------+----------+
			从上面的数据不难看出有很多是null?? 这是因为MySQL中任何与null运算的数结果都为null,因为上面的有些员工的comm值是null所以
			需要使用 ifnull(可能为null的数据,当成什么处理)
			select ename,(sal+ifnull(comm,0))*12 '年薪' from emp; --> 这里就是如果comm为null则当成0处理!			




15,group by 和 having 
	group by : 按照某个字段或者某些字段进行分组。
	having : having是对分组之后的数据进行再次过滤。
	
	案例:找出每个工作岗位的最高薪资。
		我们分析题意,不难发现 "每个工作岗位" 所以以工作进行分组,select ename,max(sal),job from emp group by job; 
			+-------+----------+-----------+
			| ename | max(sal) | job       |
			+-------+----------+-----------+
			| SMITH |  1300.00 | CLERK     |
			| ALLEN |  1600.00 | SALESMAN  |
			| JONES |  2975.00 | MANAGER   |
			| SCOTT |  3000.00 | ANALYST   |
			| KING  |  5000.00 | PRESIDENT |
			+-------+----------+-----------+
		雷区:上面的查询在MySQL中有结果,结果是无意义的,在Oracle中报语法错误,Oracle相比MySQL语法更加严谨,为什么会报错!!--> 当一条sql语句中有group by 时select 后面只能跟分组函数和参与分组的字段。
		mysql> select * from emp;
			+-------+--------+-----------+------+------------+---------+---------+--------+
			| 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 |
			+-------+--------+-----------+------+------------+---------+---------+--------+
			对比上面的结果 CLERK 对应的最高薪资1300显然是不对应SMITH,应该是MILLER,所以说我们查的表没意义!!!
			
			select max(sal),job from emp group by job;
			+----------+-----------+
			| max(sal) | job       |
			+----------+-----------+
			|  1300.00 | CLERK     |
			|  1600.00 | SALESMAN  |
			|  2975.00 | MANAGER   |
			|  3000.00 | ANALYST   |
			|  5000.00 | PRESIDENT |
			+----------+-----------+
	分组函数一般都会和group by 联合使用,这也是他们为什么会称为分组函数的原因。
	任何一个分组函数都是执行group by结束,才会执行,如果sql语句中没有group by则整张表的数据自成一组。
	
	多个字段联合分组:
		案例:查询每个部门不同工作岗位的最高薪资,"每个部门" "不同工作岗位" ---> 以工作和部门进行分组!
			select deptno,job,max(sal) from emp group by deptno,job;
		
		案例:找出每个部门的最高薪资,要求显示薪资大于2900的数据。
			select max(sal),deptno from emp where sal>2900 group by deptno;  -->效率更高
			select max(sal),deptno from emp group by deptno having max(sal)>2900; --> 效率较低
			
		案例:找出每个部门的平均薪资,要求显示薪资大于2000的数据。
			分析: "每个部门" "平均" "要求"
			select avg(sal),deptno from emp group by deptno having avg(sal)>2000;	
			按照之前的套路,你可能会想到where 比 having 更加高效,所以你可能会试下面的语法:
				select avg(sal),deptno from where avg(sal)>2000 emp group by deptno;//有语法的错误
				注意,易错,重要:where 后不能直接跟分组函数!!!!!!!
				
16,总结一个完整的DQL语句怎么写?

	select		5
		..
	from			1	
		..
	where			2
		..
	group by		3
		..
	having		4
		..
	order by		6	
		..		
		
		
		

***********************************************************************************************************
*************************************第二部分回顾*********************************************************
1,查询结果的去重
	distinct:  select distinct job from emp;		
		
	注意点:distinct 要出现在所有字段的最前面,错误的写法select ename,distinct job from emp;
		应该: select distinct deptno,job from emp;
		
	案例:统计岗位的数量
		select count(distinct job) from emp; 
		



2,连接查询***重点***
	2.1实际的开发中通常都是从多张表联合查询,比如学生表和班级表等需要联合查询!
	
	2.2连接查询:
		根据表的连接方式有:内连接,外连接,全连接;
			内连接:
				等值连接
				非等值连接
				自连接
			外连接:
				左外连接
				右外连接
			全连接:
				(用的不多,很少)
			
		在表的连接时有一种现象称为笛卡尔积现象。当对两张表进行查询时没有任何条件的限制,结果是两张表的乘积,这种现象称为
		笛卡尔积乘积现象。
		
		关于表的别名:
			执行效率高(??)
			可读性高
	
			
		避免笛卡尔乘积的方法:家条件进行过滤
			查询员工对应的部门名:select ename,dname from emp,dept where emp.deptno=dept.deptno;			
				上面的语法为旧语法,SQL92,以后不用。

	2.3内连接之等值连接:最大特点是:条件是等量关系。
		案例:查询每个员工的部门名称,要求显示员工名和部门名。
			语法:
				...
					A
				inner join(inner 可以省略,但是带着inner有更好的可读性)
					B
				on
					连接条件
				where
					...
			mysql> select e.ename as '员工' , d.dname as '部门' from emp e inner join dept d on e.deptno=d.deptno;

			
		内连接之非等值连接:	
			案例:找出每个员工的工资等级,要求显示员工名、工资、工资等级。	
			mysql> select e.ename '员工',e.sal '薪资',s.grade '等级' from emp e join salgrade s on e.sal between s.losal and s.hisal order by s.grade;
			+--------+---------+------+
			| 员工     | 薪资    | 等级   |
			+--------+---------+------+
			| SMITH  |  800.00 |    1 |
			| ADAMS  | 1100.00 |    1 |
			| JAMES  |  950.00 |    1 |
			| WARD   | 1250.00 |    2 |
			| MARTIN | 1250.00 |    2 |
			| MILLER | 1300.00 |    2 |
			| ALLEN  | 1600.00 |    3 |
			| TURNER | 1500.00 |    3 |
			| JONES  | 2975.00 |    4 |
			| BLAKE  | 2850.00 |    4 |
			| CLARK  | 2450.00 |    4 |
			| SCOTT  | 3000.00 |    4 |
			| FORD   | 3000.00 |    4 |
			| KING   | 5000.00 |    5 |
			+--------+---------+------+
		
		自连接:
			特点:一张表当做两张表处理,自己连接自己
			案例:找出每个员工的上级领导,要求显示员工名和对应的领导名。
			select e.ename '员工',l.ename '领导' from emp e join emp l on e.mgr=l.empno;
		 	mysql> select e.ename '员工',l.ename '领导' from emp e join emp l on e.mgr=l.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 |
			+--------+-------+
			
			注意:) 其实仔细考虑上面的查询是不满足需求的,因为就算没有上级领导的员工也应该显示出来!! 解决:---> 外连接
			
		外连接:	
			什么是外连接,和内连接有什么区别?
			
				内连接:
					假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,这就是内连接。
					AB两张表没有主副之分,两张表是平等的。
			
				外连接:
					假设A和B表进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要查询主表中
					的数据,捎带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。
				
				外连接的分类?
					左外连接(左连接):表示左边的这张表是主表。
					右外连接(右连接):表示右边的这张表是主表。
			
					左连接有右连接的写法,右连接也会有对应的左连接的写法。
						
			对上面的内连接的案例员工与领导的查询可以使用外连接更加符合条件:
			 	左外连接:select e.ename '员工',l.ename '领导' from emp e left join emp l on e.mgr=l.empno;
				右外连接:select e.ename '员工',l.ename '领导' from emp e rigth join emp l on e.empno=l.mgr;
	
	
	三张表怎么连接查询:
		案例:找出每一个员工的部门名称以及工资等级。
		 	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; 
					....
						a
					join 
						b
					on 
						a和b连接的条件
					join 
						c
					on
						a和b连接后的表与c连接的条件
						
		案例:找出每一个员工的部门名称、工资等级、以及上级领导。
			mysql> select e.ename,d.dname,s.grade,l.ename from emp e left join emp l on e.mgr = l.empno join salgrade s on e.sal between s.losal and s.hisal join dept d on e.deptno = d.deptno;
				+--------+------------+-------+-------+
				| ename  | dname      | grade | ename |
				+--------+------------+-------+-------+
				| SMITH  | RESEARCH   |     1 | FORD  |
				| ALLEN  | SALES      |     3 | BLAKE |
				| WARD   | SALES      |     2 | BLAKE |
				| JONES  | RESEARCH   |     4 | KING  |
				| MARTIN | SALES      |     2 | BLAKE |
				| BLAKE  | SALES      |     4 | KING  |
				| CLARK  | ACCOUNTING |     4 | KING  |
				| SCOTT  | RESEARCH   |     4 | JONES |
				| KING   | ACCOUNTING |     5 | NULL  |
				| TURNER | SALES      |     3 | BLAKE |
				| ADAMS  | RESEARCH   |     1 | SCOTT |
				| JAMES  | SALES      |     1 | BLAKE |
				| FORD   | RESEARCH   |     4 | JONES |
				| MILLER | ACCOUNTING |     2 | CLARK |
				+--------+------------+-------+-------+
				
				
	子查询:
		什么是子查询?子查询都可以出现在哪里?
			select语句当中嵌套select语句,被嵌套的select语句是子查询。	
			
			子查询可以出现在哪里?
		select
			..(select).
		from
			..(select).
		where
			..(select).
			
		
		where子句中使用子查询
			案例:找出薪资高于平均薪资的员工;
				select ename,sal from emp where sal>(select avg(sal) from emp);
			
			
		from后面嵌套子查询
			案例:找出每个部门平均薪水的等级。	
				select e.job,s.grade from salgrade s join (select e.job,avg(e.sal) asal from emp group by job) t on t.asal between s.losal and hisal; t. 	
		
			select d.dname,avg(sal) from dept d join emp e on d.deptno = e.deptno group by d.dname;
			+------------+-------------+
			| dname      | avg(sal)    |
			+------------+-------------+
			| RESEARCH   | 2175.000000 |
			| SALES      | 1566.666667 |
			| ACCOUNTING | 2916.666667 |
			+------------+-------------+
			select
			 	t.dname,t.asal,s.grade 
			 from
			 	 salgrade s
			 join
			 	 (select d.dname,avg(sal) asal from dept d join emp e on d.deptno = e.deptno group by d.dname) t
			 on 
			 	t.asal between s.losal and s.hisal;
			 	
			 	+------------+-------------+-------+
				| dname      | asal        | grade |
				+------------+-------------+-------+
				| RESEARCH   | 2175.000000 |     4 |
				| SALES      | 1566.666667 |     3 |
				| ACCOUNTING | 2916.666667 |     4 |
				+------------+-------------+-------+
			
			
			
			
	union (可以将查询的结果集相加)
		select .....
			union 
		select ......
		
	
	limit (重点)在数据的分页显示在页面中非常常用!!!
		limit startIndex, length
		startIndex表示起始位置,从0开始,0表示第一条数据。
		length表示取几个
		
		案例:取工资前五的员工(降序排序取前五)
			select ename,sal from emp order by sal desc limit 0,5;				

				select		5
					...
				from			1
					...		
				where			2
					...	
				group by		3
					...
				having		4
					...
				order by		6
					...
				limit			7
					...;
						
			
						
			每页显示3条记录:
			第1页:0, 3
			第2页:3, 3
			第3页:6, 3
			第4页:9, 3
			第5页:12, 3
			
		每页显示pageSize条记录:
		第pageNo页:(pageNo - 1) * pageSize, pageSize			
						
	
	创建表
		建表语句的语法格式:
		create table 表名(
			字段名1 数据类型,
			字段名2 数据类型,
			字段名3 数据类型,
			....
		);
			
			
		关于MySQL当中字段的数据类型?以下只说常见的
			int		整数型(java中的int)
			bigint	长整型(java中的long)
			float		浮点型(java中的float double)
			char		定长字符串(String)
			varchar	可变长字符串(StringBuffer/StringBuilder)
			date		日期类型 (对应Java中的java.sql.Date类型)
			BLOB		二进制大对象(存储图片、视频等流媒体信息) Binary Large OBject (对应java中的Object)
			CLOB		字符大对象(存储较大文本,比如,可以存储4G的字符串。) Character Large OBject(对应java中的Object)
			......	
			
		7、insert语句插入数据
			语法格式:
				insert into 表名(字段名1,字段名2,字段名3,....) values(值1,值2,值3,....)
				要求:字段的数量和值的数量相同,并且数据类型要对应相同。	
				
			需要注意的地方:
				当一条insert语句执行成功之后,表格当中必然会多一行记录。
				即使多的这一行记录当中某些字段是NULL,后期也没有办法在执行
				insert语句插入数据了,只能使用update进行更新。	
					
			一次插入多条数据
				insert into t_table_name 
					(name,age,gex)
				values
					('melo',22,1),('king',20,1),('旺财',21,0),('cwlz',21,1),('zhaxi',21,1);
					
					
			
			表的复制:
				语法:
					将查询的结果当成新表返回!
					create table 表名 as select ....;
			
			将查询的结果插入到一张表中
			
			
			
			修改数据:
				语法格式:
					update 表名 set 字段名1=值1,字段名2=值2... where 条件;					
			
			删除数据:注意是删除表中的数据不是删除表!
				语法格式:
					delete from 表名 where 条件;
					注意:没有条件全部删除!!!!
					
				如何删除大表中的数据?(重点)
					truncate table 表名; 表被截断,不可回滚,永久丢失!!
					
			删除表:注意是删除表			
				drop table 表名; // 这个通用。
				drop table if exists 表名; // oracle不支持这种写法。
				
					

		行:被称为数据/记录(data)
		列:被称为字段(column)
		
		每个字段应该包括:字段名,数据类型,相关约束;
		
		
3、学习MySQL主要还是学习通用的SQL语句,那么SQL语句包括增删改查,SQL语句怎么分类呢?
	DQL(数据查询语言): 查询语句,凡是select语句都是DQL。(重难点)
	DML(数据操作语言):insert delete update,对表当中的数据进行增删改。
	DDL(数据定义语言):create drop alter,对表结构的增删改。
	TCL(事务控制语言):commit提交事务,rollback回滚事务。(TCL中的T是Transaction)--->(需要对事物的相关操作有深刻的理解)
	DCL(数据控制语言): grant授权、revoke撤销权限等。
	
	
4,导入数据

	1,登录数据库管理系统 以MySQL为例,mysql -uroot -proot (假设root的密码为root)
	2,查看有哪些数据库: show databases;(这个不是sql语句,是MySQL命令)
	3,创建我们自己的数据库:create database 数据库名;	(这个不是sql语句,是MySQL命令)
	4,使用创建好的数据库: use 数据库名;(这个不是sql语句,是MySQL命令)
	5,查看当前使用的数据库中有哪些表: show tables;(这个不是sql语句,是MySQL命令)
	6,初始化数据 : source 对应的sql文件(mysql> source F:\bjpowernode.sql)
		小提示:不会在没使用数据库的情况就引入吧?不会吧? 我有一次就是这样搞了(ERROR 1046 (3D000): No database selected)


5,删除数据库:drop database 数据库名;

6,查看表的结构: desc 表名; --->(这个命令在开发中比较常用 属性和字段要对应)
	mysql> desc dept;
	+--------+-------------+------+-----+---------+-------+
	| Field  | Type        | Null | Key | Default | Extra |
	+--------+-------------+------+-----+---------+-------+
	| DEPTNO | int         | NO   | PRI | NULL    |       |
	| DNAME  | varchar(14) | YES  |     | NULL    |       |
	| LOC    | varchar(13) | YES  |     | NULL    |       |
	+--------+-------------+------+-----+---------+-------+
	3 rows in set (0.03 sec)
	
7,查看表中的数据: select * from 表名;
	可以看到表中的全部数据!
	
8,一些常用的命令:
	a> 查看当前使用的数据库: select database();
		mysql> select database();
		+------------+
		| database() |
		+------------+
		| test_db    |
		+------------+
		1 row in set (0.00 sec)	
		在上面的实例中使用的数据库是test_db;
	b> 查看MySQL的版本号: select version();
	
	c> 	\c   命令,结束一条语句。
	
	d> 	exit 命令,退出MySQL。

9,简单的查询语句(DQL)
	1,语法格式:
		select 字段1,字段2,... from 表名;
		小提示: sql语句一 ’;’结尾。sql语句不区分大小写。
	2,字段是可以参与数学运算的:
		a> 查询员工的年薪的sql语句:(在下面的数据中的工资为原来的12倍,就是*12的结果)
			mysql> select ename,sal*12 from emp;
			+--------+----------+
			| ename  | sal*12   |
			+--------+----------+
			| SMITH  |  9600.00 |
			| ALLEN  | 19200.00 |
			| WARD   | 15000.00 |
			| JONES  | 35700.00 |
			| MARTIN | 15000.00 |
			| BLAKE  | 34200.00 |
			| CLARK  | 29400.00 |
			| SCOTT  | 36000.00 |
			| KING   | 60000.00 |
			| TURNER | 18000.00 |
			| ADAMS  | 13200.00 |
			| JAMES  | 11400.00 |
			| FORD   | 36000.00 |
			| MILLER | 15600.00 |
			+--------+----------+
			14 rows in set (0.00 sec)	
		b> 查询时给列起别名:
			select 字段1,字段2 as 别名 from 表名;(当别名中有用到中文注意别名用''包起来) as 是可以省略的
			mysql> select ename,sal*12 as '年薪' from emp;
				+--------+----------+
				| ename  | 年薪        |
				+--------+----------+
				| SMITH  |  9600.00 |
				| ALLEN  | 19200.00 |
				| WARD   | 15000.00 |
				| JONES  | 35700.00 |
			

10,条件查询
	语法格式 :select * from 表名 where 条件;
	
	条件语句:	
		> >= < <= 
		<> != (这两个都是不等于的意思)
		and 需要两个条件同时满足
		or 在多个条件中只需满足一条即可 
		between...and...是闭区间 [a~ b]
			易错:在使用上面的between..and.. 语句时只能时 小-->大,否则查询不到任何数据
			提示:between..and.. 还可以使用在字符串方面 左闭右开
			
		null--->is null,is not null (在数据库中null代表什么都没有不能等同于0,他不是一个值,所以判断是否为null不能用 =
				
	示例:and or 一起进行查询 ,在员工表中查询薪资大于1000并且部门编号是20或30的员工姓名
	select ENAME from emp where sal>1000 and (deptno = 20 or deptno = 30);  小提示:在这里的小括号是非常重要的!!
	如果没有小括号则成了工资大于1000并且部门编号为20,  或者部门编号30,对部门编号30的没了工资大于1000的条件,所以需要小括号
	小括号,不确定优先级时添加小括号不易出错,可读性更好!
		
		in 等同于 or
			示例:找出工作岗位是MANAGER和SALESMAN的员工?
			 1> select * from emp where job = 'MANAGER' or job = 'SALESMAN'; 注意不要落了单引号,否则(ERROR 1054 (42S22): Unknown column 'MANAGER' in 'where clause')
			 2> select * from emp where job in('MANAGER','SALESMAN'); 小提示:写的时候一定要以英文的标点符号,否则报错!!!
			 
		not in(a,b,c)  不在这些值中!
			查询工资不是3000,5000 的员工
			select ename,sal from emp where sal not in(3000,5000);	 
			  	+--------+---------+
				| ename  | sal     |
				+--------+---------+
				| SMITH  |  800.00 |
				| ALLEN  | 1600.00 |
				| WARD   | 1250.00 |
				| JONES  | 2975.00 |
				| MARTIN | 1250.00 |
				| BLAKE  | 2850.00 |
				| CLARK  | 2450.00 |
				| TURNER | 1500.00 |
				| ADAMS  | 1100.00 |
				| JAMES  |  950.00 |
				| MILLER | 1300.00 |
				+--------+---------+
				11 rows in set (0.00 sec)
				
11,模糊查询,这是在开发的实际需求中通常用到,最常见的形式是通过关键字的查询! 比如在一个水果库存系统中检索框的功能实现
通过在搜索框中输入水果名或相关的关键字,然后在水果名的字段和在描述中查询相关的结果然后返回!
	like
		在模糊查询中一定要牢记两个符号 % _
			% 代表任意多个字符
			_ 代表任意一个字符
				示例:查询名字中有字母w的:select ename from emp where ename like '%w%';	
				查询名字中第三个字母是N的员工:select ename from emp where ename like '__N%';						
				查询名字中有 _ 的员工名:select ename from emp where ename like '%_%';--->这是错误的会将所有的员工返回需要将_转义否则,MySQL会将它当成任意一个字符!
								select ename from emp where ename like '%\_%';
								
								
12,排序

	order by 字段名1  --> 以字段1升序排序
	示例:按照工资升序排序:select ename,sal from emp order by sal;(默认是升序排序)
								
		mysql> select ename,sal from emp order by sal;
		+--------+---------+
		| ename  | sal     |
		+--------+---------+
		| SMITH  |  800.00 |
		| JAMES  |  950.00 |
		| ADAMS  | 1100.00 |
		| WARD   | 1250.00 |
		| MARTIN | 1250.00 |
		| MILLER | 1300.00 |
		| TURNER | 1500.00 |
		| ALLEN  | 1600.00 |
		| CLARK  | 2450.00 |
		| BLAKE  | 2850.00 |
		| JONES  | 2975.00 |
		| SCOTT  | 3000.00 |
		| FORD   | 3000.00 |
		| KING   | 5000.00 |
		+--------+---------+
		14 rows in set (0.00 sec)						
	如何指定升序和降序:asc 升序,desc 降序;
	在上面的基础上小做改动就可以是降序排序, select ename,sal from emp order by sal desc;
								
	
		select 
			字段						3
		from
			表名						1
		where
			条件						2
		order by
			....						4
		
		order by是最后执行的。
13,分组函数
	count 计数
	sum 求和
	avg 平均值
	max 最大值
	min 最小值
	
	分组函数也叫做多行处理函数,特点:输入多行输出只有一行!
	易错点:分组函数会自动忽略null
	
	示例:找出工资高于平均工资的员工?
		1. select avg(sal) from emp;
			+-------------+
			| avg(sal)    |
			+-------------+
			| 2073.214286 |
			+-------------+
			1 row in set (0.00 sec)	
		2. select ename,sal from emp where sal>2073.214286;	
			+-------+---------+
			| ename | sal     |
			+-------+---------+
			| JONES | 2975.00 |
			| BLAKE | 2850.00 |
			| CLARK | 2450.00 |
			| SCOTT | 3000.00 |
			| KING  | 5000.00 |
			| FORD  | 3000.00 |
			+-------+---------+
	可能在这个示例的解决的过程中你可能会使用这个sql语句,select ename,sal from emp where sal>avg(sal);		
		报错:ERROR 1111 (HY000): Invalid use of group function	 (分组函数的使用无效)

			各个模块的执行顺序,这个需要很好地弄清!然后我们就可以知道为什么不能上面那样写,因为分组是在where之后执行的
 				select		5
					..			
				from			1
					..
				where			2
					..
				group by		3
					..
				having		4
					..
				order by		6
					..


	小细节:count 的使用,count(*),count(字段)区别:
		count(*) 是统计总记录条数,count(字段)统计的是在具体的字段中不为null的记录条数
		
	小提示:分组函数也可以组合着使用:
		select count(*),sum(sal),avg(sal),max(sal),min(sal) from emp;
			+----------+----------+-------------+----------+----------+
			| count(*) | sum(sal) | avg(sal)    | max(sal) | min(sal) |
			+----------+----------+-------------+----------+----------+
			|       14 | 29025.00 | 2073.214286 |  5000.00 |   800.00 |
			+----------+----------+-------------+----------+----------+


14,单行处理函数
	特点:输入一行,输出一行
	
	ifnull(a,b)  --> ifnull()就是属于单行处理函数,
		示例:计算每个员工的年薪:select ename,(sal+comm)*12 '年薪' from emp;
				+--------+----------+
				| ename  | 年薪     |
				+--------+----------+
				| SMITH  |     NULL |
				| ALLEN  | 22800.00 |
				| WARD   | 21000.00 |
				| JONES  |     NULL |
				| MARTIN | 31800.00 |
				| BLAKE  |     NULL |
				| CLARK  |     NULL |
				| SCOTT  |     NULL |
				| KING   |     NULL |
				| TURNER | 18000.00 |
				| ADAMS  |     NULL |
				| JAMES  |     NULL |
				| FORD   |     NULL |
				| MILLER |     NULL |
				+--------+----------+
			从上面的数据不难看出有很多是null?? 这是因为MySQL中任何与null运算的数结果都为null,因为上面的有些员工的comm值是null所以
			需要使用 ifnull(可能为null的数据,当成什么处理)
			select ename,(sal+ifnull(comm,0))*12 '年薪' from emp; --> 这里就是如果comm为null则当成0处理!			




15,group by 和 having 
	group by : 按照某个字段或者某些字段进行分组。
	having : having是对分组之后的数据进行再次过滤。
	
	案例:找出每个工作岗位的最高薪资。
		我们分析题意,不难发现 "每个工作岗位" 所以以工作进行分组,select ename,max(sal),job from emp group by job; 
			+-------+----------+-----------+
			| ename | max(sal) | job       |
			+-------+----------+-----------+
			| SMITH |  1300.00 | CLERK     |
			| ALLEN |  1600.00 | SALESMAN  |
			| JONES |  2975.00 | MANAGER   |
			| SCOTT |  3000.00 | ANALYST   |
			| KING  |  5000.00 | PRESIDENT |
			+-------+----------+-----------+
		雷区:上面的查询在MySQL中有结果,结果是无意义的,在Oracle中报语法错误,Oracle相比MySQL语法更加严谨,为什么会报错!!--> 当一条sql语句中有group by 时select 后面只能跟分组函数和参与分组的字段。
		mysql> select * from emp;
			+-------+--------+-----------+------+------------+---------+---------+--------+
			| 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 |
			+-------+--------+-----------+------+------------+---------+---------+--------+
			对比上面的结果 CLERK 对应的最高薪资1300显然是不对应SMITH,应该是MILLER,所以说我们查的表没意义!!!
			
			select max(sal),job from emp group by job;
			+----------+-----------+
			| max(sal) | job       |
			+----------+-----------+
			|  1300.00 | CLERK     |
			|  1600.00 | SALESMAN  |
			|  2975.00 | MANAGER   |
			|  3000.00 | ANALYST   |
			|  5000.00 | PRESIDENT |
			+----------+-----------+
	分组函数一般都会和group by 联合使用,这也是他们为什么会称为分组函数的原因。
	任何一个分组函数都是执行group by结束,才会执行,如果sql语句中没有group by则整张表的数据自成一组。
	
	多个字段联合分组:
		案例:查询每个部门不同工作岗位的最高薪资,"每个部门" "不同工作岗位" ---> 以工作和部门进行分组!
			select deptno,job,max(sal) from emp group by deptno,job;
		
		案例:找出每个部门的最高薪资,要求显示薪资大于2900的数据。
			select max(sal),deptno from emp where sal>2900 group by deptno;  -->效率更高
			select max(sal),deptno from emp group by deptno having max(sal)>2900; --> 效率较低
			
		案例:找出每个部门的平均薪资,要求显示薪资大于2000的数据。
			分析: "每个部门" "平均" "要求"
			select avg(sal),deptno from emp group by deptno having avg(sal)>2000;	
			按照之前的套路,你可能会想到where 比 having 更加高效,所以你可能会试下面的语法:
				select avg(sal),deptno from where avg(sal)>2000 emp group by deptno;//有语法的错误
				注意,易错,重要:where 后不能直接跟分组函数!!!!!!!
				
16,总结一个完整的DQL语句怎么写?

	select		5
		..
	from			1	
		..
	where			2
		..
	group by		3
		..
	having		4
		..
	order by		6	
		..		
		
		
		

***********************************************************************************************************
*************************************第二部分回顾*********************************************************
1,查询结果的去重
	distinct:  select distinct job from emp;		
		
	注意点:distinct 要出现在所有字段的最前面,错误的写法select ename,distinct job from emp;
		应该: select distinct deptno,job from emp;
		
	案例:统计岗位的数量
		select count(distinct job) from emp; 
		



2,连接查询***重点***
	2.1实际的开发中通常都是从多张表联合查询,比如学生表和班级表等需要联合查询!
	
	2.2连接查询:
		根据表的连接方式有:内连接,外连接,全连接;
			内连接:
				等值连接
				非等值连接
				自连接
			外连接:
				左外连接
				右外连接
			全连接:
				(用的不多,很少)
			
		在表的连接时有一种现象称为笛卡尔积现象。当对两张表进行查询时没有任何条件的限制,结果是两张表的乘积,这种现象称为
		笛卡尔积乘积现象。
		
		关于表的别名:
			执行效率高(??)
			可读性高
	
			
		避免笛卡尔乘积的方法:家条件进行过滤
			查询员工对应的部门名:select ename,dname from emp,dept where emp.deptno=dept.deptno;			
				上面的语法为旧语法,SQL92,以后不用。

	2.3内连接之等值连接:最大特点是:条件是等量关系。
		案例:查询每个员工的部门名称,要求显示员工名和部门名。
			语法:
				...
					A
				inner join(inner 可以省略,但是带着inner有更好的可读性)
					B
				on
					连接条件
				where
					...
			mysql> select e.ename as '员工' , d.dname as '部门' from emp e inner join dept d on e.deptno=d.deptno;

			
		内连接之非等值连接:	
			案例:找出每个员工的工资等级,要求显示员工名、工资、工资等级。	
			mysql> select e.ename '员工',e.sal '薪资',s.grade '等级' from emp e join salgrade s on e.sal between s.losal and s.hisal order by s.grade;
			+--------+---------+------+
			| 员工     | 薪资    | 等级   |
			+--------+---------+------+
			| SMITH  |  800.00 |    1 |
			| ADAMS  | 1100.00 |    1 |
			| JAMES  |  950.00 |    1 |
			| WARD   | 1250.00 |    2 |
			| MARTIN | 1250.00 |    2 |
			| MILLER | 1300.00 |    2 |
			| ALLEN  | 1600.00 |    3 |
			| TURNER | 1500.00 |    3 |
			| JONES  | 2975.00 |    4 |
			| BLAKE  | 2850.00 |    4 |
			| CLARK  | 2450.00 |    4 |
			| SCOTT  | 3000.00 |    4 |
			| FORD   | 3000.00 |    4 |
			| KING   | 5000.00 |    5 |
			+--------+---------+------+
		
		自连接:
			特点:一张表当做两张表处理,自己连接自己
			案例:找出每个员工的上级领导,要求显示员工名和对应的领导名。
			select e.ename '员工',l.ename '领导' from emp e join emp l on e.mgr=l.empno;
		 	mysql> select e.ename '员工',l.ename '领导' from emp e join emp l on e.mgr=l.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 |
			+--------+-------+
			
			注意:) 其实仔细考虑上面的查询是不满足需求的,因为就算没有上级领导的员工也应该显示出来!! 解决:---> 外连接
			
		外连接:	
			什么是外连接,和内连接有什么区别?
			
				内连接:
					假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,这就是内连接。
					AB两张表没有主副之分,两张表是平等的。
			
				外连接:
					假设A和B表进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要查询主表中
					的数据,捎带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。
				
				外连接的分类?
					左外连接(左连接):表示左边的这张表是主表。
					右外连接(右连接):表示右边的这张表是主表。
			
					左连接有右连接的写法,右连接也会有对应的左连接的写法。
						
			对上面的内连接的案例员工与领导的查询可以使用外连接更加符合条件:
			 	左外连接:select e.ename '员工',l.ename '领导' from emp e left join emp l on e.mgr=l.empno;
				右外连接:select e.ename '员工',l.ename '领导' from emp e rigth join emp l on e.empno=l.mgr;
	
	
	三张表怎么连接查询:
		案例:找出每一个员工的部门名称以及工资等级。
		 	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; 
					....
						a
					join 
						b
					on 
						a和b连接的条件
					join 
						c
					on
						a和b连接后的表与c连接的条件
						
		案例:找出每一个员工的部门名称、工资等级、以及上级领导。
			mysql> select e.ename,d.dname,s.grade,l.ename from emp e left join emp l on e.mgr = l.empno join salgrade s on e.sal between s.losal and s.hisal join dept d on e.deptno = d.deptno;
				+--------+------------+-------+-------+
				| ename  | dname      | grade | ename |
				+--------+------------+-------+-------+
				| SMITH  | RESEARCH   |     1 | FORD  |
				| ALLEN  | SALES      |     3 | BLAKE |
				| WARD   | SALES      |     2 | BLAKE |
				| JONES  | RESEARCH   |     4 | KING  |
				| MARTIN | SALES      |     2 | BLAKE |
				| BLAKE  | SALES      |     4 | KING  |
				| CLARK  | ACCOUNTING |     4 | KING  |
				| SCOTT  | RESEARCH   |     4 | JONES |
				| KING   | ACCOUNTING |     5 | NULL  |
				| TURNER | SALES      |     3 | BLAKE |
				| ADAMS  | RESEARCH   |     1 | SCOTT |
				| JAMES  | SALES      |     1 | BLAKE |
				| FORD   | RESEARCH   |     4 | JONES |
				| MILLER | ACCOUNTING |     2 | CLARK |
				+--------+------------+-------+-------+
				
				
	子查询:
		什么是子查询?子查询都可以出现在哪里?
			select语句当中嵌套select语句,被嵌套的select语句是子查询。	
			
			子查询可以出现在哪里?
		select
			..(select).
		from
			..(select).
		where
			..(select).
			
		
		where子句中使用子查询
			案例:找出薪资高于平均薪资的员工;
				select ename,sal from emp where sal>(select avg(sal) from emp);
			
			
		from后面嵌套子查询
			案例:找出每个部门平均薪水的等级。	
				select e.job,s.grade from salgrade s join (select e.job,avg(e.sal) asal from emp group by job) t on t.asal between s.losal and hisal; t. 	
		
			select d.dname,avg(sal) from dept d join emp e on d.deptno = e.deptno group by d.dname;
			+------------+-------------+
			| dname      | avg(sal)    |
			+------------+-------------+
			| RESEARCH   | 2175.000000 |
			| SALES      | 1566.666667 |
			| ACCOUNTING | 2916.666667 |
			+------------+-------------+
			select
			 	t.dname,t.asal,s.grade 
			 from
			 	 salgrade s
			 join
			 	 (select d.dname,avg(sal) asal from dept d join emp e on d.deptno = e.deptno group by d.dname) t
			 on 
			 	t.asal between s.losal and s.hisal;
			 	
			 	+------------+-------------+-------+
				| dname      | asal        | grade |
				+------------+-------------+-------+
				| RESEARCH   | 2175.000000 |     4 |
				| SALES      | 1566.666667 |     3 |
				| ACCOUNTING | 2916.666667 |     4 |
				+------------+-------------+-------+
			
			
			
			
	union (可以将查询的结果集相加)
		select .....
			union 
		select ......
		
	
	limit (重点)在数据的分页显示在页面中非常常用!!!
		limit startIndex, length
		startIndex表示起始位置,从0开始,0表示第一条数据。
		length表示取几个
		
		案例:取工资前五的员工(降序排序取前五)
			select ename,sal from emp order by sal desc limit 0,5;				

				select		5
					...
				from			1
					...		
				where			2
					...	
				group by		3
					...
				having		4
					...
				order by		6
					...
				limit			7
					...;
						
			
						
			每页显示3条记录:
			第1页:0, 3
			第2页:3, 3
			第3页:6, 3
			第4页:9, 3
			第5页:12, 3
			
		每页显示pageSize条记录:
		第pageNo页:(pageNo - 1) * pageSize, pageSize			
						
	
	创建表
		建表语句的语法格式:
		create table 表名(
			字段名1 数据类型,
			字段名2 数据类型,
			字段名3 数据类型,
			....
		);
			
			
		关于MySQL当中字段的数据类型?以下只说常见的
			int		整数型(java中的int)
			bigint	长整型(java中的long)
			float		浮点型(java中的float double)
			char		定长字符串(String)
			varchar	可变长字符串(StringBuffer/StringBuilder)
			date		日期类型 (对应Java中的java.sql.Date类型)
			BLOB		二进制大对象(存储图片、视频等流媒体信息) Binary Large OBject (对应java中的Object)
			CLOB		字符大对象(存储较大文本,比如,可以存储4G的字符串。) Character Large OBject(对应java中的Object)
			......	
			
		7、insert语句插入数据
			语法格式:
				insert into 表名(字段名1,字段名2,字段名3,....) values(值1,值2,值3,....)
				要求:字段的数量和值的数量相同,并且数据类型要对应相同。	
				
			需要注意的地方:
				当一条insert语句执行成功之后,表格当中必然会多一行记录。
				即使多的这一行记录当中某些字段是NULL,后期也没有办法在执行
				insert语句插入数据了,只能使用update进行更新。	
					
			一次插入多条数据
				insert into t_table_name 
					(name,age,gex)
				values
					('melo',22,1),('king',20,1),('旺财',21,0),('cwlz',21,1),('zhaxi',21,1);
					
					
			
			表的复制:
				语法:
					将查询的结果当成新表返回!
					create table 表名 as select ....;
			
			将查询的结果插入到一张表中
			
			
			
			修改数据:
				语法格式:
					update 表名 set 字段名1=值1,字段名2=值2... where 条件;					
			
			删除数据:注意是删除表中的数据不是删除表!
				语法格式:
					delete from 表名 where 条件;
					注意:没有条件全部删除!!!!
					
				如何删除大表中的数据?(重点)
					truncate table 表名; 表被截断,不可回滚,永久丢失!!
					
			删除表:注意是删除表			
				drop table 表名; // 这个通用。
				drop table if exists 表名; // oracle不支持这种写法。
posted @ 2022-04-25 21:15  kobedu  阅读(53)  评论(1)    收藏  举报