Mysql语法进阶
一、按关键字排序
使用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');