😌 MySQL-03-结构化查询语言(SQL)
😌 MySQL-03-结构化查询语言(SQL)
1 开篇介绍
👋 Hello 大家好,我是 Nagase ,MySQL 从删库到跑路 ,又到了学习 MySQL 的时刻,接下来就让我们感受一下 MySQL 独特的魅力吧。
在该篇博客中,我们主要介绍 结构化查询语言(Structured Query Language, SQL) 相关的内容。祝你学的开心 🥳 。
2 什么是 SQL
结构化查询语言(Structured Query Language, SQL),SQL 的全称为:结构化查询语言,是一种用来操作 关系型数据库 的语言,是一种特殊的编程语言。
著名的大型商用数据库 Oracle、DB2、Sybase、SQL Server,开源的数据库 PostgreSQL、MySQL,甚至一些小型的数据库 Access 等都支持 SQL。
近些年蓬勃发展的 NoSQL 系统最初是宣称不再需要 SQL 的,后来也不得不修正为 Not Only SQL,来拥抱 SQL。
3 SQL 的由来
在 MySQL 的架构中,我们知道了 MySQL 有多个客户端,都想要与某一个服务端通信。但是它们的语言不同呀,为什么都可以与服务端进行通信,如此完美的解决了语言沟通的障碍,它们如何做到的 🥺 ,此乃实名羡慕哇 😺 。
- 解决方案一:让服务端精通所有的语言
- 不建议 使用这种方式,成本太大了,它就类似于 一个人精通多国语言 。
- 解决方案二:采用 统一 的语言
- 只要使用统一的语言就一定可以通信,那么这个统一的语言是什么呢?它就是 SQL 。
4 SQL 的特点
- 一体化:SQL 集数据定义、数据操作和数据控制于一体,可以完成数据库中的全部工作。
- 使用方式灵活:SQL 具有两种使用方式,可以直接以命令方式交互使用;也可以嵌入使用,嵌入C、C++、Python、Java 等语言中使用。
- 非过程化:只提操作要求,不必描述操作步骤,也不需要导航。使用时只需要告诉计算机 做什么 ,而不需要告诉它 怎么做 ,存储路径的选择和操作的执行由数据库管理系统自动完成。
- 语言简洁:该语言的语句都是由描述性很强的英语单词组成,而且这些单词的数目不多。
5 SQL 的分类
5.1 数据定义
Data Definition Language, DDL:数据定义语言,用来创建或删除数据库以及表等对象等,主要包含以下几种命令:
- DROP:删除数据库和表等对象
- CREATE:创建数据库和表等对象
- ALTER:修改数据库和表等对象的 结构
5.2 数据查询
Data Query Language, DQL:数据查询语言,用来查询表中的记录,主要包含以下命令:
- SELECT:查询表中的数据
5.3 数据操作
Data Manipulation Language, DML:数据操作语言,用来变更表中的数据,主要包含以下几种命令:
- INSERT:向表中插入新数据
- UPDATE:更新表中的数据
- DELETE:删除表中的数据
5.4 数据控制
Data Control Language, DCL:数据控制语言,用来确认或者取消对数据库中的数据进行的变更,除此之外,还可以对数据库中的用户设定权限。主要包含以下几种命令:
- GRANT:赋予用户操作权限
- REVOKE:取消用户操作权限
5.5 事务控制
Transaction Control Language, TCL:事务控制语言,确保被DML语句影响的表的所有行及时得以更新,主要包含以下几种命令:
- START TRANSACTION:创建事务
- SAVEPOINT:保存节点
- COMMIT:确认对数据库中的数据进行的变更
- ROLLBACK:取消对数据库中的数据进行的变更
5.6 指针控制
CCL:指针控制语言,规定了 SQL 语句在程序中的使用规则,主要包含以下几种命令:
- DECLARE CURSOR:声明游标
- FETCH INTO:进入
- UPDATE WHERE CURRENT:更新当前位置
5.7 SQL 语句概览
-- 1、操作数据库(操作文件夹)
CREATE DATABASE `db2` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 增
SHOW DATABASES; -- 查
ALTER DATABASE `db2` CHARACTER SET utf8; -- 改
DROP DATABASE `db2`; -- 删除
-- 2、操作表(操作文件)
USE db2; -- 先切换到文件夹下
CREATE TABLE `t1`(`id` INT AUTO_INCREMENT, `name` VARCHAR(255), PRIMARY KEY (`id`)) ENGINE=Innodb CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- 增
SHOW TABLES; -- 查
ALTER TABLE `t1` CHANGE `name` `user_name` char(4); -- 改字段名
ALTER TABLE `t1` MODIFY `user_name` VARCHAR(255); -- 改字段类型
DROP TABLE `t1`; -- 删
-- 3、操作数据记录(操作文件中的内容)
INSERT INTO `t2` VALUES (1, 'zhangsan'), (2, 'lisi'), (3, 'wangwu'); -- 增
SELECT * FROM `t2`; -- 查
UPDATE `t2` SET `name` = 'LMY' WHERE id = 1; -- 改
DELETE FROM `t2` WHERE id = 2; -- 删
-- 4、清空表
DELETE FROM `t2`; -- 如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。
TRUNCATE TABLE `t2`; -- 数据量大,删除速度比上一条快,且直接从零开始
6 SQL 语法规则
SQL 是结构化查询语言,既然是一门语言,那么就拥有自己的语法规则,那么接下来我们来看一下 SQL 的语法规则。
6.1 SQL 注释
每一种语言都有自己的注释方式,代码量越多,代码注释的重要性也就越明显。一般情况下,注释可以出现在程序中的任何位置,用来向用户或程序员提示或者解释程序的功能及作用。
SQL 中的注释分为 单行注释 和 多行注释。
6.1.1 单行注释
- 单行注释使用
#
注释符,注释符后直接加注释内容,格式如下:
SHOW DATABASES; # 显示所有的数据库
- 也可以使用
--
注释符,格式如下(注意空格!!!):
SHOW DATABASES; -- 显示所有的数据库
6.1.2 多行注释
多行注释使用 /* ... */
注释符,格式如下:
/*
第一行注释
第二行注释
*/
SHOW DATABASES;
注释能够帮助阅读者更好地理解 SQL 语句,特别是在使用复杂的 SQL 语句时,所以大家应该尽量多添加一些简明易懂的注释。
6.2 SQL 语句要以分号 ; 结尾
在关系型数据库中,SQL 语句是逐条执行的,一条 SQL 语句代表着对数据库的一个操作。我们通常在 SQL 语句的结尾加上一个英文的 ;
代表该语句结束了。
特例:
\s
、 \G
、 \c
这几个命令的后面不加分号 ;
exit
、 quit
命令的后面可以加也可以不加分号 ;
6.3 常数的书写方式是固定的
我们在向表中插入数据的时候,通常会插入字符串、日期或者数字等数据。这些数据我们称之为 常数 。其书写方式是固定的:
- 如果是字符串数据,使用 'LMY' 英文单引号括起来
- 如果是数字,直接书写即可
- 如果是日期,使用 '2021-02-02' 英文单引号括起来
注意⚠️:数据库名、表名、字段名 不是字符串 ,使用 `` 反引号引起来,千万不要用 '' 单引号,而是反引号!!!
6.4 单词需要使用半角空格或者换行来分隔
SQL 语句的单词之间必须使用半角空格(英文空格)或换行符来进行分隔。没有分隔的语句会发生错误,无法正常执行。
下面是分隔和未分隔的 SQL 语句:
CREATE TABLE Product
(正确)CREATETABLE Product
(错误)CREATE TABLEProduct
(错误)
不能使用 全角空格(中文空格) 作为单词的分隔符,否则会发生错误,出现无法预期的结果。
SQL 语句中的标点符号必须都是 英文状态 下的,即 半角字 。
6.5 SQL 语句的大小写规则
SQL 语句的大小写规则与语句组成元素、引用内容和服务器所使用的操作系统有关。
6.5.1 SQL 关键字和函数名
SQL 的关键字和函数名不区分大小写。例如,下面这些语句都是等价的:
SELECT NOW();
select now();
6.5.2 数据库名、表名、视图名
MySQL 用服务器主机的底层文件系统所包含的目录和文件来表示数据库和表。因此,数据库名和表名的默认大小写取决于服务器主机的操作系统在命名方面的规定,比如说:
-
Windows 系统的文件名不区分大小写,所以运行在 Windows 系统上面的 MySQL 服务器也 不区分 数据库名和表名的大小写。
-
Linux 系统的文件名区分大小写,所以运行在 Linux 系统上的 MySQL 服务器需要 区分 数据库名和表名的大小写
-
macOS 平台,虽然 macOS 的根是 UNIX ,但是 macOS 比较特殊,因此 不区分大小写 。
MySQL 会使用一个文件来表示一个视图,所以以上与表有关的也同样适用于视图。
视图本质上是一种虚拟表,在物理上是不存在的,其内容与真实的表相似,包含一系列带有名称的列和行数据。但是,视图并不在数据库中以储存的数据值形式存在。行和列数据来自定义视图的查询所引用基本表,并且在具体引用视图时动态生成。
6.5.3 存储程序的名字
存储函数、存储过程和事件的名字都不区分大小写。触发器的名字要区分大小写,这一点与标准 SQL 的行为有所不同。
6.5.4 字段名
在 MySQL 里,字段名不区分大小写。例如,下面这些语句都是等价的:
SELECT name FROM student;
SELECT NAME FROM student;
6.5.5 别名
默认情况下,表的别名要区分大小写。SQL 语句中可以使用任意的大小写(大写、小写或大小写混用)来指定一个别名。如果需要在同一条语句里多次用到同一个别名,则必须让它们的大小写保持一致。
下表总结了 SQL 元素在 Windows 和 Linux 系统是否区分大小写。
Windows | Linux | |
---|---|---|
数据库名 | 否(忽略大小写) | 是 |
表名 | 否(忽略大小写) | 是 |
表别名 | 否(忽略大小写) | 是 |
字段名 | 否(忽略大小写) | 否(忽略大小写) |
字段别名 | 否(忽略大小写) | 否(忽略大小写) |
变量名 | 否(忽略大小写) | 是 |
在 Linux 服务器下创建数据库和表时,应该认真考虑大小写的问题,比如它们以后是否会迁移到 Windows 服务器上。
假设你在 Linux 服务器上创建了 abc 和 ABC 两个表,当把这两个表迁移到 Windows 服务器上时,就会出现问题;因为 Windows 系统并不区分大小写,abc 和 ABC 无差别。
想要避免大小写问题,可以先选定一种大小写方案,然后一直按照该方案去创建数据库和表。
在阿里巴巴 Java 开发手册的 MySQL 建表规约里提到:
【强制】表名、字段名 必须使用小写字母或数字 ,禁止出现数字开头 ,禁止两个下划线中间只出现数字。
数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。
通俗的说就是,MySQL 在 Windows 系统下不区分大小写,但在 Linux 系统下默认区分大小写。因此,数据库名、表名和字段名,都不允许出现任何大写字母,避免节外生枝。
一般建议统一使用小写字母,并且 InnoDB 引擎在其内部都是以小写字母方式来存储数据库名和表名的。这样可以有效的防止 MySQL 产生大小写问题。