SQL概述
# 45.SQL概述
之前我们已经用了一些SQL(例如数据库的创建,删除)
接下来我们就要讲表的管理了,在此之前先说一下SQL的基本书写规则。
# 什么是SQL
SQL是为操作数据库而开发的语言。可以用来查询数据、插入和删除数据。
国际标准化组织(ISO)为 SQL 制定了相应的标准,以此为基准的SQL 称为标准 SQL。在该标准出来之前,各个DBMS各自为政,对于同一个功能,可能写法不同。
即使目前标准出来了,之前的历史遗留问题也还存在,所以有时候一个SQL能在Oracle上执行,但是在MySQL上执行不了(因为有语法差异)
打个比方:如果一个数据库使用create 作为创建数据库的单词,而另一个数据库使用的是add这个单词。这就是标准不统一造成的。那么两者之间就不能使用同一个SQL进行操作数据库。
扩展:标准SQL和特定SQL
每隔几年,ANSI(美国国家标准协会)或ISO(国际标准化组织)等便会修订 SQL 的标准,进行语法的修订并追加新功能。
1986 年,ANSI 首次制定了 SQL 的标准,之后又进行了数次修订。修订后的标准以修订年份来命名,例如 SQL:1999、SQL:2003、SQL:2008 等。以这些标准为基准的 SQL 就是标准 SQL。
但是,SQL 的标准并不强制“每种 RDBMS 都必须使用”。虽然支持标准 SQL 的 RDBMS 越来越多,但还是存在标准 SQL 无法执行的情况。这时就需要使用只能在特定 RDBMS 中使用的特殊 SQL 语句。
其实,这也是没有办法的事情,起初(大约在 20 世纪 80 年代到 90 年代),标准 SQL 能够实现的功能非常有限,无法完全满足实际需要。RDBMS 的供应商为了弥补这些不足,不得不再单独追加所需要的功能。
尽管如此,这些特定的 SQL 所带来的并不都是负面的影响。标准 SQL 将一些独特的功能收录其中,对其自身的发展起到了积极的推进作用。过去,各个供应商为了展现本公司的优势和独特性,也曾不遗余力地开发各自特定的 SQL。目前的标准 SQL 经过多次修订,功能已经十分完善。准备学习 SQL 的读者们,就让我们先从牢记标准 SQL 的书写方法开始吧。
# SQL的分类
SQL 用关键字、数据库名、表名、列名等组合而成的一条语句(SQL 语句)来描述操作的内容。
关键字是指那些含义或使用方法已事先定义好的英语单词(例如创建数据库用 create database 这两个单词,后面再跟上要创建的数据库名)
根据操作的内容,SQL 语句可以分为以下三类:
- DDL(Data Definition Language,数据定义语言) 用来创建或者删除存储数据用的数据库以及数据库中的表等对象。例如之前说过的创建数据库、删除数据库等就是DDL
- DML(Data Manipulation Language,数据操纵语言) 用来查询或者变更表中的记录。例如对表进行查询,插入数据,修改数据库的SQL都是DML
- DCL(Data Control Language,数据控制语言) 用来确认或者取消对数据库中的数据进行的变更,以及权限的管理等(后续会讲)。
这个分类有个印象即可,不用背。实际使用的 SQL 中有 90% 属于 DML。
# SQL 的基本书写规则
书写 SQL 语句时必须要遵守一些规则。这些规则都非常简单:
- SQL 语句要以分号(; )结尾
- SQL 语句不区分大小写
- 常数的书写方式是固定的
- 单词需要用半角空格或者换行来分隔
我们逐条说明这些规则
# SQL 语句要以分号(; )结尾
一条 SQL 语句可以描述一个数据库操作。
在日常生活中,我们写东西的时候,在句尾总得加个标点符号表示结束,例如中文句子以句号(。)结尾,英文以点号(.)。而 SQL 语句则使用分号(; ) 结尾。
# SQL 语句不区分大小写
SQL不区分关键字的大小写 。例如,创建数据库不管写成 create 还是 CREATE 都是可以的。表名和列名也是如此。
# 常数的书写方式是固定的
SQL 语句常常需要直接书写字符串(一个以上的连续字符)、日期或者数字。如,书写向表中插入字符串、日期或者数字等数据的 SQL 语句。
在 SQL 语句中直接书写的字符串、日期或者数字等称为常数 。常数的书写方式:
- 字符串:需要使用单引号(') 将字符串括起来,用来标识这是一个字符串,例如'abc'。
- 日期的:也需要使用单引号将其括起来。日期的格式有很多种('26 Jan 2010' 或者 '10/01/26' 等),本书统一使用 '2010-01-26' 这种 '年 -月 - 日' 的格式。
- 数字的:不需要使用任何符号标识,直接写成 1000 这样的数字即可,无需加注单引号。
# 单词需要用半角空格或者换行来分隔
SQL 语句的单词之间需使用半角空格或换行符来进行分隔。如下这种未加分隔的语句会发生错误 ,无法正常执行。
× CREATETABLE Product
× CREATE TABLEProduct
但是不能使用全角空格作为单词的分隔符,否则会发生错误,出现无法预期的结果。
# 命名规则
在RDBMS中,对于数据库名,表名和列名的命名是有规则的,不能乱命名:
- 只能使用英文字母、数字、下划线(_)作为数据库、表和列的名称 。其他符号不能出现在名字中,例如-、$ 、# 、?。
- 名称必须以半角英文字母开头。
- 名字不能重复。不能创建两个名字相同的数据库,在同一个数据库中不能创建两个相同名称的表,在同一个表中也不能创建两个名称相同的列。
# 换行符
SQL 语句使用换行符或者半角空格来分隔单词,在任何位置进行分隔都可以,即使像下面这样通篇都是换行符也不会影响SQL语句的执行:
create
database
test2;;
2
3
但是这样可读性很差。一般来说一个关键字占一行即可。
注意,空行不能用来分隔,这样会导致错误:
create
database
test2;;
2
3
4