MySQL高阶sql语句

按关键字段排序

语法结构:select 字段1,字段2…字段n from 表名 order by 字段(想要按什么字段排序就写哪个字段)ASC | DESC
ASC表示升序(默认升序),DESC表示降序
注意点:ORDER BY 语句也可以使用多个字段来进行排序,当排序的第一个字段相同的记录有多条的情况下,这些多条的记录再按照第二个字段进行排序,ORDER BY 后面跟多个字段时,字段之间使用英文逗号隔开,优先级是按先后顺序而定

测试数据如下:

create table info(id int(4),name varchar(20),subject varchar(20),score double);
insert into info values(1,'张三','语文',90);
insert into info values(2,'张三','数学',85);
insert into info values(3,'张三','英语',50);
insert into info values(4,'李四','语文',87);
insert into info values(5,'李四','数学',95);
insert into info values(6,'李四','英语',40);
insert into info values(7,'王五','语文',70);
insert into info values(8,'王五','数学',80);
insert into info values(9,'王五','英语',59);
mysql> select * from info order by score desc; //按成绩降序排序
+------+--------+---------+-------+
| id   | name   | subject | score |
+------+--------+---------+-------+
|    5 | 李四   | 数学    |    95 |
|    1 | 张三   | 语文    |    90 |
|    4 | 李四   | 语文    |    87 |
|    2 | 张三   | 数学    |    85 |
|    8 | 王五   | 数学    |    80 |
|    7 | 王五   | 语文    |    70 |
|    9 | 王五   | 英语    |    59 |
|    3 | 张三   | 英语    |    50 |
|    6 | 李四   | 英语    |    40 |
+------+--------+---------+-------+
9 rows in set (0.00 sec)
mysql> select * from info order by name desc,score; //按姓名降序排序,名字相同的按成绩升序排序
+------+--------+---------+-------+
| id   | name   | subject | score |
+------+--------+---------+-------+
|    9 | 王五   | 英语    |    59 |
|    7 | 王五   | 语文    |    70 |
|    8 | 王五   | 数学    |    80 |
|    6 | 李四   | 英语    |    40 |
|    4 | 李四   | 语文    |    87 |
|    5 | 李四   | 数学    |    95 |
|    3 | 张三   | 英语    |    50 |
|    2 | 张三   | 数学    |    85 |
|    1 | 张三   | 语文    |    90 |
+------+--------+---------+-------+
9 rows in set (0.00 sec)
mysql> 

区间判断查询

语法结构:select * from 表名 where 字段=值 (and|or) 字段=值
and:表示并且的意思;or:表示或者的意思

mysql> select * from info where score>50 and score<90;
+------+--------+---------+-------+
| id   | name   | subject | score |
+------+--------+---------+-------+
|    2 | 张三   | 数学    |    85 |
|    4 | 李四   | 语文    |    87 |
|    7 | 王五   | 语文    |    70 |
|    8 | 王五   | 数学    |    80 |
|    9 | 王五   | 英语    |    59 |
+------+--------+---------+-------+
5 rows in set (0.00 sec)
mysql> select * from info where score>90 or score<60;
+------+--------+---------+-------+
| id   | name   | subject | score |
+------+--------+---------+-------+
|    3 | 张三   | 英语    |    50 |
|    5 | 李四   | 数学    |    95 |
|    6 | 李四   | 英语    |    40 |
|    9 | 王五   | 英语    |    59 |
+------+--------+---------+-------+
4 rows in set (0.00 sec)
mysql> 

查询不重复记录

语法结构:select distinct 字段名 from 表名;
distinct关键字:表示查询后面跟着的字段名在表中的不重复的记录

mysql> select distinct name from info;
+--------+
| name   |
+--------+
| 张三   |
| 李四   |
| 王五   |
+--------+
3 rows in set (0.00 sec)
mysql> select distinct subject from info;
+---------+
| subject |
+---------+
| 语文    |
| 数学    |
| 英语    |
+---------+
3 rows in set (0.00 sec)
mysql>

分组查询

使用 GROUP BY 语句来实现分组,GROUP BY 通常都是结合聚合函数一起使用的,常用的聚合函数包括:计数(COUNT)、 求和(SUM)、求平均数(AVG)、最大值(MAX)、最小值(MIN),GROUP BY 分组的时候可以按一个或多个字段对结果进行分组处理。
语法结构:select count(*),字段名1,字段名2… from 表名 group by

mysql> select * from info;
+------+--------+---------+-------+
| id   | name   | subject | score |
+------+--------+---------+-------+
|    1 | 张三   | 语文    |    90 |
|    2 | 张三   | 数学    |    85 |
|    3 | 张三   | 英语    |    50 |
|    4 | 李四   | 语文    |    87 |
|    5 | 李四   | 数学    |    95 |
|    6 | 李四   | 英语    |    40 |
|    7 | 王五   | 语文    |    70 |
|    8 | 王五   | 数学    |    80 |
|    9 | 王五   | 英语    |    59 |
+------+--------+---------+-------+
9 rows in set (0.00 sec)
mysql> select count(*),name from info group by name;
+----------+--------+
| count(*) | name   |
+----------+--------+
|        3 | 张三   | //按name分组,统计行数
|        3 | 李四   |
|        3 | 王五   |
+----------+--------+
3 rows in set (0.00 sec)
mysql> 

子查询

子查询也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个查询语 句。子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一 步的查询过滤。

mysql> select * from info where score in (select score from info where score>70);
+------+--------+---------+-------+
| id   | name   | subject | score |
+------+--------+---------+-------+
|    1 | 张三   | 语文    |    90 |
|    2 | 张三   | 数学    |    85 |
|    4 | 李四   | 语文    |    87 |
|    5 | 李四   | 数学    |    95 |
|    8 | 王五   | 数学    |    80 |
+------+--------+---------+-------+
5 rows in set (0.00 sec)
mysql> select * from info where score not in (select score from info where score>70);
+------+--------+---------+-------+
| id   | name   | subject | score |
+------+--------+---------+-------+
|    3 | 张三   | 英语    |    50 |
|    6 | 李四   | 英语    |    40 |
|    7 | 王五   | 语文    |    70 |
|    9 | 王五   | 英语    |    59 |
+------+--------+---------+-------+
4 rows in set (0.00 sec)
mysql> 

设置别名

在 MySQL 查询时,当表的名字比较长或者表内某些字段比较长时,为了方便书写或者 多次使用相同的表,可以给字段列或表设置别名。使用的时候直接使用别名,简洁明了,增强可读性
使用 AS 来设置别名
语法结构:select 别名.字段名1…别名.字段名n from 表名 AS 别名;

mysql> select i.id,i.name,i.subject,i.score from info as i where id<3;
+------+--------+---------+-------+
| id   | name   | subject | score |
+------+--------+---------+-------+
|    1 | 张三   | 语文    |    90 |
|    2 | 张三   | 数学    |    85 |
+------+--------+---------+-------+
2 rows in set (0.00 sec)
mysql> 
mysql> select id 学号,name 姓名,subject 科目,score 成绩 from info; //设置别名时 as 可以省略
+--------+--------+--------+--------+
| 学号   | 姓名   | 科目   | 成绩   |
+--------+--------+--------+--------+
|      1 | 张三   | 语文   |     90 |
|      2 | 张三   | 数学   |     85 |
|      3 | 张三   | 英语   |     50 |
|      4 | 李四   | 语文   |     87 |
|      5 | 李四   | 数学   |     95 |
|      6 | 李四   | 英语   |     40 |
|      7 | 王五   | 语文   |     70 |
|      8 | 王五   | 数学   |     80 |
|      9 | 王五   | 英语   |     59 |
+--------+--------+--------+--------+
9 rows in set (0.01 sec)

mysql> 

模糊查询

使用 LIKE 关键字,通常与 WHERE 子句一起使用来完成查询任务。
%:百分号表示零个、一个或多个字符 *
_:下划线表示单个字符

mysql> select * from info where name like '王%';
+------+--------+---------+-------+
| id   | name   | subject | score |
+------+--------+---------+-------+
|    7 | 王五   | 语文    |    70 |
|    8 | 王五   | 数学    |    80 |
|    9 | 王五   | 英语    |    59 |
+------+--------+---------+-------+
3 rows in set (0.00 sec)

mysql> select * from info where name like '王_';
+------+--------+---------+-------+
| id   | name   | subject | score |
+------+--------+---------+-------+
|    7 | 王五   | 语文    |    70 |
|    8 | 王五   | 数学    |    80 |
|    9 | 王五   | 英语    |    59 |
+------+--------+---------+-------+
3 rows in set (0.01 sec)
mysql> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值