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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 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
目录
相关文章
|
1天前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
25 6
|
7天前
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
98 11
|
27天前
|
SQL 存储 关系型数据库
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
本文详细介绍了MySQL中的SQL语法,包括数据定义(DDL)、数据操作(DML)、数据查询(DQL)和数据控制(DCL)四个主要部分。内容涵盖了创建、修改和删除数据库、表以及表字段的操作,以及通过图形化工具DataGrip进行数据库管理和查询。此外,还讲解了数据的增、删、改、查操作,以及查询语句的条件、聚合函数、分组、排序和分页等知识点。
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
|
1月前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
69 11
|
28天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
56 3
|
28天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
66 3
|
28天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE &#39;log_%&#39;;`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
86 2
|
1月前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
263 15
|
1月前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。
|
1月前
|
存储 关系型数据库 MySQL
double ,FLOAT还是double(m,n)--深入解析MySQL数据库中双精度浮点数的使用
本文探讨了在MySQL中使用`float`和`double`时指定精度和刻度的影响。对于`float`,指定精度会影响存储大小:0-23位使用4字节单精度存储,24-53位使用8字节双精度存储。而对于`double`,指定精度和刻度对存储空间没有影响,但可以限制数值的输入范围,提高数据的规范性和业务意义。从性能角度看,`float`和`double`的区别不大,但在存储空间和数据输入方面,指定精度和刻度有助于优化和约束。
172 5

热门文章

最新文章

推荐镜像

更多