mysql数据库常用sql的分类整理

*******************************************************************************************************************************
*MySQL      	
					1.中型的关系型数据库管理系统(RDBMS,Relational Database Management System)
					2.使用的 SQL (结构化查询语言,Structured Query Language)语言是用于访问数据库的最常用标准化语言

*SQL功能概括分组:
					1.DML(Data Manipulation Language,数据操作语言)--------用于检索或修改数据
					2.DDL(Data Definition Language,数据定义语言)---------用于定义数据的结构,创建、修改或者删除数据库对象
					3.DCL(Data Control Language,数据控制语言)---------用于定义数据库用户的权限

*使用CMD操作MySQL
					1.mysql -h Mysql主机地址 -u 用户名 -p                               =======   (进入MySQL环境)

					2.show databases;                                                            =======   (显示数据库)

					3.use 数据库名称;                                                            =======   (进入数据库)

					4.create database 数据库名称 default character set 'utf8';      =======   (创建数据库(SQL))
										
					5.show tables;                                                                  =======   (查看数据库中的所有表)
										
					6.show create database 数据库名称;                                   =======   (查看数据库创建语句)
										
					7.desc 表名称;  (或者describe 表名);                                   =======   (查看表结构)

					8.show create table 表名称;                                               =======   (查看表创建语句)
*******************************************************************************************************************************
*常用的SQL语句
					1.创建表

							create table 表名称(
								字段名1  数据类型   [primary key  auto_increment],
								字段名2  数据类型   [not null], 
								...
								字段名n  数据类型   [约束] 
							);

					注意:
							数值型数据类型: 
								integer (int) 
								float(有效位数,小数位数)
								double(有效位数,小数位数)
								decimal(有效位数,小数位数)

							字符串数据类型:	
								varchar(n)   
								char(n)

					2.删除表
							drop table 表名称;

					3.插入数据行(记录)
							insert into 表名称(字段名1,字段名2,...)values(值1,值2,...);
							insert into 表名称 values(值1,值2,...);

							一条SQL插入多条记录:

							insert into 表名称(字段名1,字段名2,...)values(值1,值2,...),(值1,值2,...)...;
							insert into 表名称 values(值1,值2,...),(值1,值2,...)...;

					4.修改数据行(记录)
							update 表名称 set 字段名1=值1 [where 条件] [order by 字段名 [desc]] [limit 修改行数];

					5.删除数据行(记录)
							delete from 表名称 [where 条件] [order by 字段名 [desc]] [limit 删除行数];

					6.如果要删除表中所有数据,除了使用delete from 表名称,还可使用
							truncate table 表名称;   ======》更高效,因为它不返回删除的影响行数。

					7.查询数据
							select 字段名1,字段名2... from 表名称 [where 条件];

							给查询的结果字段起一个别名:
							select 字段名1 as 别名1,字段名2 as 别名2... from 表名称 [where 条件];
*******************************************************************************************************************************
*修改数据表的SQL

					1.给数据表添加一列(字段)
							alter table 表名称 add column 列名称 数据类型 [约束];

					2.修改数据表中的一列(字段)的数据类型或约束
							alter table 表名称 modify column 列名称 数据类型 [约束];

					3.修改数据表中的列名(字段名)
							alter table 表名称 change column 旧列名称 新列名称 数据类型 [约束];

					4.删除数据表中的列(字段)
							alter table 表名称 drop column 列名称;
*******************************************************************************************************************************
*******************************************************************************************************************************
*******************************************************************************************************************************
*简单查询
					1.not、or、and
							如果and与or共同出现在where条件中,则and的优先级高。
								eg:查询remark不为null的记录
									select * from student where remark is not null;

					2.模糊查询(like)
							通配符:% 任意个数的任意字符
								eg:将姓名中含有'东'字的学生信息查出来
									select * from student where name like '%东%';

							_ 代表一个字符
								eg: 将姓名中第二个字为'京'的人查询出来
									select * from student where name like '_京%';

					3.对查询结果排序
							order by 字段名1[desc],字段名2[desc]...;

					4.限制数量的查询
							limit 查询数量;
							limit 查询记录的初始偏移量(从0开始计算偏移量),查询数量;

							eg:
								查询student表中的前三条记录
									select * from student limit 3;
								查询第2到第4条记录
									select * from student limit 1,3;
								查询前三名的学生信息;
									select * from student order by score desc limit 3;
*********************************************************************************************************************************
*分组查询
					1.聚合函数
							 max(字段) 		返回某字段的最大值 	eg: select max(price) from product;
							 min(字段) 			返回某字段的最小值 	eg: select min(price) from product;
							 sum(字段) 		返回某字段的和
							 avg(字段) 		返回某字段的平均值
							 count(*)  			返回记录数
							 count(字段名)	返回不为null的某个字段的记录数

					2.分组查询
							 group by 字段名1,字段名2 [having 条件]

							 注意:在分组查询时,select后面的字段名必须与group by后面的分组字段一致,当然,
										select后也可跟聚合函数(用来计算分组后每组的信息)。
										如果分组字段与查询字段不一致,则查询结果无意义。
							 eg:
									按照种类分组,并计算每组的平均价格:
										select kind,avg(price) from product group by kind;

									只查询水果组的平均价格。
										select kind,avg(price) from product group by kind having kind='水果';
*********************************************************************************************************************************
*子查询(内层查询)
					子查询中的关键字
					1.any(some)
							any是在关系运算符后出现的,表示只要符合子查询结果中的任何一个数据。

					2.all
							all是在关系运算符后出现的,表示符合子查询结果中的所有数据。

					3.exists
							如果子查询的结果中至少存在一行记录,则返回true.
							not exists 如果子查询的结果中不存在记录,则返回true.

					4.in
							如果外层查询的字段包含于子查询的结果列表中,则返回该外层查询的记录。
							not in 
*********************************************************************************************************************************
*连接查询
					1.等值连接
							select 列1,列2... from 表1,表2 where 连接条件;

					2.外连接
							左外连接(left join): 左表中的记录全部查询出,右表只查询出符合连接条件的记录。
								select 列1,列2... from 左表 left join 右表 on 连接条件;
							eg:
								select student.name,school.school_name from student left join school 
									on student.school_id=school.id;

							右外连接(right join):右表中的记录全部查询出,左表只查询出符合连接条件的记录。
									select 列1,列2... from 左表 right join 右表 on 连接条件;

					3.内连接
							select 列1,列2... from 表1 inner join 表2 on 连接条件; 
*********************************************************************************************************************************
*外键(Foreign Key)约束
					主要用来设置“一对多”的两张表的关联关系。
					外键在子表中设置,用来与父表关联。
					create table emp(
					   id  int primary key auto_increment,
					   emp_name  varchar(10) not null,
					   dept_id int not null,
					   constraint fk_emp foreign key(dept_id) references dept(id)
					);
					alter table emp drop foreign key fk_emp;   // 删除外键
    *********************************************************************************************************************************
    /*
     eg:
     create table school(
		sid int primary key auto_increment,
		sname varchar(20) not null
     );
     insert into school(sname) values('辰战'),('辰南');

     create table teacher(
		tid int primary key auto_increment,
		tname varchar(20) not null,
		school_id int not null,
		constraint fk_teacher foreign key(school_id) references school(sid)
     );

     insert into teacher(tname,school_id) values('痞子龙',1);
     insert into teacher(tname,school_id) values('大德大威',2);
     create table subject(
		sid int primary  key auto_increment,
		sname varchar(20) not null,
		teacher_id int not null,
		constraint fk_subject foreign key(teacher_id) references teacher(tid)
     );
     insert into subject(sname,teacher_id) values('梦舞',2);   
     insert into subject(sname,teacher_id) values('独孤',1);
*/
*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
*事务(transaction)
				事务规定了一组操作,这一组操作作为一个整体,要么全部成功,要么全部失败。

				事务的特性(ACID):
				1.原子性(Atomic)
						事务作为一个整体而存在,事务内的操作不可再分割,
						要么全部成功,要么全部失败。

				2.一致性(Consistent)
						事务操作成功之前与之后,数据状态要保持一致。

				3.隔离性(Isolation)
						一个事务只能查看其他事务操作之前的状态或之后的状态,
						不能查看其正在操作的状态。

				4.持久性(Duration)
						一旦事务操作成功,则对数据系统的影响是持久性的。
*********************************************************************************************************************************
*事务的隔离级别
				几个前提概念:

				*脏读(dirty read):一个事务读取到了另一个事务未提交的数据的现象。
				*不可重复读:一个事务两次读取的数据不一致的现象。
				*幻读:一个事务两次读取的数据记录数(数据条目的数量)不一致的现象。

				隔离级别:
				1.读未提交级别(read uncommitted):
						一个事务读取到了其他事务还未提交状态的数据。
						可能发生脏读、不可重复读、幻读。

				2.读提交级别(read committed):
						一个事务只能读取其他事务已经提交之后状态的数据。
						可能会发生不可重复读,幻读。

				3.可重复读级别(repeatable read,MySQL默认的隔离级别)
						在当前事务中可以重复读取到相同的数据。
						可能会发生幻读(注意:Innodb数据库存储引擎已经解决了幻读问题)。

				4.串行化隔离级别(serializable)
						事务的操作(主要是指写操作)是串行化的。

				*在CMD中操作事务:
						start transaction;    // 开启事务
						select @@tx_isolation;  // 查看当前事务隔离级别
						// 设置当前会话的事务隔离级别
						set session transaction isolation level read uncommitted || read committed || repeatable read || serializable;
						rollback;  // 回滚事务(相当于撤销操作)
						savepoint 保存点名称;  // 设置保存点
						rollback to 保存点名称;  // 回滚到保存点的状态
						commit;  // 提交事务
*********************************************************************************************************************************
*JDBC批处理、处理事务操作
				JDBC批处理
				方式一:使用PreparedStatement来进行批处理操作
						void addBatch()   // 将一组参数添加到此PreparedStatement对象的批处理命令中
						int[] executeBatch()  // 执行批处理命令

				方式二:使用Statement来进行批处理操作
						如何获取Statement对象?
						Statement stmt=connection.createStatement();
						int count=stmt.executeUpdate(String sql);  // 执行静态的增删改SQL语句
						ResultSet rs=stmt.executeQuery(String sql);  // 执行静态的查询SQL

						Statement对象用来处理批处理的方法:
						addBatch(String sql)  // 将给定的SQL命令添加到此Statement对象的当前命令列表中
						int[] executeBatch()  // 执行批处理命令
*********************************************************************************************************************************
*JDBC处理事务:
				Connection对象的方法:
				1. setAutoCommit(boolean autoCommit) // 设置自动提交状态
					conn.setAutoCommit(false);  // 取消自动提交模式

				2. void commit()  // 提交事务
				3. void rollback()  // 回滚整个事务
				4. Savepoint setSavepoint()  // 设置保存点
				5. void rollback(Savepoint savepoint)  // 回滚到保存点
***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
*合并查询结果
				select 字段名1,字段名2... from 表名称 [where 条件]
				union [all]
				select 字段名1,字段名2... from 表名称 [where 条件];
				
				注意一:union all是合并所有查询结果,如果查询结果有重复记录,则不会去重。
					 union如果查询结果有重复记录,会自动去重。

				注意二:合并查询的多个SQL中的查询字段数量必须一致,各个SQL的字段需要对应
					  起来(各字段对应的意义必须一样,否则查询结果无意义)。查询的结果集中
					  的字段名以第一个SQL为准。
*********************************************************************************************************************************
*SQL注入
				SQL注入即SQL的拼接,将前台传入的参数,经后台拼接成SQL后执行一些非法操作。
				如何防止SQL注入?
				前台验证、后台验证输入的内容是否有敏感SQL关键字、对输入密码进行加密。
*********************************************************************************************************************************
*MySQL的备份与还原
				1.备份数据库
						mysqldump --no-defaults -u 用户名 -p --databases 要备份的数据库 > 备份路径

				2.还原数据库
						mysql -u 用户名 -p < 当时的备份文件路径

				3.备份数据表
						mysqldump --no-defaults -u 用户名 -p 数据库 要备份的表 > 备份路径

				4.还原数据表
						mysql -u 用户名 -p 还原表所属的数据库 < 备份路径
*********************************************************************************************************************************
*用户与权限(DCL)
				1.创建用户
						create user '用户名'@'主机IP' identified by '密码';
						注意:如果要让该用户在每台机器上都能登录,则主机IP为'%'。
			   
				2.授予用户权限
						grant update|insert|alter... on 数据库名.数据表名 to '用户名'@'主机IP';

						eg:授予某用户可以使用所有权限操作所有数据库中的表。
							grant all on *.* to  '用户名'@'主机IP';

				3.收回用户权限
						revoke 权限 on 数据库名.数据表名 from '用户名'@'主机IP'; 

				4.删除用户
						delete from user where user='用户名';
*********************************************************************************************************************************
*索引(index)
				分析查询语句:explain select * from 表 [where ...];
				索引主要用来提高检索(select)效率。

				创建普通索引的语法:
						create index 索引名称 on 表名称(字段名列表);
						注意:创建索引字段时,应该选择那些查询条件经常会使用到的字段。
				
				查看索引:
						show index from 表名称 \G;

				删除索引:
						drop index 索引名称 on 表名称;

				以下情况不会使用到索引:
						1.模糊查询时,%出现在第一个匹配位置时索引不会被用到。
						2.当使用多个字段共同创建索引时,只有第一个字段被使用时会用到索引,其它
							字段不会使用到索引。

						补充:唯一索引(也叫唯一约束)unique
						create table stu(
							id int primary key auto_increment,
							name varchar(10) unique,
							score double unique
						);

						主键约束与唯一约束的共同点与不同点:
							共同点:值不能重复。
							不同点:主键值不能为null,且每个表最多只能有一个主键。
						   唯一约束的列值可以为null,且每个表可以有多个唯一索引(约束)。
*********************************************************************************************************************************
*视图(view)
				视图是一个查询结果集。方便多次使用该结果集。可以将视图作为一张逻辑表。
				create view 视图名称
				as
				(select查询语句);

				 
				举例:
				create view emp_view 
				as
				(
				  select  emp.e_name, emp.e_job,dept.d_name  from employee as emp 
				  inner join dept on emp.dept_no=dept.d_no
				);
*********************************************************************************************************************************
*存储过程(Storage Procedure)

				delimiter //
				create procedure 存储过程名(参数类型 参数名称 参数数据类型)
				begin
				   存储过程体
				end //


				参数类型: 
					in(输入参数类型,默认参数类型)  
					out(输出参数类型) 
					inout(输入输出参数类型)

				 eg: in(输入参数类型,默认参数类型) 

					 delimiter //
					 create procedure proc_select(stuid int)
					 begin
						select id as 学号,name as 姓名,age as 年龄,score as 成绩,remark as 备注
						from student where id=stuid;
					 end  // 

				eg: out(输出参数类型) 

					delimiter //
					create procedure proc_out(out count int)
					begin
					  select count(*) into count from student;
					end  // 

					call proc_out(@x) //
					select @x //

				eg:inout(输入输出参数类型)

				   delimiter //
					 create procedure proc_inout(inout info varchar(20))
					 begin
						select remark into info from student where name=info;
					 end  //

					set @y='熊大' //
					call proc_inout(@y) //
					select @y //

			   eg: if...then...end if结构

				delimiter //
				create procedure proc_update(in a int)
				begin
				   if (a is not null) then
					 update student set remark='你的武功已经很高了!' where score>=95;
				   end if;
				end  // 

			   
				delimiter //
				create procedure proc_case(in stuid int)
				begin
					  declare vscore double;
					  declare vremark varchar(20);
					  declare info varchar(20);
					  select score,remark into vscore,vremark from student where id=stuid;
					  case vscore
						  when 60 then
							 set info='刚好及格';
						  when 95 then
							 set info='我考了95分!';
						  else
							 set info='不知道,没查出来';   
					  end case;
			   select info;
			   end  // 
*********************************************************************************************************************************
*MySQL系统函数
				时间数据类型: date (2017-02-23)
							   time (16:40:35)
							   datetime (2017-02-23 16:40:35)
							   timestamp 

				日期时间函数:
				 1.返回当前日期时间 now()或者sysdate()

				 2.增加时间函数:
						adddate('date类型或datetime类型',interval 要增加的时间 year|month|day|hour|minute|second);
						eg:六天以后的时间
							select adddate(now(),interval 6 day);

				 3.减去时间函数:
						subdate('date类型或datetime类型',interval 要减去的时间 year|month|day|hour|minute|second);
						eg:六天以前的时间
							select subdate(now(),interval 6 day);

				 4.时间间隔函数:
						datediff('第一个时间date或datetime类型','第二个时间date或datetime类型');
							注意:使用第一个时间减去第二个时间的日期部分。

*******************************************************************************************************************************     
				其他函数:
				  select md5('要进行MD5加密的字符串');
				  select database(); 查看当前所在的数据库
				  select session_user(); 查看当前用户
***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
*MySQL中的触发器(trigger)
				delimiter //

				create trigger 触发器名称 before|after  触发事件(insert|delete|update)
				on 触发器关联的表名称 for each row
				begin
				   触发器执行的逻辑代码
				end  

				delimiter ;

				触发器案例:
				delimiter //

				create trigger stu_trigger after insert
				on student for each row
				begin
					 insert into log(logname,logtime)values(new.name,now());
				end //

				delimiter ;
*********************************************************************************************************************************
*MySQL的优化
				查询优化的方法:

				1.优化查询SQL语句。如果连接查询和子查询都可以查询到结果,则优先选择连接查询。
				         因为子查询时会创建临时表,临时表的内容是存储子查询结果的,查询完毕后,还要撤销临时表。

				2.在频繁使用的列上创建索引(index)。

				3.拆表。如果一个表中的字段很多,应该将不经常使用的字段存储于另一张表中,原表
						只保留常用查询字段。

				4.增加冗余字段。将需要经常使用到的信息以冗余字段的方式添加到表中,省去了连接查询的耗时。eg:如果经常要查询员工姓名与其对应的部门名称,则
						可将部门名称作为员工表emp的一个冗余字段,省去了emp表与dept表
						的连接查询。
				5.增加中间表。建立一个中间表,将多张表的查询字段存放于此中间表中。
***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************


 
 

你可能感兴趣的:(索引,视图,存储过程,触发器,系统函数,常用的SQL语句,简单查询,分组查询,子查询,连接查询,外键(Foreign,Key)约束,事务(transaction),MySQL的备份与还原,用户与权限)