mysql基础语法

# 命令行登录
mysql -uroot -proot

# 基本
show tables
show databases
use DATABASENAME

# 创建表
create table TABLENAME (
	id int primary key auto_increment,
	name varchar(10) unique key,
	age tinyint unsigned
)engin innodb charset utf8

# 删除表
drop table TABLENAME

# 创建数据库
create database DATABASENAME charset utf8

# 删除数据库
drop database DATABASENAME

# 数据类型
整数型: tinyint int(m) mediumint bigint
	m是用于指定0填充长度,只有当列具备zerofill属性时才有用。
	
浮点型:double、float、decimal(m,d) 
	decimal(m,d)
		m是整数位数,最大65,默认10
		d是小数位数,最大30,默认0,小数位数必须小于等于整数位数
		
文本型: char(m) varchar(m) text set(val,val2,...) enum(val,val2,....)
	char和varchar的区别:
		1、char的检索速度比较快。
		2、char如果存储文本的后面有空格,取出来时并没有空格。
		
	文本数据量大于255是建议使用text,因为后面text的检索速度比char和varchar都快。
	
	set和enum:
		1、set是多选,插入数据时不需要跟着顺序。
			底层:有值就取1,没有就取0,然后二进制倒转来写然后取十进制数结果插入。
			insert into TABLE values (null,"篮球,足球,羽毛",18,"张三")
		2、enum是单选,
			insert into TABLE values ("篮球") # 基于value的形式插入
			insert into TABLE values (1) # 基于index的形式插入
			
日期时间: date time year timestamp
	timestamp的作用:会自动记录update此行的时间。
	
二进制: blob 

# 修改表名
rename table TABLE to NEW_TABLENAME

# 复制表(不包含数据,只是复制并创建一个相同结构的表)
create table TABLE like TABLENAME

# 蠕虫复制
insert into TABLE select * from TABLE

# 基本查询
select COLUMN from TABLE,.....

# 去重
select distinct COLUMN from TABLE

# 定义语句结束符合
delimiter [符号]

# 增加数据
insert into TABLE [(COLUMN1,COLUMN2...)] values (VAL1,VAL2,......)

# 代替插入
replace into TABLE [(COLUMN1,COLUMN2...)] values (VAL1,VAL2,......)

# 删除数据
delete from TABLE [where <CAUSE>] [limit N]

# 修改数据
update TABLE set COLUMN=VAL where CAUSE

# 新增列
alter table TABLE add [column] CLOUMNNAME COLUMN_TYPE COLUMNATTRIBUTE [first|after COLUMNNAME]

# 删除列
alter table TABLE drop COLUMNAME

# 修改列的属性
alter table TABLE modify CLOUMNNAME COLUMN_TYPE COLUMNATTRIBUTE [first|after COLUMNNAME]

# 修改列的属性和名字
alter table TABLE change COLUMNNAME NEW_COLUMN_NAME COLUMN_TYPE COLUMNATTRIBUTE [first|after COLUMNNAME]

# 主键primary key,主键属于索引的一种。
	主键具备的特性:
		1、一张表只能有一个主键
		2、主键插入的值不能为空,且唯一(有主键相当于具备NOT NULL属性)
		
	添加主键:
		1、创建表时添加
		2、alter table TABLE add primary key (COLUMNNAME)
		
	删除主键:
		alter table TABLE drop primary key
		
# 自增长auto_increment属性
	1、自增长只能添加在主键上
	2、自增长相关的初始化变量: show variables like "%auto_increment%"

# 唯一键unique key ,唯一键属于索引的一种。
	唯一键具备的特性:
		1、一个表可以有多个唯一键
		2、唯一键插入的值可以为NULL,但是必须唯一。

# 外键 foreign key,外键并不是索引的一种
	添加外键的要求:
		1、外键只有innodb才有,myisam并不支持
		1、外键只能在索引列上添加
		2、列的数据类型要确保一致
		3、小心一些设置了not null但是约束规则确实set null时会添加失败
		
	# 添加外键:
		alter table TABLE add foreign key(COLUMN) references TABLE.COLUMN [on update {district,cascade,set null}] [on delete {district,cascade,set null}]
		
	# 删除外键:
		alter table TABLE drop foreign key COLUMN
	
# where语句
	比较运算符:
		等于: =
		不等于: “ ! = ”或者 “ <>”
        > 
        >=
        <
        <= 
		between xxx and xxx
		not between xxx and xxx
		in(val,val2,...)
		not in(val,val2,...)
		
	逻辑运算符:
		and &&
		or ||
		not !
	
	模糊匹配:like、not like
		通配符号:
            % 多个字符
            _ 一个字符
            [] 区间内
            [^] 区间外
     
     is null 和 is not null
     	判断是否为空和是否为非空
     
     正则匹配:rlike
     	. 一个字符
     	* 前面的字符出现0或者多次
     	+ 前面的字符出现1或者多次
     	? 前面的字符出现0或者1次
     	[] 区间内
     		[:upper:] [:lower:] [:alpha:] [:alnum:] [:digit:] [:punct:] [:space:]
     	[^] 区间外
     	< 词首
     	> 词尾
     	<单词> 精确匹配某个单词
     	{n} 前面字符刚好出现n次
     	{n,} 前面字符至少出现n次
     	{n,m} 前面字符至少出现n到m次
     	^ 行首
     	$ 行尾
     	
# group by 语句
	根据字段进行排序
	
	语法:
	select * from TABLE where CAUSE group by COLUMN,COLUMN2,.... [desc|asc]
	
	聚合函数:
		sum()
		avg()
		min()
		max()
		count()
			count(*) count(1) count(COLUMN) 的区别:
				count(*) 和 count(1) 如果数据中出现NULL数据照样会统计进来
				而count(COLUMN) 则不会。
				
# having 语句:
	having本质上和where一样时用于筛选符合条件的数据
	having主要用于筛选经过group by语句分组后的数据,having只能跟着group by 出现,不能单独使用。
	
	select * from TABLE where CAUSE group by COLUMN,.... having CAUSE
	
	having中可以直接使用聚合函数,但是where中是不能的,另外having可以直接使用as别名,where也不行
		原因在于:where是将数据从磁盘拿到内存,别名as是数据进入到内存之后的操作。
				where语句之后的都是内存操作。

# order by语句:
	用于排序
	
	select * from TABLE where CAUSE group by COLUMN having CAUSE order by COLUMN [desc|asc],....
	
# limit 和 offset
	
	limit用于指定返回结果集的行数,多用于分页查询。
	offset则是用于指定偏移值,指定从第几行开始。
	
	语法一:limit和offset分开写
		select * from TABLE limit N offset M
	语法二:limit集成offset功能
		select * from TABLE limit M,N

	
# 多表查询:
select from TABLE,TABLE

# 联合查询
select from TABLE union select from TABLE
	如果使用到group by 要使用括号包裹并使用limit来设置得到的结果集数
	(select * from TABLE ) union (select * from TABLE group by CLOUMN limit N)

# 交叉查询
select from TABLE cross join table 

# 连接查询

	## 内连接
	select * from TABLE inner join on CAUSE
	
	## 外连接:
	  ### 左外:select * from TABLE left join table on CAUSE
	  ### 右外:select * from TABLE right join table on CAUSE
	
	
# 子查询:
	## 按功能分:
		## 标量子查询,子查询返沪一行一列数据
			select * from table where Column=(子查询)
		## 行子查询。子查询返回一行多列
			select * from table where COLUMN in (子查询)
		## 列子查询,子查询返回一列多行,需要构建行元素
			select * from table where (COLUMN)=(子查询)
	## 按位置分:
		from子查询
			select * from (子查询)
		where子查询
	
    ## 特殊查询
		exists子查询,先查询主查询,然后根据子查询的条件来显示最终结果
			select * from table where exists (子查询)
# 视图View
	视图本质上就是一个虚拟的二维表,只有在运行时才会取查询数据并返回结果集。
	
	任何可以在select语句上使用的,都可以在view上使用。
	
	视图的作用:
		1、增加了安全性。
			比如:某张表的有些列的数据不能随意查看,可以先创建视图,然后设置视图的权限,最后将不能随意查看的表设置权限。
		2、减少查询的复杂冗余。
			比如:有一个很复杂的查询语句,每次都要输入太麻烦了,就可以创建成视图,下次直接运行“select * from 视图名”即可。
			
	语法:
		create view VIEWNAME as select 语句

# 备份与恢复
mysqldump -uroot -proot DATABASE.TABLES > xxx.sql
mysql -uroot -proot DATABASE < xxx.sql

# 创建用户
create user 用户名@主机地址 [identified by PASSWORD]
	主机地址可以使用“” 表示任意,即:create user swq@"" identified by 123456

# 权限赋予与撤回
grant all privileges on 数据库.表 to 用户名@主机地址 [identified by PASSWORD]
revoke all privileges from 数据库.表 to 用户名@主机地址


# 事务
    ACID特性:
        原子性、一致性、隔离性、持久性

    并发事务产生可能产生的问题:
        脏读,一个事务读取到另外一个事务还未提交的数据
        不可重复读,一个事务读取到另外一个事务修改的数据
        虚读(幻读),  一个事务读取到另外一个事务新增的数据

    解决方案:
        读未提交,性能最好,但是什么问题都解决不了,用我就一定出问题
        读已提交,可以解决脏读的问题,oracle数据默认级别。
        可重复读,可以解决脏读和不可重复读问题,mysql默认隔离级别。
        串行化(序列化),所以问题都可以解决,但是性能最差。
	

		start transaction # 启动事务
		commit # 提交事务
		savepoint POINTNAME # 保存回滚点
		roolback to [pointname] # 回滚上一个点或者回滚到指定点

# 变量
	·系统变量,两个@@
		1、全局系统变量,在新启动的所有终端中有效。
			
			#设置全局系统变量:
			set @@global.变量名=值
			set global 变量名=值
			
			# 查看全局系统变量:
			select @@global.变量名

		2、局部系统变量,仅仅在当前的终端中有效。
			# 设置局部系统变量:
			set @@[session|local].变量名=值
		
	·用户变量,一个@
		set @变量名=值
	
	·局部变量,定义在语句块BEGIN END之间。
		declare 变量名 变量类型 变量属性 [default value] [=value]
		
	·select语句中保存值到变量中
	select 变量:=column from TABLE # 此种方法具备返回性
	select column from TABLE into 变量 # 此种返回不具备返回性
	
		
# 判断流程结构if\if elseif
	if 表达式 then
	
	else
		
	end if;
	
# while 
while 表达式 do
	
end while;

# 函数的定义和使用function
	
函数必须要在BEING END 之间返回,函数体中不能出现带有返回性的语句出现,不然会报错

create function 函数名([参数名 参数类型 参数属性,...]) returns 返回值类型
BEGIN
	return 返回值
END

使用函数:
	select 函数名(参数)

查看函数:
	show function 函数名
	show function status
	
查看函数的创建语句:
	show create function 函数名
	
# 存储过程 procedure

	存储过程和函数的不同点:
		1、存储过程不需要返回,因此BEGIN...END语句内可以使用具备返回性质的查询语句。
	
create procedure 存储过程名({IN|OUT|INOUT} 参数名 参数类型 参数属性,...) 
BEGIN
...
END

	IN:传参只读,就算结构体中修改了传参的值,也不会影响外面实际的值。
	OUT: 传递过来的参数首先会被置空,结构体中修改了传参的值会影响外面实际的值。
	INOUT:传递的参数不会被置空,结构体中修改了传参的值会影响外面实际的值。
	
	
查看存储过程:
	show procedure status [like PATTERN]

查看创建存储过程的语句:
	show creat procedure 存储过程名
	
使用存储过程:
	call 存储过程名([参数])

删除存储过程:
	drop  procedure 存储过程名
	

# 触发器trigger

	根据给定的条件进而自动运行某个sql语句.
	触发器是一种特殊的存储过程。但是触发器在BEGIN...END语句内不能使用带有返回性的select等语句。
	
创建触发器:
create trigger 触发器名 {before|after} {insert|update|delete} on 数据库.表 for each row
BEGIN
...
END

触发器内部可以使用new和old关键词,用于代表insert、update、delete前后的字段数据
	insert是只有new
	update有new和old
	delete只有old
	

# 索引index

	合理的使用索引可以提高查询的速度。
	索引能提高查询速度,但是会降低修改等动作的速度,因为在修改数据的同时还要保存索引,而且所有也需要占用一定的磁盘空间。
	
	where语句中经常出现的列可以适度增加索引
	散列性太低的列不适合使用索引,比如性别。
	不要在大量NULL的列中添加索引。

	mysql中有什么索引:
		1、主键
			alter table TABLE add primary key(COLUMNNAME)
			复合主键:
				alter table TABLE add primary key(COLUMNNAME,...)
				
			删除主键:
				alter table TABLE drop primary key
			
		2、唯一键
			alter table TABLE add unique key(COLUMNNAME)
			复合唯一键:
				alter table TABLE add unique key(COLUMNNAME,...)
				
			删除唯一键:
				alter table TABLE drop index COLUMNNAME
			
		3、普通索引
			alter table TABLE add index(COLUMNNAME)
			复合索引: 
				alter table TABLE add index(age,address,phonenumber)
					相当于构建了三个索引
					age
					age,address,
					age,address,phonenumber
					
			删除普通索引:
				alter table TABLE drop index COLUMNNAME
			
		4、全文索引(myisam)
			用得不是很多, 只能在varchar和text数据类型的列上创建。
			alter table TABLE add fulltext(COLUMNNAME)
			
		5、最左索引,设置lenght的长度小于实际列的长度,可以加快检索速度。
			alter table TABLE add index column(length)
				

posted @ 2021-03-13 15:10  蕝戀  阅读(88)  评论(0编辑  收藏  举报