MySQL的一些基本语法
一:MySQL的一些执行顺序
- FROM table1 left join table2 on 将table1和table2中的数据产生笛卡尔积,生成Temp1
- JOIN table2 所以先是确定表,再确定关联条件
- .ON table1.column = table2.columu 确定表的绑定条件 由Temp1产生中间表Temp2
- WHERE 对中间表Temp2产生的结果进行过滤 产生中间表Temp3
- GROUP BY 对中间表Temp3进行分组,产生中间表Temp4
- HAVING 对分组后的记录进行聚合 产生中间表Temp5
- SELECT 对中间表Temp5进行列筛选,产生中间表 Temp6
- .DISTINCT 对中间表 Temp6进行去重,产生中间表 Temp7
- ORDER BY 对Temp7中的数据进行排序,产生中间表Temp8
- LIMIT 对中间表Temp8进行分页,产生中间表Temp9
二:mysql索引失效场景 - 避免使用 select * 全表扫描会失效
- 模糊查询时 like “%刘” 导致全表扫描 百分号在前会失效 “刘%” (不一定会失效)
- 使用函数在索引列上或在条件上进行运算 where id-1=10 / where DATE(create_time) between “” and “”
- not in exist 都会导致索引失效
- B-TREE索引 is null 不会走 is not null 会走
- 复合索引 (time,name,age)第一种情况 time没有命中 name,age不会走索引(复合索引采用的是最左匹配原则)第二种情况 time命中索引但name没有命中 age还是不会走索引
- 使用 !=或<> 都会导致全表扫描 失效
- mysql在使用字符串时不加单引号 ‘’ 会失效 (因为mysql会在底层对其进行隐式的类型转换)where name=‘2000’; where name=2000;
三:on和where的区别 - 在针对left join、right join 、union时,on和where产生的结果集是不同的, on是在连接时产生临时表的条件,假如 a left join b on a.id=b.id 此时on 返回的数据是满足a.id=b.id并且左表的数据都在的临时表temp1的数据;
- .inner join 返回的数据是相同的;
四: inner join和from(自连接)查询的区别
内连接是取左右两张表的交集形成一个新表。FROM并列两表后仍然还是两张表。如果还要对新表进行操作则要用内连接。从效率上看应该FROM并列查询比较快,因为不用形成新表。
五:where和having的区别 - .第一种执行顺序上的区别 where 在分组之前 而having 在分组之后
- 第二种 having可以使用聚合函数(max min count() avg)而 where 语句不可以
六:常用函数使用方法
- IFNULL(列,0) 如果列等于空 返回0 相反 返回本身;
- IF(expr,v1,v2) 如果表达式 expr 成立,返回结果 v1;否则,返回结果 v2。
- CONCAT(a1,a2,a3…n) 字符串 a1,a2,a3 等多个字符串合并为一个字符串;
- . DATE(日期) 将时间转换成"yyyy-MM-dd";
七:.mysql变量的使用
1,变量的类型
MySQL中的存储过程类似java中的方法。既然如此,在存储过程中也同样可以使用变量。
mysql中的变量可以分为以下几个类型:局部变量,用户变量,会话变量,全局变量。
2,变量的定义及使用
1,局部变量
MySQL中的局部变量与java中的局部变量非常类似,java中的局部变量作用域是变量所在的方法,而MySQL中的局部变量作用域是所在的存储过程。
以下是局部变量的定义及赋值方式:声明用到了关键字
BEGIN
#Routine body goes here…
#变量的定义
declare var2 int(4);
#变量的赋值方式一:直接赋值
set var2 = 2;
#变量的赋值方式二:将查询结果赋值给变量
select u_id into var2 from users where u_name = 'zhangsan';
END
2,用户变量
用户变量类似于java中的成员变量,java中的成员变量使用对象访问,例如:user.getName();访问User类中的name成员变量,在不做修改的前提下,无论调用多少次该方法返回值都是一样的,成员变量的作用域是所在类。MySQL中的用户变量的作用域是当前连接,声明、赋值和查询都是用@符号。
BEGIN
#Routine body goes here…
#变量的赋值方式一:直接赋值,方式有以下两种。
set @var1 = 2;
set @var2 := 3;
#变量的赋值方式二:将查询结果赋值给变量
select u_id into @var3 from users where u_name = 'zhangsan';
END
3,会话变量
服务器为每个连接的客户端维护一系列会话变量。其作用域仅限于当前连接,即每个连接中的会话变量是独立的。以下是对于会话变量的相关操作:
复制代码
#显示所有的会话变量
show session variables;
#查询会话变量的值,方式有以下三种。
show variables like ‘%auto_increment_increment%’; #查询变量值的通用方式
select @@auto_increment_increment; #使用@@方式查询
select @@session.auto_increment_increment; #使用@@session.的方式,类似于java中对象名.变量名
select @@local.auto_increment_increment; #使用@@local.的方式,类似于java中对象名.变量名
#设置会话变量的值,方式有以下三种。
set auto_increment_increment=1; #直接设置
set session auto_increment_increment=1; #使用session关键字,设置选定的范围
set @@session.auto_increment_increment=1; #使用@@session.的方式,类似于java中对象名.变量名
set @@local.auto_increment_increment=1; #使用@@local.的方式,类似于java中对象名.变量名
4,全局变量
当服务启动时,它将所有全局变量初始化为默认值。其作用域为server的整个生命周期。
#显示所有的全局变量
show global variables;
#查询全局变量的值的两种方式
show variables like ‘%sql_warnings%’; #查询变量值的通用方式
select @@global.sql_warnings; #使用@@global.的方式,类似于java中对象名.变量名
#设置全局变量的值的两种方式
set sql_warnings=FALSE; #直接设置
set global sql_warnings=FALSE; #使用global关键字,设置选定的范围,最好加上global
set @@global.sql_warnings=OFF; #使用@@global.的方式,类似于java中对象名.变量名
3,小的注意事项
declare声明变量必须在存储过程的最开始,否则就会出错。