MySQL基础命令总结

1.命令提示符下MySQL的启动和关闭

net start mysql
net stop mysql

2.登录和退出

mysql -u root -p
exit

3.注释

-- (注意这里有空格) + 内容
# + 内容 (MySQL特有)

4.DDL(Data Defination Language)数据定义语言

1.操作数据库

(1)Create 创建
	普通创建数据库:create database + 数据库名称;
	先查后创建:create database if not exists + 数据库名称;
	创建数据库并指定字符集:
	create database + 数据库名称 character set + 字符集
	
(2)Retrieve查询
	查询所有数据库名称:show databases;
	查询某个数据库的字符集:show create database + 数据库名称;
	
(3)Update修改
	修改数据库的字符集:alter database + 数据库名称 character set 字符名称;
	
(4)Drop删除
	删除数据库:drop database + 数据库名称;
	判断数据库是否存在再删除:drop database if exists + 数据库名称;
	
(5)使用数据库
	查询当前正在使用的数据库名称:select database();
	使用数据库:use + 数据库名称;

2.操作表

(1)Create 创建
		create table + 表名( 
		列名1  数据类型1,
		列名2  数据类型2,
		...
		列名n  数据类型 n,
		);
		数据类型:
		data:日期 yyyy-mm-dd
		datatime:yyyy-mm--dd HH:mm:ss
		timestamp:时间错类型     自动赋值系统时间
		varchar(n)
		double(5,2)五位两个小数位

	复制表:create talbe + 表名 like + 要复制的表名

(2)Retrieve查询
	查询某个数据库中所有表的名称:show tables;
	查询表的结构:desc + 表名;

(3)Update修改
	修改表名:alter table + 表名 rename to 新的表名;
	修改表的字符集:alter table + 表名 character set + 字符集名称;
	添加一列:alter table + 表名 add + 列名 数据类型;
	修改列名称:alter table + 表名 change 列名 新列名 新数据类型;
			alter table + 表名 modify 列名 新数据类型;
	删除列:alter table + 表名 drop + 列名;

(4)Drop删除
	删除表: drop table + 表名;
	查看表存不存在删除:drop table if exists + 表名;

5.DML增删改表中的数据

1.添加数据
insert into 表名(列名1,列名2,...列名n)  values(值1,值2,...值n);
2.删除数据
	delete from 表名 where + 条件;不加条件就会删除整个表 效率很低
	truncate table 表名;先删除表然后创建一个一模一样的空表

3.修改数据
	update 表名 set 列名 = 值1,列名2 = 值2,...列名n = 值n where + 条件;
4.查询表中的数据
	select * from + 表名;

6.DQL查询表中的记录

1.普通字段查找
	select 
		列名1,
		列名2
	from
		表名;
2.去除重复的结果集
	select distinct 列名 from 表名;
3.计算两列之和
		select 列名1,列名2,列名1+列名2 from 表名;
	如果列中的数据有NULL则如下写:将null值转换为0
		select 列名1,列名2,列名1+ifnull(列名2,0)  from 表名;
	给上述列名起一个别名:其他的列也可以起别名 且as可以省略
		select 列名1,列名2,列名1+ifnull(列名2,0) as 新的列名 from 表名;
4.条件查询
	select 
		列名1,
		列名2
	from
		表名
	where
		条件; 
		条件中判断一个值是不是null需要用is语句 不能用=,不是就用is not
5. 模糊查询
	占位符:_ : 单个任意字符
			%:多个任意字符
	select 列名1,列名2	from 表名 where 列名 like ‘条件’;
6.排序查询
	select * from 表名 order by 列名 + 排序方式;不加排序方式就默认升序
	ASC升序    desc降序
	可以后面跟第二种排序方式,但是线排序前面一个,条件一样跟上第二个排序
7.聚合函数(所有的聚合函数的计算会排除null值)
	将一列数据作为一个整体  进行纵向的计算
	1.count计算个数
		select count(列名) from 表名;
		为了解决null的问题
		select count(ifnull(列名,0)) from 表名;
	2.max计算最大值
		select max(列名) from 表名;
	3.min计算最小值
		select min(列名) from 表名;
	4.sum计算和
		select sum(列名) from 表名;
	5.avg计算平均值
		select avg(列名) from 表名;
8.分组查询
	select + 分组后的字段或者聚合函数  from 表名 group by 列名;
	分组之前的条件添加
	select + 分组后的字段或者聚合函数  from 表名 where + 条件 group by 列名;
	分组之后的条件添加
	select + 分组后的字段或者聚合函数  from 表名 where + 条件 group by 列名 having + 
	条件;
	where后不能跟聚合函数的判断,having之后可以跟聚合函数的判断
9.分页查询 (各个数据的操作不相同)
	 select * from 表名 limit 开始位-1,一页多少数;

7.约束

1.主键约束 primary key 非空且唯一  一张表只能有一个字段为主键
	创建表时,添加主键约束:
	id int primary key
	删除主键:
	alter table 表名 drop primary key
	创建完表后添加主键
	alter table 表名 modify id int primary key;
	
	自动增长:  自动增长的时候数据只和上一级有关
	创建表时天剑自动增长:
	id int primary key auto_increment
	删除自动增长:
	alter table 表名 modify id int;
	创建完成表后添加自动增长:
	alter table 表名 modify id int auto_increment;

2.非空约束not null
	创建表时给表中的列属性添加属性 如:
	name varchar(20) not null
	删除 非空约束:
	alter table  表名 modify name varchar(20);
	创建表结束后添加约束:
	alter table  表名 modify name varchar(20) not null;
	
3.唯一约束unique   唯一值可以是null
	name varchar(20) unique
	删除唯一约束:
	alter table  表名 drop index 列名;
	创建表后添加唯一约束:
	alter table  表名 modify name varchar(20) unique;
	
4.外键约束foreign key    注意添加外键约束的过程中表的创建顺序要注意
	创建表时添加外键:外键列关联另一个表的主键列
	外键列  int,
	constraint 自己定义的外键名称 foreign key (外键列) references 表2名称(表2主键列);
	删除外键:
	alter table 表名 drop foreign key 外键名;
	创建表之后添加外键:
	alter table 表名 add constraint 自己定义的外键名称 foreign key (外键列) references 表2名称(表2主键列);

	级联:
	添加级联的操作:
	 alter table 表名 add constraint 自己定义的外键名称 foreign key (外键列) references 表2名称(表2主键列) on update cascade;  -- 级联更新
	 alter table 表名 add constraint 自己定义的外键名称 foreign key (外键列) references 表2名称(表2主键列) on delete cascade;--级联删除   弊端有些大

8.数据库设计

多对一:
在多的一方建立外键,指向一的一方的主键。
多对多:
需要建立中间表,中间表最少包含两个字段,这两个字段作为第三章表的外键指向两张表的主键。
一对一:一般不会用  直接用一张表就解决了
一对一关系的实现,可以在任意一方添加唯一外键指向另一方的主键。

9.范式

第一范式 1NF :每一列都是不可分割的原子数据项
第二范式 2NF: 在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
	函数依赖:A--->B如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A
		
第三范式 3NF: 在2NF基础上,任何非指数型不依赖于其他非主属性(在2NF基础上消除传递依赖)

10.数据库的备份和还原

备份:mysqldump -u 用户名 -p 密码 数据库名称 > 保存的路径
还原:
	1.登录数据库2.创建数据库3.使用数据库4.source 文件路径

11.多表查询

1.隐式内连接
select 
	* 
from 
	表1,
	表2 
where 
	表1.'外键名' =  表2.‘主键名’;
2.显示内连接:
select * from 表1 inner join 表2 on  表1.'外键名' =  表2.‘主键名’;-- inner可以省略
3.左外连接查询:
查询的是左表所有数据以及其交集部分。
select 字段列表 from 表1 left outer join 表2 on 条件;

3.右外连接查询:
查询的是右表所有数据以及其交集部分。
select 字段列表 from 表1  right outer join 表2 on 条件;

4.子查询
子查询地结果是单行单列的
	select之中嵌套另一个select
	select * from 表12 where 表1.'属性' = (select max(列名) from 表1);
	上面从等号开始和之后的条件视情况更改
多行单列
	子查询作为条件,使用运算符in来判断 
	select id from dept where name = '财务部' or name = '市场部';
	select * from emp where dept_id in (select id from dept where name = '财务部' or name = '市场部');
多行多列
	子查询可以作为一个虚拟表
	查询员工入职日期是2011-11-11之后的员工信息和部门信息
	子查询
	select * from dept t1,(select * from emp where emp.'join_date' > '2011-11-11') t2 where t1.id = t2.dept_id;

12.事务

1.事务的基本概念
	1.概念 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
	2.操作
		1.开启事务:start transaction;手动提交不会立即更改数据 必须要提交事务后才会生效
		2.回滚:rollback;回到事务开启时的状态
		3.提交:commit;
		4.MySQL数据库中事务默认自动提交 Oracle默认是手动提交
			修改事务的默认提交方式
			查看事务的默认提交方式:select @@autocommit;
			修改默认提交方式:set @@autocommit = 0;
	3.事务的四大特征
		1.原子性:是不可分割的最小操作单位,要么同时成功要么同时失败
		2.持久性:当事务提交或者回滚后,数据库会持久化地保存数据
		3.隔离性:多个事物之间相互独立
		4.一致性:事务操作前后数据的总量不变
	4.事务的隔离级别(了解)
		多个事务之间是隔离的相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
		存在的问题:
			1.脏读:一个事务,读取到另一个事务中没有提交的数据
			2.不可重复度(虚读):在同一个事务中,两次读到的数据不一样
			3.幻读:一个事务操作(DML)数据表中所有记录,另一个数据添加了一条数据,则第一个事务查询不到自己的修改
		隔离级别:(级别从小到大但是效率越来越低)
			1.read uncommitted:读未提交
				产生的问题:脏读、不可重复读、幻读
			2.read committed:读已提交(Oracle默认)
				产生的问题:不可重复度、幻读
			3.repeatable read:可重复读(MySQL默认)
				产生的问题:幻读
			4.serializable:串行化
				可以解决所有问题

		数据库查询隔离级别:
			select @@tx_isolation;
		数据库设置隔离级别:
			set global transaction isolation level 级别字符串;

13.DCL管理用户授权

1.管理用户
	1.查询用户
		找到存放用户的表
		select * from 表;
	2.创建用户
		create user ‘用户名’@‘主机名’ identified by '密码';
	3.删除用户
		drop user  ‘用户名’@‘主机名’;
	4.修改密码
	update user set password = password('新密码') where user = '用户名';

	set password for '用户名'@‘主机名’ = password('新密码');
	mysql中忘记root用户的密码
		1.管理员身份启动cmd 输入 net stop mysql
		2.使用无验证方式启动mysql服务:mysqld --skip-grant-tables
			此后打开一个新的cmd窗口然后输入mysql可以无验证登录数据库
			update user set password = password('新密码') where user = '用户名';
			然后任务管理器手动关闭mysqld服务
			然后在新的cmd窗口中登录mysql数据库
			
2.权限管理
	1.查询权限:
		show grants for '用户名'@'主机名';
	2.授予权限:
		grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
	3.撤销权限
		revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';