Mysql数据库 | SQL语句解析『上篇』

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
全局流量管理 GTM,标准版 1个月
简介: Mysql数据库 | SQL语句解析

mysql来源


  • mysql是mysqlAB公司的
  • mysqlAB公司被sun公司收购了
  • sun公司又被Oracle公式收购了
  • mysql现在是由oracle公司负责维护
  • Oracle是收费的,mysql是免费的


navicat快捷键

在行尾:Shift+Home键选中当前行。
在行尾:Ctrl+Shift+Home键 从光标处一直选中文本开头
在行首:Shift+End键选中当前行。
在行首:Shift+End键 从光标处一直选中文本末尾
运行已选择的:Ctrl+Shift+R。
复制当前行:Ctrl+D。
Ctrl+q    打开查询窗口
Ctrl+/   注释MySQL语句
ctrl+shift +/  解除注释
ctrl+r           运行查询窗口的sql语句
ctrl+shift+r   只运行选中的sql语句
F6               打开一个mysql命令行窗口
ctrl+l            删除一行
ctrl+n           打开一个新的查询窗口
ctrl+w          关闭一个查询窗口

mysql数据库语言分类


DQL


数据查询语言,凡是带select关键字的都是查询语句都是DLQ


select 字段名 from 表名

#查看kc表中的所有数据
mysql> select * from kc;
+--------+--------------+----------+------+
| 课程号 | 课程名       | 开课学期 | 学分 |
+--------+--------------+----------+------+
| 101    | 计算机基础   |        1 |    3 |
| 102    | c语言        |        1 |    3 |
| 206    | 高等数学     |        3 |    3 |
| 208    | 数据结构     |        5 |    6 |
| 209    | 操作系统     |        6 |    3 |
| 210    | 计算机组装   |        4 |    4 |
| 212    | ORACLE数据库 |        2 |    5 |
| 301    | 计算机网络   |        1 |    4 |
| 302    | 软件工程     |        7 |    2 |
+--------+--------------+----------+------+
9 rows in set (0.01 sec)
#distinct消除重复数据
mysql> select distinct(学分) from kc;
+------+
| 学分 |
+------+
|    3 |
|    6 |
|    4 |
|    5 |
|    2 |
+------+
5 rows in set (0.00 sec)
# 查询多个字段
mysql> select 课程号,课程名 from kc;
+--------+--------------+
| 课程号 | 课程名       |
+--------+--------------+
| 102    | c语言        |
| 212    | ORACLE数据库 |
| 209    | 操作系统     |
| 208    | 数据结构     |
| 101    | 计算机基础   |
| 210    | 计算机组装   |
| 301    | 计算机网络   |
| 302    | 软件工程     |
| 206    | 高等数学     |
+--------+--------------+
9 rows in set (0.00 sec)
#列起别名
mysql> select 课程号 as jkj from kc;
+-----+
| jkj |
+-----+
| 102 |
| 212 |
| 209 |
| 208 |
| 101 |
| 210 |
| 301 |
| 302 |
| 206 |
+-----+
9 rows in set (0.00 sec)
mysql> select 课程号 as 'jkj hkh' from kc;
+---------+
| jkj hkh |
+---------+
| 102     |
| 212     |
| 209     |
| 208     |
| 101     |
| 210     |
| 301     |
| 302     |
| 206     |
+---------+
9 rows in set (0.00 sec)
#注意:
#as可省略
#双引号不标准,在mysql中可用,在Oracle中不可用
#单引号标准,都可用
#列参与数学运算
mysql> select 课程名 课程,学分*18 分数 from kc;
+--------------+------+
| 课程         | 分数 |
+--------------+------+
| 计算机基础   |   54 |
| c语言        |   54 |
| 高等数学     |   54 |
| 数据结构     |  108 |
| 操作系统     |   54 |
| 计算机组装   |   72 |
| ORACLE数据库 |   90 |
| 计算机网络   |   72 |
| 软件工程     |   36 |
+--------------+------+
9 rows in set (0.00 sec)
#根据生日求年龄
select 姓名,year(now())-year(出生日期) as 年龄 from 信息管理学生表;

条件查询

=         等于
><或!=    不等于
<         小于
<=        小于等于
>         大于
>=        大于等于
between……and……两个值之间,等同于   >= and <=
is null   为null(is not null 不为空)
and或&&      并且
or或||        或
in          包含,相当于多个or(not in 不在这个范围中)
not         取非,(主要用在is或in中)
any     满足子条件查询的任意一条件
all     满足子条件查询的所有条件
#eg:
mysql> select * from kc;
+--------+--------------+----------+------+
| 课程号 | 课程名       | 开课学期 | 学分 |
+--------+--------------+----------+------+
| 101    | 计算机基础   |        1 |    3 |
| 102    | c语言        |        1 |    3 |
| 206    | 高等数学     |        3 |    3 |
| 208    | 数据结构     |        5 |    6 |
| 209    | 操作系统     |        6 |    3 |
| 210    | 计算机组装   |        4 |    4 |
| 212    | ORACLE数据库 |        2 |    5 |
| 301    | 计算机网络   |        1 |    4 |
| 302    | 软件工程     |        7 |    2 |
+--------+--------------+----------+------+
9 rows in set (0.00 sec)
mysql> select * from kc where 学分 != 3;
+--------+--------------+----------+------+
| 课程号 | 课程名       | 开课学期 | 学分 |
+--------+--------------+----------+------+
| 208    | 数据结构     |        5 |    6 |
| 210    | 计算机组装   |        4 |    4 |
| 212    | ORACLE数据库 |        2 |    5 |
| 301    | 计算机网络   |        1 |    4 |
| 302    | 软件工程     |        7 |    2 |
+--------+--------------+----------+------+
5 rows in set (0.00 sec)

模糊查询

like        模糊查询,支持%或下划线匹配
          %匹配任意个字符
       一个_只能匹配一个字符
#找出课程号中含有1的
mysql> select * from kc where 课程号 like '%1%';
+--------+--------------+----------+------+
| 课程号 | 课程名       | 开课学期 | 学分 |
+--------+--------------+----------+------+
| 101    | 计算机基础   |        1 |    3 |
| 102    | c语言        |        1 |    3 |
| 210    | 计算机组装   |        4 |    4 |
| 212    | ORACLE数据库 |        2 |    5 |
| 301    | 计算机网络   |        1 |    4 |
+--------+--------------+----------+------+
5 rows in set (0.00 sec)
#找出课程号开头为1的
mysql> select * from kc where 课程号 like '1%';
+--------+------------+----------+------+
| 课程号 | 课程名     | 开课学期 | 学分 |
+--------+------------+----------+------+
| 101    | 计算机基础 |        1 |    3 |
| 102    | c语言      |        1 |    3 |
+--------+------------+----------+------+
2 rows in set (0.01 sec)
#找出课程号结尾为1的
mysql> select * from kc where 课程号 like '%1';
+--------+------------+----------+------+
| 课程号 | 课程名     | 开课学期 | 学分 |
+--------+------------+----------+------+
| 101    | 计算机基础 |        1 |    3 |
| 301    | 计算机网络 |        1 |    4 |
+--------+------------+----------+------+
2 rows in set (0.00 sec)
#找出课程名第三个为机的
mysql> select * from kc where 课程名 like '__机%';
+--------+------------+----------+------+
| 课程号 | 课程名     | 开课学期 | 学分 |
+--------+------------+----------+------+
| 101    | 计算机基础 |        1 |    3 |
| 210    | 计算机组装 |        4 |    4 |
| 301    | 计算机网络 |        1 |    4 |
+--------+------------+----------+------+
3 rows in set (0.00 sec)

分组查询


group by

#查找xs表中各专业男生的人数
mysql> select 专业名,count(性别) as 男生人数 from xs where 性别='男' group by 专业名 ;
+----------+----------+
| 专业名   | 男生人数 |
+----------+----------+
| 软件技术 |        8 |
| 网络技术 |        3 |
| 信息管理 |        1 |
| 建筑智能 |        1 |
+----------+----------+
4 rows in set (0.00 sec)
#为什么分组函数不能直接使用在where后面?
mysql> select 分数 from cj where 分数>max(分数);
ERROR 1054 (42S22): Unknown column '分数' in 'field list'  //报错
因为分组函数在使用时必须分组之后才能使用,where执行的时候还没有分组,所以where之后不能用分组函数

使用limit字句

#查询前三条数据记录
mysql> select * from xs limit 3;
+--------+--------+----------+------+------------+--------+------+
| 学号   | 姓名   | 专业名   | 性别 | 出生日期   | 总学分 | 备注 |
+--------+--------+----------+------+------------+--------+------+
| 001101 | 王金华 | 软件技术 | 男   | 1990-02-10 |   NULL | NULL |
| 001102 | 程周杰 | 软件技术 | 男   | 1991-02-01 |   NULL | NULL |
| 001103 | 王元   | 软件技术 | 男   | 1989-10-06 |   NULL | NULL |
+--------+--------+----------+------+------------+--------+------+
3 rows in set (0.01 sec)
#查询第四条数据记录
mysql> select * from xs limit 3,1;
+--------+--------+----------+------+------------+--------+------+
| 学号   | 姓名   | 专业名   | 性别 | 出生日期   | 总学分 | 备注 |
+--------+--------+----------+------+------------+--------+------+
| 001104 | 严蔚敏 | 信息管理 | 女   | 1990-08-26 |   NULL | NULL |
+--------+--------+----------+------+------------+--------+------+
1 row in set (0.00 sec)

多表查询

#查询最高分学生的详细信息
mysql> select distinct cj.学号,姓名,成绩 from xs,cj where cj.学号=xs.学号 and 成绩 = (select max(成绩) from cj) order by 成绩 desc;
+--------+--------+------+
| 学号   | 姓名   | 成绩 |
+--------+--------+------+
| 001110 | 张晓晖 | 95.0 |
+--------+--------+------+
1 row in set (0.00 sec)
#查询及格学生的详细信息
mysql> select distinct 姓名 as 及格学生的姓名,课程号,成绩 from xs,cj  where cj.学号=xs.学号 && 成绩 in (select 成绩 from cj where 成绩 >= 60) order by 成绩 desc;
+----------------+--------+------+
| 及格学生的姓名 | 课程号 | 成绩 |
+----------------+--------+------+
| 张晓晖         | 101    | 95.0 |
| 张晓晖         | 102    | 95.0 |
| 李明           | 101    | 85.0 |
| 严蔚敏         | 102    | 84.0 |
| 张飞           | 102    | 83.0 |
| 王元           | 206    | 81.0 |
| 李伟           | 206    | 80.0 |
| 刘超           | 102    | 80.0 |
| 马妮啦         | 102    | 79.0 |
| 王金华         | 102    | 78.0 |
| 程周杰         | 102    | 78.0 |
| 程周杰         | 206    | 78.0 |
| 刘超           | 101    | 78.0 |
| 王金华         | 206    | 76.0 |
| 李长江         | 206    | 76.0 |
| 李伟           | 102    | 71.0 |
| 王元           | 102    | 70.0 |
| 张飞           | 206    | 70.0 |
| 刘超           | 206    | 68.0 |
| 张飞           | 101    | 66.0 |
| 严蔚敏         | 101    | 65.0 |
| 严蔚敏         | 206    | 65.0 |
| 李伟           | 101    | 65.0 |
| 李明           | 102    | 64.0 |
| 刘敏           | 101    | 63.0 |
| 王元           | 101    | 62.0 |
| 王金华         | 101    | 61.0 |
| 李天飞         | 206    | 60.0 |
+----------------+--------+------+
28 rows in set, 1 warning (0.00 sec)

在增删改句子中使用子查询


  • insert语句中使用子查询
mysql> create table rom414  like xs;
Query OK, 0 rows affected (0.03 sec)
mysql> insert into rom414 select * from xs limit 20,4;
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0
mysql> select * from rom414;
+--------+--------+--------+------+------------+--------+------+
| 学号   | 姓名   | 专业名 | 性别 | 出生日期   | 总学分 | 备注 |
+--------+--------+--------+------+------------+--------+------+
| 200308 | 郑明鑫 | NULL   | 男   | 2003-04-05 |   NULL | NULL |
| 200326 | 唐辉阳 | NULL   | 男   | 2003-02-06 |   NULL | NULL |
| 200327 | 徐斌   | NULL   | 男   | 2003-03-05 |   NULL | NULL |
| 200336 | 李昌城 | NULL   | 男   | 2003-06-03 |   NULL | NULL |
+--------+--------+--------+------+------------+--------+------+
4 rows in set (0.00 sec)
  • update语句中使用子查询
#在成绩表中把学C语言的学生成绩全部加5
mysql> update cj set 成绩=成绩+5 where 课程号 = (select 课程号 from kc where 课程名 = 'c语言');
Query OK, 10 rows affected (0.01 sec)
Rows matched: 10  Changed: 10  Warnings: 0
#根据生日求年龄并写入到表格
update 信息管理学生表 set 年龄 = year(now())-year(出生日期);
  • 在delete语句中使用子查询
#在成绩表中删除张飞c语言的成绩
mysql> delete from cj where 学号 = (select 学号 from xs where 姓名='张飞') && 课程号 = (select 课程号 from kc where 课程名 = 'c语言');
Query OK, 1 row affected, 1 warning (0.01 sec)

排序

#查询kc表,以学分为升序排序
mysql> select * from kc order by 学分 asc;  //默认是升序
+--------+--------------+----------+------+
| 课程号 | 课程名       | 开课学期 | 学分 |
+--------+--------------+----------+------+
| 302    | 软件工程     |        7 |    2 |
| 101    | 计算机基础   |        1 |    3 |
| 102    | c语言        |        1 |    3 |
| 206    | 高等数学     |        3 |    3 |
| 209    | 操作系统     |        6 |    3 |
| 210    | 计算机组装   |        4 |    4 |
| 301    | 计算机网络   |        1 |    4 |
| 212    | ORACLE数据库 |        2 |    5 |
| 208    | 数据结构     |        5 |    6 |
+--------+--------------+----------+------+
9 rows in set (0.00 sec)
#查询kc表,以学分为降序排序
mysql> select * from kc order by 学分 desc;
+--------+--------------+----------+------+
| 课程号 | 课程名       | 开课学期 | 学分 |
+--------+--------------+----------+------+
| 208    | 数据结构     |        5 |    6 |
| 212    | ORACLE数据库 |        2 |    5 |
| 210    | 计算机组装   |        4 |    4 |
| 301    | 计算机网络   |        1 |    4 |
| 101    | 计算机基础   |        1 |    3 |
| 102    | c语言        |        1 |    3 |
| 206    | 高等数学     |        3 |    3 |
| 209    | 操作系统     |        6 |    3 |
| 302    | 软件工程     |        7 |    2 |
+--------+--------------+----------+------+
9 rows in set (0.00 sec)
#多个字段排序
要求查询课程名和学分,学分按升序排序,如果学分相同,就按课程名以升序排序
mysql> select 课程名,学分 from kc order by 学分,课程名;
+--------------+------+
| 课程名       | 学分 |
+--------------+------+
| 软件工程     |    2 |
| c语言        |    3 |
| 操作系统     |    3 |
| 计算机基础   |    3 |
| 高等数学     |    3 |
| 计算机组装   |    4 |
| 计算机网络   |    4 |
| ORACLE数据库 |    5 |
| 数据结构     |    6 |
+--------------+------+
9 rows in set (0.00 sec)
mysql> select 课程名,学分 from kc order by 2;//这里的2表示第二列,不建议这样写
+--------------+------+
| 课程名       | 学分 |
+--------------+------+
| 软件工程     |    2 |
| 计算机基础   |    3 |
| c语言        |    3 |
| 高等数学     |    3 |
| 操作系统     |    3 |
| 计算机组装   |    4 |
| 计算机网络   |    4 |
| ORACLE数据库 |    5 |
| 数据结构     |    6 |
+--------------+------+
9 rows in set (0.00 sec)
#找出学分在3到5之间的数据按学分降序进行排列
mysql> select * from kc where 学分 between 3 and 5 order by 学分 desc;
+--------+--------------+----------+------+
| 课程号 | 课程名       | 开课学期 | 学分 |
+--------+--------------+----------+------+
| 212    | ORACLE数据库 |        2 |    5 |
| 210    | 计算机组装   |        4 |    4 |
| 301    | 计算机网络   |        1 |    4 |
| 101    | 计算机基础   |        1 |    3 |
| 102    | c语言        |        1 |    3 |
| 206    | 高等数学     |        3 |    3 |
| 209    | 操作系统     |        6 |    3 |
+--------+--------------+----------+------+
7 rows in set (0.00 sec)

显示当前使用数据库

mysql> select database();
+------------+
| database() |
+------------+
| cjgl1      |
+------------+
1 row in set (0.00 sec)

语句执行顺序:


第一步:from


第二步:where


第三步:group by


第四步:select


第五步:order by(排序总是最后执行)


desc 表名

#不查看表中的数据,只查看结构
mysql> desc kc;
+----------+------------------+------+-----+---------+-------+
| Field    | Type             | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+-------+
| 课程号   | char(3)          | NO   | PRI | NULL    |       |
| 课程名   | varchar(20)      | NO   | UNI | NULL    |       |
| 开课学期 | tinyint unsigned | NO   |     | 1       |       |
| 学分     | tinyint unsigned | YES  |     | NULL    |       |
+----------+------------------+------+-----+---------+-------+
4 rows in set (0.01 sec)


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6天前
|
SQL 数据库 数据安全/隐私保护
数据库数据恢复——sql server数据库被加密的数据恢复案例
SQL server数据库数据故障: SQL server数据库被加密,无法使用。 数据库MDF、LDF、log日志文件名字被篡改。 数据库备份被加密,文件名字被篡改。
|
24天前
|
关系型数据库 MySQL Java
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
|
29天前
|
关系型数据库 MySQL 数据库连接
docker拉取MySQL后数据库连接失败解决方案
通过以上方法,可以解决Docker中拉取MySQL镜像后数据库连接失败的常见问题。关键步骤包括确保容器正确启动、配置正确的环境变量、合理设置网络和权限,以及检查主机防火墙设置等。通过逐步排查,可以快速定位并解决连接问题,确保MySQL服务的正常使用。
245 82
|
20天前
|
SQL 数据库连接 Linux
数据库编程:在PHP环境下使用SQL Server的方法。
看看你吧,就像一个调皮的小丑鱼在一片广阔的数据库海洋中游弋,一路上吞下大小数据如同海中的珍珠。不管有多少难关,只要记住这个流程,剩下的就只是探索未知的乐趣,沉浸在这个充满挑战的数据库海洋中。
39 16
|
23天前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
1月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】如何将mysql含有group by的SQL转换成崖山支持的SQL
本文探讨了在YashanDB(崖山数据库)中执行某些SQL语句时出现的报错问题,对比了MySQL的成功执行结果。问题源于SQL-92标准对非聚合列的严格限制,要求这些列必须出现在GROUP BY子句中,而SQL:1999及更高版本允许非聚合列直接出现在选择列中。YashanDB和Oracle遵循SQL-92标准,因此会报错。文章提供了两种解决方法:使用聚合函数处理非聚合列,或将GROUP BY与ORDER BY拆分为两层查询。最后总结指出,SQL-92标准更为严谨合理,建议开发者遵循此规范以避免潜在问题。
|
1月前
|
消息中间件 缓存 NoSQL
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
|
1月前
|
SQL 关系型数据库 MySQL
MySQL生产环境迁移至YashanDB数据库深度体验
这篇文章是作者将 MySQL 生产环境迁移至 YashanDB 数据库的深度体验。介绍了 YashanDB 迁移平台 YMP 的产品相关信息、安装步骤、迁移中遇到的各种兼容问题及解决方案,最后总结了迁移体验,包括工具部署和操作特点,也指出功能有优化空间及暂不支持的部分,期待其不断优化。
|
2月前
|
关系型数据库 MySQL 网络安全
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
176 25
|
2月前
|
SQL 关系型数据库 MySQL
基于SQL Server / MySQL进行百万条数据过滤优化方案
对百万级别数据进行高效过滤查询,需要综合使用索引、查询优化、表分区、统计信息和视图等技术手段。通过合理的数据库设计和查询优化,可以显著提升查询性能,确保系统的高效稳定运行。
76 9

热门文章

最新文章

推荐镜像

更多