Mysql 总结

一、理解几个概念

sql、DB、DBMS分别是什么?

DB:DataBase:(数据库,数据库实际上在硬盘上以文件的形式存在)

DBMS: DataBase Management System(数据库管理系统,常见的有:MySQL Oracle DB2 Sybase SqlServer...)

SQL: 结构化查询语言,是一门标准通用的语言。标准的sql适合于所有的数据库产品。SQL语句在执行的时候,实际上内部也会先进行编译,然后再执行sql。(sql语句的编译由DBMS完成。)

DBMS负责执行sql语句,通过执行sql语句来操作DB当中的数据。

二、sql语句的分类

主要分为五大类:

DQL(数据查询语言,Data Query Language): 查询语句,凡是select语句都是DQL。
DML(数据操作语言,Data Manipulation Language):insert delete update,对表当中的数据进行增删改。
DDL(数据定义语言,Data Definition Language):create drop alter,对表结构的增删改。
TCL(事务控制语言,Transaction Control Language):commit提交事务,rollback回滚事务。
DCL(数据控制语言,Data Control Language): grant授权、revoke撤销权限等。

三、常用命令

注意:此处的命令属于mysql(数据库管理系统)的语法范畴

删除数据库:drop database 数据库名;
查看表结构:desc 表名;
查看当前使用的是哪个数据库:select database(); 
查看mysql的版本号:select version(); 
结束一条命令语句:\c 命令 或者 “;” 分号
查看创建表的语句:show create table 表名;
退出mysql:exit 命令

四、常用的sql语句

注意	:1、任何一条sql语句以“;”结尾。
	  2、sql语句不区分大小写。

查询语句(DQL)

1.select 字段名1,字段名2,字段名3,.... from 表名;
   2.查询所有字段:select * from 表名;(实际开发中不建议使用*,效率较低)
   3. 给查询结果的列重命名(as是关键字,也可省略):select 字段1,字段2 as 自定义名字 from 表名; 
注:(别名中有中文的话,用单引号括起来,双引号mysql可以用,但是其他DBMS不可以,为了可移植性)
   4. 条件查询:select 字段,字段... from 表名 where 条件; (执行顺序:先from,然后where,最后select)
   5.排序:select (字段) from 表名order by 表中的列名 (+asc升序 desc降序);(数字和英文都可排序,默认是升序)

分组函数(多行处理函数):

注意:所有的分组函数都是对“某一组”数据进行操作的
多行处理函数的特点:输入多行,最终输出的结果是1行,自动忽略NULL			
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值


count(*)和count(具体的某个字段),他们有什么区别?
	count(*):不是统计某个字段中数据的个数,而是统计总记录条数。(和某个字段无关)
	count(字段1): 表示统计(字段1)字段中不为NULL的数据总数量。

重点:所有数据库都是这样规定的,只要有NULL参与的运算结果一定是NULL。

ifnull() 空处理函数:

ifnull(可能为NULL的数据,被当做什么处理) : 属于单行处理函数。
例:select name,ifnull(id,0) from user;
此条select语句中的ifnull中的0代表,如果某行数据的id为null,就赋值0

group by 和 having:

group by : 按照某个字段或者某些字段进行分组。
	having : having是对分组之后的数据进行再次过滤
注意:·分组函数一般都会和group by联合使用,这也是为什么它被称为分组函数的原因。
	 ·并且任何一个分组函数(count sum avg max min)都是在group by语句执行结束之后才会执行的。
     ·当一条sql语句没有group by的话,整张表的数据会自成一组。
     ·记住一个规则:当一条语句中有group by的话,select后面只能跟分组函数和参与分组的字段。

一个完整的DQL语句怎么写?

关键字         执行顺序
select		    5
	..
from			1	
	..
where			2
	..
group by		3
	..
having		    4
	..
order by		6

去重distinct :

distinct只能出现在所有字段的最前面例如:
mysql> select distinct job from emp; // distinct关键字去除重复记录。

五、

增删改查有一个术语:CRUD操作
Create(增) Retrieve(检索) Update(修改) Delete(删除)

连接查询的分类(需要用到关键字join…on…):

注意:
	....
		A
	join
		B
	join
		C
	on
		...
表示:A表和B表先进行表连接,连接之后A表继续和C表进行连接。


根据表的连接方式来划分,包括:
	内连接:(两张表是平等的)
		·等值连接
		·非等值连接
		·自连接
	外连接:(表之间有主副之分,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。外连接最重要的特点是:主表的数据无条件的全部查询出来)
		·左外连接(左连接):表示左边的这张表是主表
		·右外连接(右连接):表示右边的这张表是主表。
	全连接(很少用!)
注意:左连接有右连接的写法,右连接也会有对应的左连接的写法

笛卡尔积现象:

·当两张表进行连接查询的时候,没有任何条件进行限制,最终的查询结果条数是两张表记录条数的乘积。
·怎么避免笛卡尔积现象?当然是加条件进行过滤。

表的别名有什么好处?

·第一:执行效率高。
·第二:可读性好。

子查询:

·select语句当中嵌套select语句,被嵌套的select语句是子查询。
·from后面也可跟select语句,将此select语句查出的结果当做临时表
·例如:select * from 表名1 where 字段1 > (select avg(字段1) from 表名1);

union :

可以将查询结果集相加
同行相加或同列相加,看select语句的结果
加在同列需要字段数量相同

limit(分页查询关键字):

分页查询全靠它了
·limit是mysql特有的,其他数据库中没有,不通用。(Oracle中有一个相同的机制,叫做rownum)
·limit的作用是取结果集中的部分数据
·limit startIndex, length :
	startIndex表示起始位置,从0开始,0表示第一条数据。
	length表示取几个
·limit是sql语句最后执行的一个环节:
		select	     	5
			...
		from			1
			...		
		where			2
			...	
		group by		3
			...
		having		    4
			...
		order by		6
			...
		limit			7
			...;

表的复制:

语法:
		create table 表名 as select语句;
		将查询结果当做表创建出来。

创建表:

建表语句的语法格式:
		create table 表名(
			字段名1 数据类型 (约束),
			字段名2 数据类型(约束),
			字段名3 数据类型(约束),
			....
		);

insert语句插入数据

语法格式:
	·insert into 表名(字段名1,字段名2,字段名3,....) values(值1,值2,值3,....)
	·要求:字段的数量和值的数量相同,并且数据类型要对应相同。
	·字段可以省略不写(只写一个表名),但是后面的value对数量和顺序都有要求。
	·一次插入多条语句的时候,只要将插入的数据用括号括起来然后用逗号间隔即可
	·查询语句的查询结果也可以当做数据直接插入到表中
	
·需要注意的地方:
		··当一条insert语句执行成功之后,表格当中必然会多一行记录。
		··即使多的这一行记录当中某些字段是NULL,后期也没有办法再执行此条插入语句
		i··nsert语句插入数据了,只能使用update进行更新。

删除数据?

·语法格式:delete from 表名 where 条件;
·注意:没有条件全部删除。
·删除大表中的数据(重点):truncate table 表名; // 表被截断,不可回滚。永久丢失。
·删除表:drop table 表名; // 这个通用。
	    drop table if exists 表名; // oracle不支持这种写法。

修改数据:update

语法格式:
	update 表名 set 字段名1=值1,字段名2=值2... where 条件;
	注意:没有条件整张表数据全部更新

什么是约束?常见的约束有哪些呢?

在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的合法性、有效性、完整性。
常见的约束有哪些:
	·非空约束(not null):约束的字段不能为NULL
	·唯一约束(unique):约束的字段不能重复
	·主键约束(primary key):约束的字段既不能为NULL,也不能重复(简称PK)
	·外键约束(foreign key):...(简称FK)
	·检查约束(check):注意Oracle数据库有check约束,但是mysql没有,目前mysql不支持该约束。