学会MYSQL数据库高级SQL语句一篇就够了(一一举例)!!!

这篇博客详细介绍了MySQL数据库的高级SQL查询技巧,包括排序、分组、限制结果、设置别名、多表查询、子查询、正则表达式、运算符以及存储过程的使用。内容涵盖ORDER BY、GROUP BY、LIMIT、AS、JOIN、SUBQUERY、REGEXP、逻辑运算符、位运算符等多个方面,旨在提升数据库运维和开发者在SQL操作上的能力。
摘要由CSDN通过智能技术生成

博主花了两天两夜,整理出一些 SQL 语句的高级使用方法。SQL语句的熟练使用,在平时的运维工作中可以提供不小的帮助,尤其是在一些规模较小的公司,运维身兼数职,可能会有不少数据库的相关工作。本章将从不同的方面出发介绍 SQL 语句的高级运用方法。

文章目录

一:MyAQL进阶查询

在对 MySQL 数据库的增、删、改、查操作有一定了解之后,就可以学习一些 SQL 语句的高级使用方法。SQL语句的熟练使用,在平时的运维工作中可以提供不小的帮助,尤其是在一些规模较小的公司,运维身兼数职,可能会有不少数据库的相关工作。本章将从不同的方面出发介绍 SQL 语句的高级运用方法。
本数据库环境为MySQL5.6

1.1:按关键字排序

  • 使用ORDERBY语句来实现排序
  • 排序可针对一个或多个字段
  • ASC:升序,默认排序方式 【升序是从小到大】
  • DESC:降序 【降序是从大到小】
  • ORDER BY的语法结构
  • ORDER BY后面跟字段名
SELECT column1, column2,....FROM table_name ORDER BY column1,column2,...ASC|DESC;

1.11:按单字短排序

  • 我们这边新建一个数据库tt
mysql> create database tt;

mysql> use tt;

mysql>  create table tt (id int(10) not null primary key auto_increment,name char(20) not null,score decimal(5,2),address varchar(40)default '未知')engine=innodb;

mysql> desc tt;                                                                     
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(10)      | NO   | PRI | NULL    | auto_increment |
| name    | char(20)     | NO   |     | NULL    |                |
| score   | decimal(5,2) | YES  |     | NULL    |                |
| address | varchar(40)  | YES  |     | 未知    |                |
+---------+--------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)

mysql>  insert into tt (name,score,address) values ('wangwu',68,'beijing'),('lisi',9njing');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql>  insert into tt (name,score,address) values ('zhangsan',74,'beijing'),('shang78,'hangzhou');
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

#写入数据
mysql> select * from tt;
+----+----------+-------+----------+
| id | name     | score | address  |
+----+----------+-------+----------+
|  1 | wangwu   | 68.00 | beijing  |
|  2 | lisi     | 90.00 | nanjing  |
|  3 | zhangsan | 74.00 | beijing  |
|  4 | shanghai | 78.00 | hangzhou |
+----+----------+-------+----------+
4 rows in set (0.02 sec)
  • 筛选大于70分的
    【SELECT 语句中如果没有指定具体的排序方式,则默认按 ASC 方式进行排序。DESC 是按降序方式进行排列。当然 ORDER BY 前面也可以使用 WHERE 子句对查询结果进一步过滤.】
mysql> select name,score from tt where score>=70;
+----------+-------+
| name     | score |
+----------+-------+
| lisi     | 90.00 |
| zhangsan | 74.00 |
| shanghai | 78.00 |
+----------+-------+
3 rows in set (0.00 sec)

#筛选大于70分的进行升序排序 【对score字段排序】
mysql> select name,score from tt where score>=70 order by score;  #ASC可省略,升序
+----------+-------+
| name     | score |
+----------+-------+
| zhangsan | 74.00 |
| shanghai | 78.00 |
| lisi     | 90.00 |
+----------+-------+
3 rows in set (0.00 sec)

#筛选大于70分的进行降序排序 【对score字段排序】
mysql> select name,score from tt where score>=70 order by score desc;   #降序
+----------+-------+
| name     | score |
+----------+-------+
| lisi     | 90.00 |
| shanghai | 78.00 |
| zhangsan | 74.00 |
+----------+-------+
3 rows in set (0.00 sec)

1.12:按多字段排序

这边我们再次插入新的数据内容

mysql> insert into tt(name,score,address) values('tom',66,'wuxi'),('jerry',77,'hangzhou');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from tt;                                                                 
+----+----------+-------+----------+
| id | name     | score | address  |
+----+----------+-------+----------+
|  1 | wangwu   | 68.00 | beijing  |
|  2 | lisi     | 90.00 | nanjing  |
|  3 | zhangsan | 74.00 | beijing  |
|  4 | shanghai | 78.00 | hangzhou |
|  5 | tom      | 66.00 | wuxi     |
|  6 | jerry    | 77.00 | hangzhou |
+----+----------+-------+----------+
6 rows in set (0.01 sec)

mysql> select id,name,score from tt where score>=70 order by score  ASC;
+----+----------+-------+
| id | name     | score |
+----+----------+-------+
|  3 | zhangsan | 74.00 |
|  6 | jerry    | 77.00 |
|  4 | shanghai | 78.00 |
|  2 | lisi     | 90.00 |
+----+----------+-------+
4 rows in set (0.00 sec)

mysql> select id,name,score from tt where score>=70 order by score  DESC;
+----+----------+-------+
| id | name     | score |
+----+----------+-------+
|  2 | lisi     | 90.00 |
|  4 | shanghai | 78.00 |
|  6 | jerry    | 77.00 |
|  3 | zhangsan | 74.00 |
+----+----------+-------+
4 rows in set (0.00 sec)
  • 修改lisi成绩为66分
mysql> update tt set score=66 where id=2;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select id,name,score from tt where score>=70 order by score desc;
+----+----------+-------+
| id | name     | score |
+----+----------+-------+
|  4 | shanghai | 78.00 |
|  6 | jerry    | 77.00 |
|  3 | zhangsan | 74.00 |
+----+----------+-------+
3 rows in set (0.00 sec)

#更改表中数据如下
mysql> select * from tt;
+----+----------+-------+----------+
| id | name     | score | address  |
+----+----------+-------+----------+
|  1 | wangwu   | 80.00 | beijing  |
|  2 | lisi     | 66.00 | nanjing  |
|  3 | zhangsan | 80.00 | beijing  |
|  4 | shanghai | 78.00 | hangzhou |
|  5 | tom      | 80.00 | wuxi     |
|  6 | jerry    | 77.00 | hangzhou |
+----+----------+-------+----------+
6 rows in set (0.00 sec)

mysql> select id,name,score from tt where score>=70 order by score desc,id desc ;
+----+----------+-------+
| id | name     | score |
+----+----------+-------+
|  5 | tom      | 80.00 |
|  3 | zhangsan | 80.00 |
|  1 | wangwu   | 80.00 |
|  4 | shanghai | 78.00 |
|  6 | jerry    | 77.00 |
+----+----------+-------+
5 rows in set (0.00 sec)

1.2:对结果进行分组

通过 SQL 查询出来的结果,还可以对其进行分组,使用 GROUP BY 语句来实现。

GROUP BY 从字面上看,是以 BY 后面的内容对查询出的数据进行分组,就是将一个“数据集”划分成若干个“小区域”,然后针对这些个“小区域”进行数据处理。

  • 使用GROUP BY语句来实现分组
  • 通常结合聚合函数一起使用
  • 可以按一个或多个字段对结果进行分组
  • GROUP BY的语法结构
SELECT column_name, aggregate_function(column_name)FROM table_name WHERE column_name operator value GROUP BY column_name;

1.21:常用的聚合函数包括:

count (字段名称) 计数 函数
count (*) 技术

sum (*) 求和

avg (*) 平均值

max (*) 最大

min (*) 最小值

1.22:GROUP BY分组

统计70跟80分的人数

mysql> select * from tt;
+----+----------+-------+----------+
| id | name     | score | address  |
+----+----------+-------+----------+
|  1 | wangwu   | 80.00 | beijing  |
|  2 | lisi     | 66.00 | nanjing  |
|  3 | zhangsan | 80.00 | beijing  |
|  4 | shanghai | 78.00 | hangzhou |
|  5 | tom      | 80.00 | wuxi     |
|  6 | jerry    | 77.00 | hangzhou |
+----+----------+-------+----------+
6 rows in set (0.00 sec)

mysql> select count(name),score from tt where score >=70 group by score;
+-------------+-------+
| count(name) | score |
+-------------+-------+
|           1 | 77.00 |
|           1 | 78.00 |
|           3 | 80.00 |
+-------------+-------+
3 rows in set (0.00 sec)

求班级的学生的平均成绩

mysql> select avg(score) from tt;
+------------+
| avg(score) |
+------------+
|  76.833333 |
+------------+
1 row in set (0.00 sec)

1.23:GROUP BY集合ORDER BY

mysql> select count(name),score from tt where score >=70 group by score order by score desc;
+-------------+-------+
| count(name) | score |
+-------------+-------+
|           3 | 80.00 |
|           1 | 78.00 |
|           1 | 77.00 |
+-------------+-------+
3 rows in set (0.00 sec)

mysql> select count(name),score from tt where score >=70 group by score order by score ; 
+-------------+-------+
| count(name) | score |
+-------------+-------+
|           1 | 77.00 |
|           1 | 78.00 |
|           3 | 80.00 |
+-------------+-------+
3 rows in set (0.00 sec)

1.3:限制结果条目

在使用 MySQL SELECT 语句进行查询时,结果集返回的是所有匹配的记录。有时候仅需要返回第一行或者前几行,这时候就需要用到 LIMIT 子句。

LIMIT 的第一个参数是位置偏移量(可选参数),是设置 MySQL 从哪一行开始显示。如果不设定第一个参数,将会从表中的第一条记录开始显示。需要注意的是,第一条记录的位置偏移量是 0,第二条是 1,以此类推。第二个参数是设置返回记录行的最大数目。

  • 只返回SELECT查询结果的第一行或前几行
  • 使用LIMIT语句限制条目
  • LIMIT语法结构
SELECT column1,column2,...FROM table_name LIMIT[offset,] number;
number:返回记录行的最大数目
[offset,]:位置偏移量,从0开始
  • 查看前三行的记录
mysql> select * from tt limit 3;
+----+----------+-------+---------+
| id | name     | score | address |
+----+----------+-------+---------+
|  1 | wangwu   | 80.00 | beijing |
|  2 | lisi     | 66.00 | nanjing |
|  3 | zhangsan | 80.00 | beijing |
+----+----------+-------+---------+
3 rows in set (0.00 sec)
  • 查看3到5行的记录
mysql> select * from tt limit 3,2;
+----+----------+-------+----------+
| id | name     | score | address  |
+----+----------+-------+----------+
|  4 | shanghai | 78.00 | hangzhou |
|  5 | tom      | 80.00 | wuxi     |
+----+----------+-------+----------+
2 rows in set (0.00 sec)

  • 列出班级前三名
mysql> insert into tt (name,score,address) values ('aa',87,'shanghai'),('shuaige',76,'hangzgzhou');

mysql> select * from tt;
+----+----------+-------+----------+
| id | name     | score | address  |
+----+----------+-------+----------+
|  1 | wangwu   | 80.00 | beijing  |
|  2 | lisi     | 66.00 | nanjing  |
|  3 | zhangsan | 80.00 | beijing  |
|  4 | shanghai | 78.00 | hangzhou |
|  5 | tom      | 80.00 | wuxi     |
|  6 | jerry    | 77.00 | hangzhou |
|  7 | aa       | 87.00 | shanghai |
|  8 | shuaige  | 76.00 | hangzhou |
+----+----------+-------+----------+
8 rows in set (0.00 sec)

mysql> select * from tt order by score desc limit 3;
+----+----------+-------+----------+
| id | name     | score | address  |
+----+----------+-------+----------+
|  7 | aa       | 87.00 | shanghai |
|  1 | wangwu   | 80.00 | beijing  |
|  3 | zhangsan | 80.00 | beijing  |
+----+----------+-------+----------+
3 rows in set (0.00 sec)

1.4:设置别名

在 MySQL 查询时,当表的名字比较长或者表内某些字段比较长时,为了方便书写或者多次使用相同的表,可以给字段列或表设置别名。使用的时候直接使用别名,简洁明了,增 强可读性。

  • 使用AS语句设置别名,关键字AS可省略
  • 设置别名时,保证不能与库中其他表或字段名称冲突
  • 别名的语法结构
SELECT column_name AS alias_name FROM table_name;
SELECT column_name(s)FROM table_name ASalias_name;

1.41:AS的用法

示例

mysql> select count(*) from tt;
+----------+
| count(*) |
+----------+
|        8 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) as 数量 from tt;
+--------+
| 数量   |
+--------+
|      8 |
+--------+
1 row in set (0.00 sec)
  • 多表相连
mysql> create table gg (id int(10) not null primary key auto_increment,gg_name varchar(10) not null);
Query OK, 0 rows affected (0.07 sec)

mysql> show tables;
+--------------+
| Tables_in_tt |
+--------------+
| gg           |
| tt           |
+--------------+
2 rows in set (0.00 sec)

mysql> desc gg;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(10)     | NO   | PRI | NULL    | auto_increment |
| gg_name | varchar(10) | NO   |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)

mysql> insert into gg (gg_name) values ('乔治'),('佩奇'),('苏西');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from gg;
+----+---------+
| id | gg_name |
+----+---------+
|  1 | 乔治    |
|  2 | 佩奇    |
|  3 | 苏西    |
+----+---------+
3 rows in set (0.00 sec)

mysql> alter table tt add column hobby int(3) not null;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc tt;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(10)      | NO   | PRI | NULL    | auto_increment |
| name    | char(20)     | NO   |     | NULL    |                |
| score   | decimal(5,2) | YES  |     | NULL    |                |
| address | varchar(40)  | YES  |     | 未知    |                |
| hobby   | int(3)       | NO   |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

mysql> select * from tt;
+----+----------+-------+----------+-------+
| id | name     | score | address  | hobby |
+----+----------+-------+----------+-------+
|  1 | wangwu   | 80.00 | beijing  |     0 |
|  2 | lisi     | 66.00 | nanjing  |     0 |
|  3 | zhangsan | 80.00 | beijing  |     0 |
|  4 | shanghai | 78.00 | hangzhou |     0 |
|  5 | tom      | 80.00 | wuxi     |     0 |
|  6 | jerry    | 77.00 | hangzhou |     0 |
|  7 | aa       | 87.00 
  • 91
    点赞
  • 727
    收藏
    觉得还不错? 一键收藏
  • 31
    评论
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值