进阶Mysql数据库----Mysql高级语句,你离sql高手只差这篇文章(详细图解)

一、按关键字排序

使用ORDER BY语句来实现排序

语法:

select column1,column2,… from 库名 order by column1,column,… asc | desc;

  • 排序可针对一个或多个字段

ASC:升序,默认排序方式

在这里插入图片描述

DESC:降序

select * from student order by age desc;

在这里插入图片描述

  • ORDER BY的语法结构
select * from student order by age;

按多字段排序

select * from student order by age desc,results desc;

在这里插入图片描述

二、对结果进行分组

GROUP BY分组

  • 使用GROUP BY语句来实现分组

  • 通常结合聚合函数一起使用

  • 可以按一个或多个字段对结果进行分组

语法:

select count(字段名1),字段名2 from 表名 group by 字段名2 ;

例:

select count(name),age from student group by age ;

在这里插入图片描述

GROUP BY结合ORDER BY

select count(name),age from student group by age  order by age desc;

在这里插入图片描述

三、限制结果条目

  • 使用limit语句限制条目
  • limit语法结构

只返回select查询结果的第一行或第几行

语法:

select column1,column2,… from 库名 limit 位置偏移量

例:

select * from student limit 3;
select * from student limit 3,3;

在这里插入图片描述

四、设置别名

  • 使用AS语句设置别名,关键字AS可省略

  • 设置别名时,保证不能与库中其他表或字段名称冲突

  • 别名的语法结构

列的别名:

select 列名 as 列名别名 from 库名;

表的别名:

select 列名 from 库名 as 库名别名;

例:

select t.id as 编号,t.name as 名字, t.age as 年龄, results as 成绩 from student as t;

在这里插入图片描述

五、通配符的使用

  • 用于替换字符串中的部分字符
  • 通常配合like一起使用,并协同where完成查询
  • 常用通配符
  • %:表示0个,1个或多个
  • _:表示单个字符

例:

select * from  student as t  where name like 'z%' ;
- %:表示0个,1个或多个

select * from  student as t  where name like 'zc_' ;
- _:表示单个字符

在这里插入图片描述

六、子查询

  • 也称作内查询或者嵌套查询
  • 先于主查询被执行,其结果将作为外层查询的条件
  • 在增删改查中都可以使用子查询
  • 支持多层嵌套
  • IN语句是用来判断某个值是否在给定的结果集中
  • 子查询的用法

例:

 select t.id as 编号,t.name as 名字, t.age as 年龄, results as  成绩 from student 
 as t where t.results in ( select results from student where results >= 60 ) ;

在这里插入图片描述
查询结合降序使用:

例:

select t.id as 编号,t.name as 名字, t.age as 年龄, results as  成绩 from student as t where t.results in ( select results from student where results >= 60 ) order by results desc;

在这里插入图片描述

插入语句结合子查询

例:

insert into newstudent select * from student where id in (select id from student);

在这里插入图片描述
#update / delete 等语句同理, where条件可以从子查询语句中获取。

update语法:

update 表名 set 要修改的字段=要修改成的结果值 where 条件字段1 in (select 需要被取的字段 from 表名
where 条件字段 >=条件值);

delete 语法:

delete from 表名 where 字段1 in(select 字段1 from (select * from 表名where 字段>=值 ) a);

七、NULL值

  • 表示缺失的值
  • 与数字0或者空白(spaces)是不同的
  • 使用IS NULL或IS NOT NULL进行判断
  • NULL值和空值的区别
  • 空值长度为0,不占空间;NULL值的长度为NULL,占用空间
  • IS NULL无法判断空值
  • 空值使用“=”或者“<>”来处理
  • COUNT()计算时,NULL会忽略,空值会加入计算

插入空值

 alter table student add class varchar(16); 
 # 插入一个空字段
 
 select * from student;
 #查询表内容
 
 insert into student (id,name,age,results,class) values(12,'hd',18,81,'');
 #插入一列空值,非NULL值

在这里插入图片描述
在这里插入图片描述

null的用法

例:

select * from student  where class is null;
# is null 就是为null的意思
select * from student  where class is not  null;
# is not null 就是不为空的意思

在这里插入图片描述

八、正则表达式

  • 根据指定的匹配模式匹配记录中符合要求的特殊字符
  • 使用REGEXP关键字指定匹配模式
  • 常用匹配模式
字符 说明
^ 匹配开始字符
$ 匹配结束字符
. 匹配任意单个或多个任意字符
* 匹配任意个前面的字符
+ 匹配前面字符至少1次
p1|p2 匹配p1或p2
[…] 匹配字符集中括号内的任
[^…] 匹配不在括号内的任何字
{n} 匹配前面的字符串n次
{n,m} 匹配前面的字符串至少n

以z开头的姓名:(^)

例:

select * from student where name regexp '^z' ;

在这里插入图片描述
以n结尾的姓名:

例:

select * from student where name   regexp 'n$' ;

在这里插入图片描述
匹配单个字符(.)

例:

select * from student where name regexp 'zc.' ;

在这里插入图片描述
匹配前面字符至少1次(+)

例:

select * from student where name regexp 'zc+' ;

在这里插入图片描述
匹配p1或p2(p1|p2)

例:

 select * from student  where name regexp 'z|c';

在这里插入图片描述
匹配字符集中括号内的任何字符([…])

例:

select * from student  where name regexp '[zics]';

在这里插入图片描述
匹配前面的字符串n次{n}

例:

select * from student  where name regexp 'c{3}';

在这里插入图片描述
匹配前面的字符串至少n次,至多m次({n,m})

例:

select * from student  where name regexp 'c{1,3}';

在这里插入图片描述

九、算术运算符

字符 说明
+ 加法
- 减法
* 乘法
/ 除法
% 取余数

例:

select 5+2 as addition,8-5 as subtraction,6*7 as multiplication,8/2 as division,9%4 as remainder;

在这里插入图片描述

比较运算符

  • 字符串的比较默认不区分大小写,可使用binary来区分
  • 常用比较运算符
运算符 说明
= 等于
> 大于
< 小于
>= 大于或等于
<= 小于或等于
!=或<> 不等于
IN 在集合中
LIKE 通配符匹配
IS NULL 判断一个值是否为NULL
IS NOT NULL 判断一个值是否不为NULL
BETWEEN AND 两者之间
GREATEST 两个或多个参数时返回最大值
LEAST 两个或多个参数时返回最小值

例:

 select 2=4,2='2','e'='e',(4+4)=(5+3),'n'=NULL;

在这里插入图片描述

select 2>4,2<'2', 'e'>='e',(4+4)<=(5+3);
                 
select 2!=4,null is null,null is not null,2 between 1 and 4;

select greatest (5,8,12),least (1,5,4);     

在这里插入图片描述
从以上查询可以看出:

①如果两者都是整数,则按整数值进行比较

②如果一个整数一个字符串,则会自动将字符串转换为数字,再进行比较

③如果两者都是字符串,则按照字符串进行比较

④如果两者中至少有一个值是NULL,则比较的结果是NULL

十、逻辑运算符

  • 又称为布尔运算符

  • 用来判断表达式的真假

  • 常用的逻辑运算符

运算符 说明
NOT或! 逻辑非
AND或&& 逻辑与
OR或|| 逻辑或
XOR 逻辑异或

《逻辑非》

例:

select not 2,!3,not 0,!(4-4);

在这里插入图片描述
《逻辑与》

例:

 select 2 and 3,4 && 0,0 && NULL,1 and NULL;

在这里插入图片描述

十一、位运算符

  • 对二进制数进行计算的运算符
  • 常用的位运算符
运算符 说明
运算符 说明
& 按位与
| 按位或
~ 按位取反
^ 按位异或
<< 按位左移
>> 按位右移

例:

select 4&5,4|5,4&~3,3^4,2<<2,2>>1;

在这里插入图片描述

十二、连接查询

MySQL的连接查询,通常都是将来自两个或多个表的行结合起来,基于这些表之间的共同字段,进行数据的拼接,首先,要确定一个主表作为结果集,然后将其他表的行有选择性的连接到选定的主表结果集上,使用较多的连接查询包括:内连接、左连接和右连接。

JOIN 按照功能大致分为如下三类:

  • INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
  • LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
  • RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

实验环境:
在这里插入图片描述

内连接及示意图

在这里插入图片描述
例:

select a.id,a.name,b.results from student a  INNER JOIN newstudent b on a.id = b.id;

在这里插入图片描述
以上sql如果用where来写的话就是这样,效果一样

select a.id,a.name,b.results from student a , newstudent b where  a.id = b.id;

在这里插入图片描述

左连接及示意图

MySQL left join 与 join 有所不同。 MySQL LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。
在这里插入图片描述

例:

select a.id,a.name,b.results from student a LEFT JOIN newstudent b on a.id = b.id;

在这里插入图片描述

右连接及示意图

MySQL RIGHT JOIN 会读取右边数据表的全部数据,即便左边边表无对应数据。

在这里插入图片描述

例:

select a.id,a.name,b.results from student a RIGHT JOIN newstudent b on a.id = b.id;

在这里插入图片描述

十三、函数

数学函数

函数 含义
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…) 返回集合中最小的值

常用的数学函数举例说明

select abs(-12),rand(),rand(),mod(4,5),power(2,6); 

select round(2.4),round(2.5),round(2.4235,2),sqrt(2),truncate(2.4652,2);

select ceil(2.2),floor(2.8),greatest(1,2,3,4,5),least(1,2,3,4,5);

执行结果如下图:
在这里插入图片描述

聚合函数

对表中数据记录进行集中概括而设计的一类函数

函数 含义
avg() 返回指定列的平均值
count() 返回指定列中非NULL值的个数
min() 返回指定看列的最小值
max() 返回指定列的最大值
sum() 返回指定列的所有值之和

聚合函数举例:

select avg(age) from student;
# 平均值
select sum(results) from student;
# 总和
select min(results) from student;
# 最小值
select max(results) from student;
# 最大值
select count(*) from stundet;
# 总行数

在这里插入图片描述
在这里插入图片描述

字符串函数

函数 含义
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('abc'),trim(  'ab' ),concat('ab','cd'),upper('abc'),lower('ABC');

select left('abcd',2),right('abcd',2),repeat('abc',3);

select space(2),replace('abcde','e','g'),strcmp('a','b'),strcmp('a','a'),strcmp('b','a');

select substring('abcdefg',3,3),reverse('abcdefg');

在这里插入图片描述

日期时间函数

函数 含义
curdate() 返回当前时间的年月日
curtime() 返回当前时间的时分秒
now() 返回当前时间的日期和时间
month() 返回日期x中的月份值
week(x) 返回日期x是年度第几个星期
hour(x) 返回x中的小时值
minute(x) 返回x中的分钟值
second(x) 返回x中的秒钟值
dayofweek(x) 返回x是星期几,1星期日,2星期1
dayofmonth(x) 计算日期x是本月的第几天
dayofyear(x) 计算日期x是本年的第几天

例:

select curdate(),curtime(),now(),month('2021-02-07'),week('2020-02-07'); 

select hour('22:15:45'),minute('22:15:45'),second('22:15:45');    

select dayofweek('2020-02-07'),dayofmonth('2020-02-07'),dayofyear('2020-02-07');

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45412401/article/details/113690713