3.4 关系数据库标准SQL语言
3.4.1 SQL语言概述
1. SQL语言的发展
SQL(Structure Query Language结构化查询语言)是关系型数据库管理系统的标准语言或通用语言。
2. SQL语言特点和功能
SQL语言的主要特点是:
]一体化语言,它包括数据定义、数据操纵、数据查询和数据控制等方面的功能,可以完成数据库生命周期中的全部工作。
]高度非过程化语言,使用SQL语言访问数据库时,用户没有必要告诉计算机“如何”一步步地实现操作,只需要描述“做什么”。
]简洁语言,只有为数不多的命令完成强大的SQL语言功能,SQL语言设计巧妙,语言语法格式简单,接近于自然语言,容易学习和掌握。
]共享语言,它全面支持客户/服务器模式。
SQL语言按其功能分为四大部分:数据定义、数据操纵、数据查询和数据控制。其核心功能只用9个动词。
3.4.2 数据定义语句
MySQL语句的数据定义是指对数据库和基本表的基本操作。
1. 数据库的基本操作
MySQL语句对数据库的基本操作,包括对数据库的创建、打开、查看、修改和删除等操作。
(1)创建数据库
语句的基本格式:
CREATE {DATABASE|SCHEMA }[IF NOTEXISTS]数据库名
[[DEFAULT]CHARACTER SET 字符集名称
[DEFAULT]COLLATE 排序规则名称];
语句功能:创建数据库是指在数据库系统中划分一块空间,用来存储相应的数据。
说明:
]在语法基本格式中的描述符号:
{}:表示必选项 |:表示必选其一项 []:可选项
]CREATE DATABASE或CREATE SCHEMA:都是指创建数据库的关键字;此关键字不区分大小写,因为取决于当前Windows操作系统。
]数据库名是标识符。标识符是由字母、数字和下划线组成,用来命名对象名,如:数据库名、表名、列名和变量名。
]IF NOT EXISTS:判断指定的数据库名是否存在,如果不存在则执行此命令。
]如果MySQL软件安装时设置默认字符集为utf8,则在MySQL系统中将按此字符集使用,可以设置默认排序规则为utf8_general_ci。
]字符集名称:utf8(UTF-8 Unicode)是指Unicode字符的一种变长字符编码。英文使用8位(即一个字节)编码,中文使用24位(3个字节)编码,utf8包含全世界所有国家需要的字符,是国际编码,通用性强。也就是UTF8字符集支持所有国家的语言。
]排序规则名称:utf8_general_ci是指对utf8字符校对速度快(general)和不区分大小写(ci)。
(2)打开数据库
语句的基本格式:
USE 数据库名;
语句功能:如果对已经存在的数据库进行操作,则需要将此数据库设置为当前数据库,也就是打开数据库。
(3)显示数据库结构
语句的基本格式:
SHOW CREATE DATABASE 数据库名;
语句功能:对已经存在的数据库进行查看信息,例如MySQ版本id号、默认字符集等信息。
(4)修改数据库
语句的基本格式:
ALTER {DATABASE|SCHEMA }[IF NOTEXISTS]数据库名
[[DEFAULT]CHARACTER SET 字符集名称]
[[DEFAULT]COLLATE 排序规则名称];
语句功能:对已经存在的数据库进行修改参数。
(5)删除数据库
语句的基本格式:
DROP DATABASE[IF EXISTS]数据库名;
语句功能:对已经存在的数据库进行删除,数据库删除后,数据库中的所有数据和所有表也将删除,数据库原分配空间被释放。
2.数据类型
数据库创建之后,在数据库中就可以创建基本表。在创建基本表时,基本表中的每个列都有对应的数据类型,用来指定数据的存储方式、约束和有效范围。
MySQL数据库中常用的数据类型有五种,包括数值类型(包括整型类型、定点数类型和浮点数类型)、字符串类型、日期时间类型、复合类型和二进制类型。
(1)数值类型
数值类型的数据可以存储并进行算术运算的数值数据。如:16和-16.5,数值数据包含整数和小数,小数包含定点小数和浮点小数。
]整数类型:是数据库中最基本的数据类型。如int与integer两个整型类型是同名。
]小数类型:小数类型包含浮点数类型和定点数类型。
浮点数类型包括单精度浮点数float类型和双精度浮点数double类型;定点数类型为decimal类型。(2)字符串类型
字符串类型的数据可以存储字符或数字。如姓名和地址等文本数据;不需要计算的数字,如学号为(3)日期时间类型
日期/时间类型用于存储日期、时间或日期时间混合。MySQL内部的日期时间类型的数据可以进行简单加、减法运算。如表3-11。
(4)复合类型
MySQL数据库支持复合数据类型包括enum(枚举类型)和set(集合类型)。复合数据类型本质上是字符串类型。
enum类型数据只允许从集合中取得任意一个值,enum类型数据的集合中最多可以包含65535个元素。
set类型数据允许从集合中取得任意多个值,set类型数据的集合中最多可以包含64个元素。
(5)二进制类型。
MySQL数据库中的二进制类型主要有7种,各种二进制类型及存储长度范围如表3-12。二进制类型的数据主要用‘0’和‘1’两个数表示的字符串。其中bit数据类型的数据是按位为单位存储,其他二进制类型的数据是按字节为单位存储。
3.数据表的基本操作
数据定义是指对数据库中的表结构定义,其功能包括创建基本表、修改表和删除表的对表结构的基本操作。
(1)创建基本表
语句的基本格式:
CREATE TABLE 基本表名
(列名l 数据类型1 [ 列级完整性约束条件1 ],
列名2 数据类型2 [ 列级完整性约束条件2 ],
[…]
);
语句功能:在数据库中创建基本表结构。创建一个指定基本表名的数据表。每个列包含列名、数据类型和长度3个要素。分号表示一条SQL语句结束,可以没有。
说明:
]基本表名:指定基本表的新名字。
]列名:指定列的新名称。
]数据类型:指定列的数据类型。
]列级完整性约束条件:指定列的约束条件,包括主键约束(Primary Key)、外键约束(Reference)、唯一约束(Unique)、空值约束(Not Null或Null)和设置默认值(Default)等。
(2)修改表
语句基本格式:
ALTER TABLE 表名 [ALTER 列名 数据类型 ][ADD 新列名) 数据类型) [ 列级完整性约束条件1 ]]
[DROP 列名 …];
语句功能:在表中修改基本表的结构。包括修改列属性,增加新列和删除列。
说明:
]表名 :指定修改结构的表名。
]ALTER子句:指定修改列属性。
]ADD子句:指定增加新列和该列的列完整性约束条件。
]DROP子句:指定删除列名。
说明:ALTER TABLE语句一次可以添加多个列,删除多个列,但是不能一次修改多个列,也不能同时进行添加、修改和删除列操作。
(3)删除表
语句基本格式:
DROP TABLE 表名 ;
语句功能:从数据库中删除表,释放存储空间。
说明:表名 :指定删除的表名。
注意,删除表中的结构和记录数据全部,并且不能恢复。
3.4.3 数据操纵语句
MySQL语句的数据操纵是指对数据库中的表记录进行操作,其功能包括对基本表的插入记录、更新记录或删除记录的基本操作。
1.插入记录
语句基本格式:
INSERT INTO 表名[( 列名l [, 列名2 …])] VALUES(常量l [,常量2 ]…);
语句功能:在表中将一条新记录追加到指定表的最后一行。
说明:
]表名 :指定插入新记录的表名。
]列名 :指定插入新记录的列名。
]常量 :指定插入新记录的列值。其中常量的数据类型必须与INTO子句中所对应列名的数据类型相同、顺序一致、个数相同。
]如果插入的数据包括表中所有列,且顺序与表结构中列顺序一致,则可以省略INTO子句中的列名。
]插入所有列
]插入部分列
2.更新记录
语句基本格式:
UPDATE 表名
SET 列名1 = 表达式1 [,列名2 = 表达式2 …][WHERE 条件];
语句功能:对表中所有记录或满足条件的记录进行批量更新。
说明:
]表名 :指定更新记录的表名。
]列名 = 表达式 :用表达式的值替代对应列名的值。
]WHERE 条件 :在满足条件的记录中更新指定列值。省略WHERE子句,则更新全部记录。
]更新部分记录的指定列值
]更新一条记录的指定列值
3.删除记录
语句基本格式:
DELETE FROM 表名 [WHERE 条件];
语句功能:对表中所有记录或满足条件的记录进行批量删除。
说明:
]表名 :指定删除记录的表名。
]WHERE 条件 :删除满足条件的记录。省略WHERE子句,则删除全部记录。
]删除部分记录
]删除全部记录
3.4.4 数据查询语句
数据查询是MySQL语句的核心。MySQL语句提供了强大的、比较复杂的一个SELECT数据查询语句,可以有效地对一个或多个表进行检索和显示数据。具有使用灵活、简洁、功能强大等优点。
1.SELECT语句基本格式
SELECT[ALL*|*| [DISTINCT] 列名表达式 [,列名表达式 AS 标识符…]
FROM 表名1 [连接 表名2 ON 连接条件] […]
[WHERE 条件表达式 ]
[GROUP BY 列名 HAVING 条件表达式 ]]
[ORDER BY 列名[ASC|DESC]];
说明:
]ALL*或*:查询结果是满足条件的全部记录。
]DISTINCT:查询结果是不包含重复行的所有记录。
]列名表达式:使用逗号分开的各项,这些项可以是列、常数或系统内部的函数。
] AS 标识符:是为列名表达式指定新的列名,新列名应符合MySQL规定的命名规则, 标识符只在当前语句中有效。
]FROM表名:说明查询的数据源,可以是单个表,也可以是多个表。
]WHERE条件表达式:条件表达式可以是关系表达式或逻辑表达式。查询结果是表中满足条件表达式的记录集。
]GROUP BY列名 :查询结果是按列名分组的记录集。
]HAVING条件表达式:必须与GROUP BY组合使用,用来限定分组必须满足的条件。
]ORDER BY列名:查询结果是按某一列值排序。
]ASC|DESC:必须与ORDER BY组合使用,查询结果是按某一列值ASC(升序)或DESC(降序)排序。
2.查询语句的执行过程
SELECT语句的执行步骤:
(1)读取FROM子句中基本表或视图,然后对其连接运算。
(2)根据列名子句中,选择指定的列名。
(3)根据WHERE子句中,选择满足条件表达式的记录。
(4)根据GROUP BY子句中,按列的值进行分组,并从这些分组中选择满足HAVING子句中条件的记录。
(5)根据ORDER BY子句中,按指定的列名排序。
3.查询的条件表达式
在SELECT语句基本格式中,查询的条件表达式格式如下:
列名 运算符 表达式
说明:表达式一般可以由常量、列名和函数等的组合表示,并在具体情况下能够计算出一个结果。为了更好地使用查询的条件表达式,以下主要介绍常用运算符和常用系统函数。
(1)常用运算符
运算符是用来连接表达式中各个操作数的符号,其作用是对操作数所进行的运算。MySQL主要支持算术运算符、字符串连接运算符、比较运算符、逻辑运算符和位运算符5种类型,如表3-14和表3-15所示。
(2)常用函数
MySQL提供了丰富的系统函数,其作用是简化用户的操作。常用系统函数包括聚合函数、数学函数、字符串函数、日期和时间函数等,如表3-16、表3-17、表3-18和表3-19所示。
4.简单查询
简单查询是对数据库中的一个表进行查询。
(1)按指定列查询
]查询所有记录:
SELECT * FROM student;
或:
SELECT ALL * FROM student;
]查询指定列记录:
SELECT sname,sage,sdept FROM student;
(2)除去列的重复值
(3)条件查询
(4)统计查询
(5)分组查询
(6)排序查询
5.连接查询
以上介绍的查询都是针对一个表进行,但实际应用中常常需要从多个表中查找信息。多表连接查询是从两个或两个以上的表同时进行的查询。连接查询包括内连接、外连接和交叉连接。由于交叉连接结果没有实际意义,因此本节主要介绍内连接。
内连接是在两个表中选择满足连接条件的记录,组成一个新记录集合。
内连接基本格式:
FROM 表名1 [INNER] JOIN 表名2 ON 连接条件
其中,连接条件的基本格式:
[表名1 ].[列名1 ] 比较运算符 [表名2 ].[列名2 ]
注意:连接条件中的连接列必须是相同的列值。
说明:如果表名1中有M个记录,记录序列号为1~M;表名2中有N个记录,记录序列号为1~N,表名1和表名2的连接结果表有L个记录,记录序列号为1~L。
连接操作过程:
首先取表名1中的第1条记录(M=1),然后对表名2从头开始扫描,逐一查找满足连接条件的记录,找到后就将表名1中的第1条记录与该记录连接起来,形成结果表中的一条记录(L=1),继续在表名2中查找,在表名2全部查找完毕后(L≤N);再取表名1中的第2记录(M=2),然后再对表名2从头开始扫描,逐一查找满足连接条件的记录,找到后就将表名1中的第2条记录组与该记录连接起来,形成结果表中的第二条记录(第L记录序列号≤N+1)。
重复这个过程,直到表名1中的全部记录都处理完毕,则结果表中的记录总数为L≤M*N。
当比较运算符为等号“=”时,称为等值连接。在MySQL中使用设计视图创建多表查询时,系统自动生成的MySQL语句都是内连接。
6.嵌套查询
在MySQL中,一个“SELECT FROM WHERE”语句称为一个查询块。嵌套查询是指在查询语句“SELECT… FROM… WHERE”中嵌入一个查询块(子查询)。也就是子查询也是“SELECT… FROM… WHERE”语句组成。子查询可以代替SELECT语句中WHERE或HAVING子句的表达式。
(1)WHERE与子查询基本格式:
WHERE 列名 操作运算符 子查询
说明:
]操作运算符包括比较运算符、IN和NOT IN等。
]IN:表示如果列值与子查询返回的集合中某个值相等,则WHERE的结果为真;如果列值与子查询返回的集合中所有值不相等,则WHERE的结果为假。
]IN与NOT IN正相反。
(2)嵌套查询的操作过程:
先执行子查询,然后在子查询的结果基础上再执行外层查询。子查询返回的结果是一个集合。

