MySQL进阶查询

MySQL进阶查询

按关键字排序

使用ORDER BY语句来实现排序

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

ASC:升序,默认排序方式

DESC:降序

ORDER BY的语法结构

select column1,column2,...from table_name order by column1,column2,...asc|desc;

按单字段排序

mysql> select name,fenshu from bbb where fenshu>=50 order by fenshu;
+----------+--------+
| name     | fenshu |
+----------+--------+
| zhaoliu  |     50 |
| lisi     |     60 |
| wangwu   |     70 |
| tianqi   |     70 |
| wanger   |     88 |
| zhangsan |     89 |
+----------+--------+
6 rows in set (0.00 sec)

mysql> select name,fenshu from bbb where fenshu>=50 order by fenshu desc;
+----------+--------+
| name     | fenshu |
+----------+--------+
| zhangsan |     89 |
| wanger   |     88 |
| wangwu   |     70 |
| tianqi   |     70 |
| lisi     |     60 |
| zhaoliu  |     50 |
+----------+--------+
6 rows in set (0.00 sec)

按多字段排序

mysql> select id,name,fenshu from bbb where fenshu>=50 order by fenshu desc,id desc;
+----+----------+--------+
| id | name     | fenshu |
+----+----------+--------+
|  2 | zhangsan |     89 |
|  1 | wanger   |     88 |
|  6 | tianqi   |     70 |
|  4 | wangwu   |     70 |
|  3 | lisi     |     60 |
|  5 | zhaoliu  |     50 |
+----+----------+--------+
6 rows in set (0.00 sec)

对结果进行分组

使用GROUP BY语句来实现分组

GROUP BY通常都是结合聚合函数一起使用的,常用的聚合函数包括:计数(COUNT)、求和(SUM)、求平均数(AVG)、最大值(MAX)、最小值(MIN)

GROUP BY分组的时候可以按一个或多个字段对结果进行分组

GROUP BY的语法结构

SELECT column_name,aggregate_function(column_name)FROM table_name
WHERE column_name operator value GROUP BY column_name;
mysql> select avg(fenshu) from bbb;
+-------------+
| avg(fenshu) |
+-------------+
|     71.1667 |
+-------------+
1 row in set (0.00 sec)

mysql> select count(name),fenshu from bbb where fenshu>=60 group by fenshu;
+-------------+--------+
| count(name) | fenshu |
+-------------+--------+
|           1 |     60 |
|           2 |     70 |
|           1 |     88 |
|           1 |     89 |
+-------------+--------+
4 rows in set (0.00 sec)

mysql> select count(name),fenshu from bbb where fenshu>=60 group by fenshu order by fenshu desc;
+-------------+--------+
| count(name) | fenshu |
+-------------+--------+
|           1 |     89 |
|           1 |     88 |
|           2 |     70 |
|           1 |     60 |
+-------------+--------+
4 rows in set (0.00 sec)

限制结果条目

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

使用LIMIT语句限制条目

LIMIT语法结构

SELECT column1,column2,..FROM table_name LIMIT [offset,] number;
[offset,]代表的的是位置偏移量,从0开始    
number是返回记录行的最大数目
mysql> select id,name from bbb limit 3,3;	#从第4条记录开始显示之后的3条数据
+----+---------+
| id | name    |
+----+---------+
|  4 | wangwu  |
|  5 | zhaoliu |
|  6 | tianqi  |
+----+---------+
3 rows in set (0.00 sec)

mysql> select id,name,fenshu from bbb order by fenshu desc limit 3;	
#显示fenshu最高的前三
+----+----------+--------+
| id | name     | fenshu |
+----+----------+--------+
|  2 | zhangsan |     89 |
|  1 | wanger   |     88 |
|  6 | tianqi   |     70 |
+----+----------+--------+
3 rows in set (0.00 sec)

设置别名

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

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

别名的语法结构

SELECT column_name AS alias_name FROM table_name;
SELECT column_name(s) FROM table_name AS alias_name;
mysql> select count(*) from bbb;
+----------+
| count(*) |
+----------+
|        6 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) as 人数 from bbb;
+--------+
| 人数   |
+--------+
|      6 |
+--------+
1 row in set (0.00 sec)

mysql> select name as '姓名',address as '地址' from  bbb order by address;
+----------+--------+
| 姓名     | 地址   |
+----------+--------+
| wanger   | nanjin |
| zhangsan | nanjin |
| lisi     | nanjin |
| wangwu   | nanjin |
| zhaoliu  | nanjin |
| tianqi   | nanjin |
+----------+--------+
6 rows in set (0.00 sec)

多表查询

内连接

mysql> select * from bbb;
+----+----------+--------+---------+
| id | name     | fenshu | address |
+----+----------+--------+---------+
|  1 | wanger   |     88 | nanjin  |
|  2 | zhangsan |     89 | nanjin  |
|  3 | lisi     |     60 | nanjin  |
|  4 | wangwu   |     70 | nanjin  |
|  5 | zhaoliu  |     50 | nanjin  |
|  6 | tianqi   |     70 | nanjin  |
+----+----------+--------+---------+
6 rows in set (0.00 sec)

mysql> select * from test2;
+----+--------+
| id | xingqv |
+----+--------+
|  1 | 篮球   |
|  2 | 足球   |
|  3 | 电脑   |
+----+--------+
3 rows in set (0.00 sec)

mysql> select * from bbb join test2 on bbb.id=test2.id;
+----+----------+--------+---------+----+--------+
| id | name     | fenshu | address | id | xingqv |
+----+----------+--------+---------+----+--------+
|  1 | wanger   |     88 | nanjin  |  1 | 篮球    |
|  2 | zhangsan |     89 | nanjin  |  2 | 足球    |
|  3 | lisi     |     60 | nanjin  |  3 | 电脑    |
+----+----------+--------+---------+----+--------+

模糊查询

使用 mysql通配符
一般结合 like where使用
常见通配符有:
% 表示零个,一个或多个字符
_ 表示单个字符,有几个就是几个字符

mysql> select id,name from bbb where name like 'z%';
+----+----------+
| id | name     |
+----+----------+
|  2 | zhangsan |
|  5 | zhaoliu  |
+----+----------+
2 rows in set (0.00 sec)

mysql> select id,name from bbb where name like 'z_______';
+----+----------+
| id | name     |
+----+----------+
|  2 | zhangsan |
+----+----------+
1 row in set (0.00 sec)

子查询

括号里面的成为子语句
优先被执行
成为外面语句的条件

mysql> select id,name,fenshu from bbb where fenshu in (select fenshu from bbb where fenshu>=60);
+----+----------+--------+
| id | name     | fenshu |
+----+----------+--------+
|  1 | wanger   |     88 |
|  2 | zhangsan |     89 |
|  3 | lisi     |     60 |
|  4 | wangwu   |     70 |
|  6 | tianqi   |     70 |
+----+----------+--------+
5 rows in set (0.00 sec)

运算

加法
减法
乘法
/ 除法
% 取余数

mysql> select 1+2 as '加',2-1 as '减',2*2 as '乘',4/2 as'除',3%2 as '取余';
+-----+-----+-----+--------+--------+
||||| 取余    |
+-----+-----+-----+--------+--------+
|   3 |   1 |   4 | 2.0000 |      1 |
+-----+-----+-----+--------+--------+
1 row in set (0.00 sec)

比较运算符

= 等于
‘>’ 大于
'< ’ 小于
‘>=’ 大于等于
'<= ’ 小于等于
!=或<> 不等于
IS NULL 判断一个值是否为 NULL
IS NOT NULL 判断一个值是否不为 NULL
BETWEEN AND 两者之间
IN 在集合中
LIKE 通配符匹配
GREATEST 两个或多个参数时返回最大值
LEAST 两个或多个参数时返回最小值
REGEXP 正则表达式

mysql> select 'a'='a','a'='b',3+2=1+4;
+---------+---------+---------+
| 'a'='a' | 'a'='b' | 3+2=1+4 |
+---------+---------+---------+
|       1 |       0 |       1 |
+---------+---------+---------+
1 row in set (0.00 sec)
#成立则返回 1,不成立则返回 0;
between and 比较运算通常用于判断一个值是否落在某两个值之间
mysql> select 'a' between 'A' and 'Z' as 'A-Z';
+-----+
| A-Z |
+-----+
|   1 |
+-----+
1 row in set (0.00 sec)

mysql> select 'a' between 'a' and 'z' as 'a-z';
+-----+
| a-z |
+-----+
|   1 |
+-----+
1 row in set (0.00 sec)
最小值 least 和 最大值 greatest
mysql> select least(11,222,3333),greatest(11,222,3333);
+--------------------+-----------------------+
| least(11,222,3333) | greatest(11,222,3333) |
+--------------------+-----------------------+
|                 11 |                  3333 |
+--------------------+-----------------------+
1 row in set (0.00 sec)
innot in
判断 值 是否在 一组数字中
mysql> select 1 in (1,2,3),2 in (1,3,4);
+--------------+--------------+
| 1 in (1,2,3) | 2 in (1,3,4) |
+--------------+--------------+
|            1 |            0 |
+--------------+--------------+
1 row in set (0.00 sec)
likenot like
mysql> mysql> select 'gundam' like 'gunda_','gundam' like 'gun%','gundam' not like 'raise';
+------------------------+----------------------+---------------------------+
| 'gundam' like 'gunda_' | 'gundam' like 'gun%' | 'gundam' not like 'raise' |
+------------------------+----------------------+---------------------------+
|                      1 |                    1 |                         1 |
+------------------------+----------------------+---------------------------+
1 row in set (0.00 sec)
NULL
mysql> select 1 is null,1 is not null,null is null;
+-----------+---------------+--------------+
| 1 is null | 1 is not null | null is null |
+-----------+---------------+--------------+
|         0 |             1 |            1 |
+-----------+---------------+--------------+
1 row in set (0.00 sec)

逻辑运算符

NOT 或 ! 逻辑非
AND 或 && 逻辑与
OR 或 || 逻辑或
XOR 逻辑异或

运算方式如下:
且 0&&0=0 1&&0=0 0&&1=0 1&&1=1
或 0||0=0 1||0=1 0||1=1 1||1=1
异或 0^0=0 1^0=1 0^1=1 1^1=0

逻辑非
逻辑运算符中最简单的运算符就是逻辑非,逻辑非使用 NOT 或!表示。
逻辑非将跟在它后面的逻辑测试取反,把真变为假,把假变为真。
如果 NOT 后面的操作数为 0 时,所得值为 1;
如果操作数为非 0 时,所得值为 0;如果操作数为 NULL 时,所得值为 NULL。

mysql> select !2,not 2,!0,not 0,!(2-2);                                   
+----+-------+----+-------+--------+
| !2 | not 2 | !0 | not 0 | !(2-2) |
+----+-------+----+-------+--------+
|  0 |     0 |  1 |     1 |      1 |
+----+-------+----+-------+--------+
1 row in set (0.00 sec)

逻辑与
逻辑与通常用于判断两个值或多个值的有效性,如果所有值都是真返回 1,否则返回 0。
逻辑与使用 AND 或者&&表示。

mysql> select 5 and 6,5 && 6,'a' and null;
+---------+--------+--------------+
| 5 and 6 | 5 && 6 | 'a' and null |
+---------+--------+--------------+
|       1 |      1 |            0 |
+---------+--------+--------------+
1 row in set, 1 warning (0.00 sec
逻辑异或
两个非 NULL 值的操作数,如果两者都是 0 或者都是非 0,则返回 0;
如果一个为 0, 另一个为非 0,则返回结果为 1;当任意一个值为 NULL 时,返回值为 NULL。

mysql> select 1 xor 1,1 xor 0,0 xor 1,0 xor 0,1 xor null,1 xor null;
+---------+---------+---------+---------+------------+------------+
| 1 xor 1 | 1 xor 0 | 0 xor 1 | 0 xor 0 | 1 xor null | 1 xor null |
+---------+---------+---------+---------+------------+------------+
|       0 |       1 |       1 |       0 |       NULL |       NULL |
+---------+---------+---------+---------+------------+------------+
1 row in set (0.00 sec)

位运算
位运算符实际上是对二进制数进行计算的运算符。MySQL 内位运算会先将操作数变成二进制格式,然后进行位运算,最后在将计算结果从二进制变回到十进制格式,方便用户查看。
& 按位与
| 按位或
~ 按位取反
^ 按位异或
<< 按位左移
>> 按位右移

mysql> select 9 & 10,10 | 9,10 ^ 9;
+--------+--------+--------+
| 9 & 10 | 10 | 9 | 10 ^ 9 |
+--------+--------+--------+
|      8 |     11 |      3 |
+--------+--------+--------+
1 row in set (0.00 sec)
9 二进制 1001
10 二进制 1010
例:9&10=1001&1010=1000=十进制8
左移 << 右移>>
mysql> select 9<<3,10>>2;
+------+-------+
| 9<<3 | 10>>2 |
+------+-------+
|   72 |     2 |
+------+-------+
1 row in set (0.00 sec)29<<3=1001000=十进制72

正则表达式

^ 匹配文本的开始字符
$ 匹配文本的结束字符
. <-- 这有个点 匹配任何单个字符

匹配零个或多个在它前面的字符
匹配前面的字符 1 次或多次
A|B 匹配 A 或 B
[…] 匹配字符集合中的任意一个字符
[^…] 匹配不在括号中的任何字符
{n} 匹配前面的字符串 n 次
{n,m} 匹配前面的字符串至少 n 次,至多m 次

查找以 li 为开头的
mysql> select * from sanban where name regexp '^li';
+-----+--------+---------+
| num | name   | address |
+-----+--------+---------+
|   1 | lisi |       5 |
+-----+--------+---------+
1 row in set (0.00 sec)

查找以 si 为结尾的
mysql> select * from sanban where name regexp 'si$';
+-----+--------+---------+
| num | name   | address |
+-----+--------+---------+
|   1 | lisi   |       5 |
+-----+--------+---------+
1 row in set (0.00 sec)

查找 记录 中包含 is 的
mysql> select * from sanban where name regexp 'is';
+-----+--------+---------+
| num | name   | address |
+-----+--------+---------+
|   1 | lisi   |       5 |
+-----+--------+---------+
1 row in set (0.00 sec). 代替一个字符
mysql> select * from sanban where name regexp 'l.si';
+-----+--------+---------+
| num | name   | address |
+-----+--------+---------+
|   1 | lisi   |       5 |
+-----+--------+---------+
1 row in set (0.00 sec)
或 关系
mysql> select * from sanban where name regexp 'lisi|wangwu';
+-----+--------+---------+
| num | name   | address |
+-----+--------+---------+
|   1 | lisi   |       5 |
|   2 | wangwu |       6 |
+-----+--------+---------+
1 row in set (0.00 sec)

##注:aa*,星号前面的a有零个,一个,或多个,所以只要有a的就能出来
mysql> select * from sanban where name regexp 'aa*';
+-----+---------------+---------+
| num | name          | address |
+-----+---------------+---------+
|   7 | as       	  |       1 |
|   8 | aaaaabbc      |       6 |
+-----+---------------+---------+
6 rows in set (0.00 sec)

+ 匹配前面字符至少一次
mysql> select * from sanban where name regexp 'aaaaa+';
+-----+----------+---------+
| num | name     | address |
+-----+----------+---------+
|   8 | aaaaabbc |       6 |
+-----+----------+---------+
1 row in set (0.00 sec)

匹配 d-z 开头的
mysql> select * from sanban where name regexp '^[d-z]';
+-----+-----------+---------+
| num | name      | address |
+-----+-----------+---------+
|   1 | lisi  	  |       5 |
|   2 | wangwu 	  |       6 |
+-----+-----------+---------+
3 rows in set (0.00 sec)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值