还在为不会怎么写mysql语句而苦恼吗? mysql的高级语句,通俗易懂,mysql高级语句的用法(三)
一.mysql高级语句分类
1.1 连接查询
简介:MySQL 的连接查询,通常都是将来自两个或多个表的行结合起来,基于这些表之间的共同字段,进行数据的拼接。
先在player数据库中,添加两张表,为a_player和b_player表,并给它们添加数据。
1.2 内连接
含义:MySQL 中的内连接就是两张或多张表中同时符合某种条件的数据记录的组合。通常在FROM 子句中使用关键字 INNER JOIN 来连接多张表,
并使用 ON 子句设置连接条件
如图所示:
语法格式:
SELECT column_name(s)FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
语句:select a_id,a_name,a_level from a_player inner join b_player on a_id=b_id;
注意一下:内连接是系统默认的表连接,所以在 FROM 子句后可以省略 INNER 关键字,只使用关键字 JOIN。同时有多个表时,也可以连续使用 INNER JOIN 来实现多表的内连接,不过为了更好的性能,建议最好不要超过三个表。
分析:上述操作是将 a_player 表的每一行与 b_player 表的每一行进行比较,以检查它们是否都满足条件。当满足条件时,INNER JOIN 将返回由 a_player 表和 b_player 表中的列组成的新行。如果没有匹配项,查询将返回一个空的结果集。INNER JOIN 结果集中的行必须出现在两个表 a_player 和 b_player 中,是这两个表的交叉部分,如果表中至少有一个匹配项,INNER JOIN 关键字将返回一行。如果没有匹配项,则不会有输出结果。
1.3 左连接
简介:左连接也可以被称为左外连接,在 FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN 关键字来表示。左连接以左侧表为基础表,接收左表的所有行,
并用这些行与右侧参考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行。
如图所示:
语句: select * from a_player a left join b_player b on a.a_id=b.b_id;
从以上左连接查询结果可以看出,除了匹配的行,a_id 和 b_id 是 2 和 3 那两行,还包括了左表中有但右表中没有的行,
如果有表没有对应值,则使用 NULL 代替。也就是说在左连接查询中,使用 NULL 值表示右表中没有找到与左表中匹配的记录。
从原理图可以看出,左连接中左表的记录将会全部表示出来,而右表只会显示符合搜索 条件的记录,也就是图中交叉的部分。右表记录不足的地方均为 NULL。
1.4 右连接
简介:右连接也被称为右外连接,在 FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 关键字来表示。右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配。也就是说匹配右表中的每一行及左表中符合条件的记录。
如图所示:
语句:select * from a_player a right join b_player b on a.a_id=b.b_id;
分析:在右连接的查询结果集中,除了符合匹配规则的行外,还包括右表中有但是左表中不匹 配的行,这些记录在左表中以 NULL 补足
二.数据库函数
简介:MySQL 数据库函数提供了能够实现各种功能的方法,使我们在查询记录时能够更高效的输出。MySQL 内建了很多函数,常用的包括数学函数、聚合函数、字符串函数和日期时间函数。
2.1 数学函数
常用的数学函数如下:
- abs(x) 返回 x 的绝对值
- rand() 返回 0 到 1 的随机数
- mod(x,y) 返回 x 除以 y 以后的余数
- power(x,y) 返回 x 的 y 次方
- round(x) 返回离 x 最近的整数
- round(x,y) 保留x 的y 位小数四舍五入后的值
- sqrt(x) 返回 x 的平方根
- truncate(x,y) 返回数字 x 截断为 y 位小数的值
- ceil(x) 返回大于或等于 x 的最小整数
- floor(x) 返回小于或等于 x 的最大整数
- greatest(x1,x2…) 返回集合中最大的值
- least(x1,x2…) 返回集合中最小的值
下面演示MySQL 数学函数的使用方法
语句示例:
select abs(-1), rand(), mod(5,3), power(2,3), round(1.89);
分析:通过上面的数学函数表,先算出(-1)的绝对值为1,rand表示为它的随机值可以为0,并且它是无限接近于1,但是不能为1,mod表示取余,算出值为2,round(1.89)四舍五入后变成2。
语句示例:
select round(1.8937,3), sqrt(4),truncate(1.235,2), ceil(5.2), floor(2.1);
分析:通过上面的数学函数表,round中y 表示小数四舍五入后的值,y等于3,也就是小数点向右移3位,四舍五入后就变成1.894,sqrt(4)中4的平方根就是2,truncate数字 x 截断为 y 位小数的值,y的值为2,表示小数点后二位有效数字,得到结果为1.23,ceil(5.2)取比5大的最小整数,也就是6,floor(2.1)表示小于或等于2的最大整数,因此最大的取值就是为2
语句示例:select greatest(4.33,2,1,6,5.5),least(1.89,3,6.1,2.1);
分析:通过上面的数学函数表,greatest取集合中最大值6,least取集合中的最小值为1.89。
2.2 聚合函数
简介:MySQL 数据库函数中专门有一组函数是特意为库内记录求和或者对表中的数据进行集中概括而设计的,这些函数被称作聚合函数
常用的聚合函数如下:
- avg() 返回指定列的平均值
- count() 返回指定列中非 NULL 值的个数
- min() 返回指定列的最小值
- max() 返回指定列的最大值
- sum(x) 返回指定列的所有值之和
语句示例:
select avg(level) as avg_level from player;
select count(level) as count_level from player;
select min(level) as min_level from player;
select max(level) as max_level from player;
select sum(level) as sum_level from player;
查询player表的所有信息
通过聚合函数的算法,得到以下的数值
2.3 字符串函数
常用的字符串函数如下:
- length(x) 返回字符串 x 的长度
- trim() 返回去除指定格式的值
- concat(x,y) 将提供的参数 x 和 y 拼接成一个字符串
- upper(x) 将字符串 x 的所有字母变成大写字母
- lower(x) 将字符串 x 的所有字母变成小写字母
- left(x,y) 返回字符串 x 的前 y 个字符
- right(x,y) 返回字符串 x 的后 y 个字符
- repeat(x,y) 将字符串 x 重复 y 次
- space(x) 返回 x 个空格
- replace(x,y,z) 将字符串 z 替代字符串 x 中的字符串 y
- strcmp(x,y) 比较 x 和 y,返回的值可以为-1,0,1
- substring(x,y,z) 获取从字符串 x 中的第 y 个位置开始长度为 z 的字符串
- reverse(x) 将字符串 x 反转
语句示例:select length(‘bdqn’), trim(’ yellow '), concat(‘bd’, ‘qn’), upper(‘abc’),
分析:length表示统计’bdqn’的字符串的长度,很显然长度为4,trim表示括号当中两个单引号被去除了,然后输出里面的值,得到结果为yellow,concat中把两个单引号括起来的bd和qn合并成一个字符串,输出结果为bdqn,upper把字母变成大写字母,所以结果为ABC。
语句示例:select lower(‘ABC’),left(‘world’,3),right(‘hello’, 3),repeat(‘kgc’, 2);
分析: lower把字母变成小写字母,结果为ABC,left向左移动3个字符, world就变成了wor,right向右移动3个字符,hello就变成了llo,repeat中把kgc的次数重复了2次,输出结果就为kgckgc。
语句示例:select length(concat(‘abc’,space(3),‘abc’));
分析,spache比较特殊,如果单打一个space(3),如图所示,看不到任何东西,通过上图的嵌套使用,得到的结果为9的空格。
语句示例:select replace(‘hello’, ‘ll’, ‘kgc’), strcmp(4, 5), substring(‘bjbdqn’, 4, 2), reverse(‘hello’);
分析:replace表示吧hello中的‘ll‘替换为‘kgc,得到结果为hekgco,’strcmp表示-1,0,1中的随机值,图中结果为-1,substring表示从括号的值当中第 4 个位置开始输出长度为 2 的字符串,结果就是为dq,reverse表示将字符串反转,hello就变成了olleh