MySQL第三章 SQL语句介绍
第三章 SQL语句
3.1 SQL历史和标准
- 1946 年,世界上第一台电脑诞生,如今,借由这台电脑发展起来的互联网已经自成江湖。在这几十年里,无数的技术、产业在这片江湖里沉浮,有的方兴未艾,有的已经几幕兴衰。但在这片浩荡的波动里,有一门技术从未消失,甚至“老当益壮”,那就是 SQL。
- 45 年前,也就是 1974 年,IBM 研究员发布了一篇揭开数据库技术的论文《SEQUEL:一门结构化的英语查询语言》,直到今天这门结构化的查询语言并没有太大的变化,相比于其他语言, SQL 的半衰期可以说是非常长了。
- 不论是前端工程师,还是后端算法工程师,都一定会和数据打交道,都需要了解如何又快又准确地提取自己想要的数据。更别提数据分析师了,他们的工作就是和数据打交道,整理不同的报告,以便指导业务决策。
- SQL(Structured Query Language,结构化查询语言)是使用关系模型的数据库应用语言, 与数据直接打交道,由IBM 上世纪70年代开发出来。后由美国国家标准局(ANSI)开始着手制定SQL标准,先后有SQL-86 , SQL-89 , SQL-92 , SQL-99 等标准。
- SQL 有两个重要的标准,分别是
SQL92
和SQL99
,它们分别代表了 92 年和 99 年颁布的 SQL 标准,我们今天使用的 SQL 语言依然遵循这些标准。 - 不同的数据库生产厂商都支持SQL语句,但都有特有内容。
- SQL是一门AINSI的标准计算机语言,用来访问和操作数据库系统。
- SQL语句用于取回和更新数据库中的数据。SQL可与数据库程序协同工作,比如MS Access、DB2、Informix、MS sQL Server.Oracle、Sybase 以及其他数强库系统。
- 不幸地是,存在若很多不同版本的SQL 语言,但是为了与ANSI标准相兼容。,它们必须以相似的方式共同地来支持一些主要的关键词〔比如SELECT、UPDATE、DELETE、INSERT、WHERE等等)。
- 注释:除了SQL标准之外,大部分SQL 数据库程序都拥有它们自己的私有扩展I
在正式开始讲连接表的种类时,我们首先需要知道 SQL 存在不同版本的标准规范,因为不同规范下的表连接操作是有区别的。
SQL 有两个主要的标准,分别是 SQL92
和 SQL99
。92 和 99 代表了标准提出的时间,SQL92 就是 92 年提出的标准规范。当然除了 SQL92 和 SQL99 以外,还存在 SQL-86、SQL-89、SQL:2003、SQL:2008、SQL:2011 和 SQL:2016 等其他的标准。
这么多标准,到底该学习哪个呢?实际上最重要的 SQL 标准就是 SQL92 和 SQL99。
- 一般来说 SQL92 的形式更简单,但是写的 SQL 语句会比较长,可读性较差。
- 而 SQL99 相比于 SQL92 来说,语法更加复杂,但可读性更强。
我们从这两个标准发布的页数也能看出,SQL92 的标准有 500 页,而 SQL99 标准超过了 1000 页。实际上从 SQL99 之后,很少有人能掌握所有内容,因为确实太多了。就好比我们使用 Windows、Linux 和 Office 的时候,很少有人能掌握全部内容一样。我们只需要掌握一些核心的功能,满足日常工作的需求即可。
- SQL92 和 SQL99 是经典的 SQL 标准,也分别叫做 SQL-2 和 SQL-3 标准。也正是在这两个标准发布之后,SQL 影响力越来越大,甚至超越了数据库领域。
- 现如今 SQL 已经不仅仅是数据库领域的主流语言,还是信息领域中信息处理的主流语言。在图形检索、图像检索以及语音检索中都能看到 SQL 语言的使用。
3.2 SQL语言排行榜
自从 SQL 加入了 TIOBE 编程语言排行榜,就一直保持在 Top 10。
3.3 SQL分类
SQL语言在功能上主要分为如下3大类:
SQL类型 | 全称 | 说明 | 主要关键词 |
---|---|---|---|
DDL | Data Definition Languages、数据定义语言 | 这些语句定义了不同的数据库、表、视图、索引等数据库对象,还可以用来创建、删除、修改数据库和数据表的结构。 | CREATE 、DROP 、ALTER、RENAME、TRUNCATE |
DML | Data Manipulation Language、数据操作语言 | 用于添加、删除、更新和查询数据库记录,并检查数据完整性。 | INSERT 、DELETE 、UPDATE 、SELECT |
DCL | Data Control Language、数据控制语言 | 用于定义数据库、表、字段、用户的访问权限和安全级别。 | GRANT 、REVOKE 、COMMIT 、ROLLBACK 、SAVEPOINT |
- 因为查询语句使用的非常的频繁,所以很多人把查询语句单拎出来一类:DQL(数据查询语言)。
- 还有单独将COMMIT 、ROLLBACK 取出来称为TCL (Transaction Control Language,事务控制语言)。
3.4 SQL的规则与规范
3.4.1 SQL规则
SQL是必须要遵守的语法
- SQL 可以写在一行或者多行。为了提高可读性,各子句分行写,必要时使用缩进
- 每条命令以
;
或\g
或\G
结束
两种的结果是不一样的,\G结果是竖着呈现的
mysql> show create table db1;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table
|
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------+
| db1 | CREATE TABLE `db1` (
`id` int DEFAULT NULL,
`name` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> show create table db1\G
*************************** 1. row ***************************
Table: db1
Create Table: CREATE TABLE `db1` (
`id` int DEFAULT NULL,
`name` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
-
关键字不能被缩写也不能分行
-
关于标点符号:
- 必须保证所有的()、单引号、双引号是成对结束的
- 必须使用英文状态下的半角输入方式
字符串型
和日期时间类型
的数据可以使用单引号(' ')表示列的别名
,尽量使用双引号(" ")
,特别是别名中有空格的时候,而且不建议省略as
select id as "编号", `name` as "姓名" from t_stu; #起别名时,as都可以省略
select id as 编号, `name` as 姓名 from t_stu; #如果字段别名中没有空格,那么可以省略""
select id as 编 号, `name` as 姓 名 from t_stu; #错误,如果字段别名中有空格,那么不能省略""
3.4.2 SQL规范
规范是约定俗称的书写标注
(1) 大小写规范
- MySQL 在 Windows 环境下是大小写不敏感的(就是数据库或者关键字等都忽略大小写)
#以下两句是一样的,不区分大小写
show databases;
SHOW DATABASES;
- MySQL 在 Linux 环境下是大小写敏感的
- 数据库名、表名、表的别名、变量名是严格区分大小写的
- 关键字、函数名、列名(或字段名)、列的别名(字段的别名) 是忽略大小写的。
- 推荐采用统一的书写规范:
- 数据库名、表名、表别名、字段名、字段别名等都小写
- SQL 关键字、函数名、绑定变量等都大写
但是这些规则都不适用于字符串,对于字符串:
- 由于Mysql的不严谨性,字符串不区分大小写
# 下面两个在mysql中相同
select * from tb1 where name = 'MiKe';
select * from tb1 where name = 'mike';
- 但是在Oracle中就严格区分
(2) 注释
可以使用如下格式的注释结构
单行注释:#注释文字(MySQL特有的方式)
单行注释:-- 注释文字(--后面必须包含一个空格。)
多行注释:/* 注释文字 */
(3) 命名规则
- 数据库、表名不得超过30个字符,变量名限制为29个
- 必须只能包含 A–Z, a–z, 0–9, _共63个字符
- 数据库名、表名、字段名等对象名中间不要包含空格
- 同一个MySQL软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名
- 必须保证你的字段没有和保留字、数据库系统或常用方法冲突。如果坚持使用,请在SQL语句中使用`(着重号)引起来
- 保持字段名和类型的一致性,在命名字段并为其指定数据类型的时候一定要保证一致性:在命名字段并为其指定数据类型的时候一定要保证一致性,假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了
Mysql命名规范
-
【
强制
】表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。- 正例:aliyun_admin,rdc_config,level3_name
- 反例:AliyunAdmin,rdcConfig,level_3_name
-
【
强制
】禁用保留字,如 desc、range、match、delayed 等,请参考 MySQL 官方保留字。 -
【
强制
】表必备三字段:id, gmt_create, gmt_modified。- 说明:其中 id 必为主键,类型为BIGINT UNSIGNED、单表时自增、步长为 1。gmt_create, gmt_modified 的类型均为 DATETIME 类型,前者现在时表示主动式创建,后者过去分词表示被动式更新
-
【
推荐
】表的命名最好是遵循 “业务名称_表的作用”。- 正例:alipay_task 、 force_project、 trade_config
-
【
推荐
】库名与应用名称尽量一致。 -
【参考】合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度。
- 正例:无符号值可以避免误存负数,且扩大了表示范围。
3.5 数据导入指令
在命令行客户端(不是图形化界面)登录mysql,使用source指令导入
mysql> source d:\mysqldb.sql # source只能在命令行中调用
也可以在图形化的界面中执行SQL脚本