MySQL第三章 SQL语句介绍

第三章 SQL语句

3.1 SQL历史和标准

  1. 1946 年,世界上第一台电脑诞生,如今,借由这台电脑发展起来的互联网已经自成江湖。在这几十年里,无数的技术、产业在这片江湖里沉浮,有的方兴未艾,有的已经几幕兴衰。但在这片浩荡的波动里,有一门技术从未消失,甚至“老当益壮”,那就是 SQL。
  2. 45 年前,也就是 1974 年,IBM 研究员发布了一篇揭开数据库技术的论文《SEQUEL:一门结构化的英语查询语言》,直到今天这门结构化的查询语言并没有太大的变化,相比于其他语言, SQL 的半衰期可以说是非常长了。
  3. 不论是前端工程师,还是后端算法工程师,都一定会和数据打交道,都需要了解如何又快又准确地提取自己想要的数据。更别提数据分析师了,他们的工作就是和数据打交道,整理不同的报告,以便指导业务决策。
  4. SQL(Structured Query Language,结构化查询语言)是使用关系模型的数据库应用语言, 与数据直接打交道,由IBM 上世纪70年代开发出来。后由美国国家标准局(ANSI)开始着手制定SQL标准,先后有SQL-86 , SQL-89 , SQL-92 , SQL-99 等标准。
  5. SQL 有两个重要的标准,分别是 SQL92SQL99,它们分别代表了 92 年和 99 年颁布的 SQL 标准,我们今天使用的 SQL 语言依然遵循这些标准。
  6. 不同的数据库生产厂商都支持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 有两个主要的标准,分别是 SQL92SQL99。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。

image-20230905102031286

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是必须要遵守的语法

  1. SQL 可以写在一行或者多行。为了提高可读性,各子句分行写,必要时使用缩进
  2. 每条命令以 ;\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)
  1. 关键字不能被缩写也不能分行

  2. 关于标点符号:

    • 必须保证所有的()、单引号、双引号是成对结束的
    • 必须使用英文状态下的半角输入方式
    • 字符串型日期时间类型的数据可以使用单引号(' ')表示
    • 列的别名尽量使用双引号(" "),特别是别名中有空格的时候,而且不建议省略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) 大小写规范

  1. MySQL 在 Windows 环境下是大小写不敏感的(就是数据库或者关键字等都忽略大小写)
#以下两句是一样的,不区分大小写
show databases;
SHOW DATABASES;
  1. MySQL 在 Linux 环境下是大小写敏感的
    • 数据库名、表名、表的别名、变量名是严格区分大小写的
    • 关键字、函数名、列名(或字段名)、列的别名(字段的别名) 是忽略大小写的。
  2. 推荐采用统一的书写规范:
    • 数据库名、表名、表别名、字段名、字段别名等都小写
    • SQL 关键字、函数名、绑定变量等都大写

但是这些规则都不适用于字符串,对于字符串:

  • 由于Mysql的不严谨性,字符串不区分大小写
# 下面两个在mysql中相同
select * from tb1 where name = 'MiKe';
select * from tb1 where name = 'mike';
  • 但是在Oracle中就严格区分

(2) 注释

可以使用如下格式的注释结构

单行注释:#注释文字(MySQL特有的方式)
单行注释:-- 注释文字(--后面必须包含一个空格。)
多行注释:/* 注释文字 */

(3) 命名规则

  1. 数据库、表名不得超过30个字符,变量名限制为29个
  2. 必须只能包含 A–Z, a–z, 0–9, _共63个字符
  3. 数据库名、表名、字段名等对象名中间不要包含空格
  4. 同一个MySQL软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名
  5. 必须保证你的字段没有和保留字、数据库系统或常用方法冲突。如果坚持使用,请在SQL语句中使用`(着重号)引起来
  6. 保持字段名和类型的一致性,在命名字段并为其指定数据类型的时候一定要保证一致性:在命名字段并为其指定数据类型的时候一定要保证一致性,假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了

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脚本

image-20230905105458182

posted @ 2023-09-17 19:15  Crispy·Candy  阅读(14)  评论(0编辑  收藏  举报