4.1 SQL语言概述
(1)SQL语言的发展过程:
SQL是结构化查询语言(Structure Query Language)的缩写,它是使用关系模型的数据库应用语言,由IBM在70年代开发出来,作为IBM关系数据库原型System R的原型关系语言,实现了关系数据库中的信息检索。
(2)SQL语言的特点
1. 综合统一
数据库系统的主要功是通过数据库支持的数据语言来实现。
非关系模型(层次模型、网状模型)的数据语言一般都分为:
模式数据定义语言(Schema Data Definition Language,模式DDL);
外模式数据定义语言(Schema Data Definition Language,外模式DDL,子模式DDL);
数据存储有关的描述语言(Data Storage Description Language,DSDL);
2. 高度非过程化
非关系数据模型的数据操纵语言是“面向过程”的语言,用“过程化”语言完成某项请求,必须指定存取路径。而用SQL进行数据操作,只要提出“做什么”,而无须指明“怎么做”,因此无需了解存取路径。存取路径的选择以及SQL的操作过程由系统自动完成。这不但大大减轻了用户负担,而且有利于提高数据独立性。
3. 面向集合的操作方式
费关系数据模型采用的是面向记录的操作方式,操作对象是一条记录。而SQL采用集合操作方式,不仅操作对象、查找结果可以是元组的集合,而且一次插入、删除、更新操作的对象也可以是元组的集合。
4. 以同一种语法结构提供多种使用方式
SQL既是独立的语言,又是嵌入式语言。 作为独立的语言,它能够独立地用于联机交互的使用方式,用户可以在终端键盘上直接键入SQL命令对数据库进行操作;作为嵌入式语言,SQL语句能够嵌入到高级语言程序中,供程序员设计程序时使用。而在两种不同的使用方式下,SQL的语法结构基本上是一致的。这种以统一的语法结构提供多种不同使用方式的做法,提供了极大的灵活性与方便性。
5. 语言简洁,易学易用
SQL功能极强,但由于设计巧妙,语言十分简洁,完成核心功能只有9个动词,如表所示。SQL接近英语口语,因此容易学习,容易使用。
(3)SQL语言的功能
SQL语言功能主要分成四部分:
(1)数据定义。(DDL)用于定义SQL模式、基本表、视图和索引的创建和撤消操作。
(2)数据操纵。(DML)数据操纵分成数据查询和数据更新两类。数据更新又分成插入、删除、和修改三种操作。
(3)数据控制。包括对基本表和视图的授权,完整性规则的描述,事务控制等内容。
(4)嵌入式SQL的使用规定。涉及到SQL语句嵌入在宿主语言程序中使用的规则。
4.2支持的数据类型
(1)数值型
一、 整数数据类型
整数数据类型是最常用的数据类型之一。
1、INT (INTEGER)
INT (或INTEGER)数据类型存储从-2的31次方 (-2 ,147 ,483 ,648) 到2的31次方-1 (2 ,147 ,483,647) 之间的所有正负整数。
每个INT 类型的数据按4 个字节存储,其中1 位表示整数值的正负号,其它31 位表示整数值的长度和大小。
2、SMALLINT
SMALLINT 数据类型存储从-2的15次方( -32, 768) 到2的15次方-1( 32 ,767 )之间的所有正负整数。
每个SMALLINT 类型的数据占用2 个字节的存储空间,其中1 位表示整数值的正负号,其它15 位表示整数值的长度和大小。
3、TINYINT
TINYINT数据类型存储从0 到255 之间的所有正整数。每个TINYINT类型的数据占用1 个字节的存储空间。
4、BIGINT
BIGINT 数据类型存储从-2^63 (-9 ,223, 372, 036, 854, 775, 807) 到2^63-1( 9, 223, 372, 036 ,854 ,775, 807) 之间的所有正负整数。
每个BIGINT 类型的数据占用8个字节的存储空间。
二、 浮点数据类型
浮点数据类型用于存储十进制小数。浮点数值的数据在SQL Server 中采用上舍入(Round up 或称为只入不舍)方式进行存储。
所谓上舍入是指,当(且仅当)要舍入的数是一个非零数时,对其保留数字部分的最低有效位上的数值加1 ,并进行必要的进位。若一个数是上舍入数,其绝对值不会减少。
如:对3.14159265358979 分别进行2 位和12位舍入,结果为3.15 和3.141592653590。
1、REAL 数据类型
REAL数据类型可精确到第7 位小数,其范围为从-3.40E -38 到3.40E +38。 每个REAL类型的数据占用4 个字节的存储空间。
2、FLOAT
FLOAT 数据类型可精确到第15 位小数,其范围为从-1.79E -308 到1.79E +308。 每个FLOAT 类型的数据占用8 个字节的存储空间。
FLOAT数据类型可写为FLOAT[ n ]的形式。n 指定FLOAT 数据的精度。n 为1到15 之间的整数值。当n 取1 到7 时,实际上是定义了一个REAL 类型的数据,系统用4 个字节存储它;
当n 取8 到15 时,系统认为其是FLOAT 类型,用8 个字节存储它。
3、DECIMAL
DECIMAL数据类型可以提供小数所需要的实际存储空间,但也有一定的限制,您可以用2 到17 个字节来存储从-10的38次方-1 到10的38次方-1 之间的数值。
可将其写为DECIMAL[ p [s] ]的形式,p 和s 确定了精确的比例和数位。其中p 表示可供存储的值的总位数(不包括小数点),缺省值为18; s 表示小数点后的位数,缺省值为0。
例如:decimal (15 5),表示共有15 位数,其中整数10 位,小数5。
4、NUMERIC
NUMERIC数据类型与DECIMAL数据类型完全相同。
注意:SQL Server 为了和前端的开发工具配合,其所支持的数据精度默认最大为28位。但可以通过使用命令来执行sqlserver.exe程序以启动SQL Server,可改变默认精度。
命令语法如下:
SQLSERVR[/D master_device_path][/P precisim_leve1]
例4-4: 用最大数据精度38 启动SQL Server
sqlservr /d c:\ Mssql2000\data\master.dat /p38
/*在使用了/P 参数后,如果其后没有指定具体的精度数值,则默认为38 位./*
(2)日期时间型
日期和时间数据类型
1 DATETIME
DATETIME 数据类型用于存储日期和时间的结合体。它可以存储从公元1753 年1 月1 日零时起到公元9999 年12 月31 日23 时59 分59 秒之间
(3)字符串型
字符数据类型
字符数据类型是使用最多的数据类型。它可以用来存储各种字母、数字符号、特殊符号。一般情况下,使用字符类型数据时须在其前后加上单引号’或双引号” 。
1 CHAR
CHAR 数据类型的定义形式为CHAR[ (n) 。 以CHAR 类型存储的每个字符和符号占一个字节的存储空间。n 表示所有字符所占的存储空间,n 的取值为1 到8000,
即可容纳8000 个ANSI 字符。若不指定n 值,则系统默认值为1。若输入数据的字符数小于n,则系统自动在其后添加空格来填满设定好的空间。若输入的数据过长,将会截掉其超出部分。
2、NCHAR
NCHAR 数据类型的定义形式为NCHAR[ (n)]。 它与CHAR 类型相似。不同的是NCHAR数据类型n 的取值为1 到4000。 因为NCHAR 类型采用UNICODE 标准字符集(CharacterSet)。
UNICODE 标准规定每个字符占用两个字节的存储空间,所以它比非UNICODE 标准的数据类型多占用一倍的存储空间。使用UNICODE 标准的好处是因其使用两个字节做存储单位,
其一个存储单位的容纳量就大大增加了,可以将全世界的语言文字都囊括在内,在一个数据列中就可以同时出现中文、英文、法文、德文等,而不会出现编码冲突。
3、VARCHAR
VARCHAR数据类型的定义形式为VARCHARn)。 它与CHAR 类型相似,n 的取值也为1 到8000,若输入的数据过长,将会截掉其超出部分。
不同的是,VARCHAR数据类型具有变动长度的特性,因为VARCHAR数据类型的存储长度为实际数值长度,若输入数据的字符数小于n ,则系统不会在其后添加空格来填满设定好的空间。
一般情况下,由于CHAR 数据类型长度固定,因此它比VARCHAR 类型的处理速度快。
4、NVARCHAR
NVARCHAR数据类型的定义形式为NVARCHAR[ (n) ]。 它与VARCHAR 类型相似。不同的是,NVARCHAR数据类型采用UNICODE 标准字符集(Character Set), n 的取值为1 到4000。
(4)其他类型
1.逻辑数据类型
BIT: BIT数据类型占用1 个字节的存储空间,其值为0 或1 。如果输入0 或1 以外的值,将被视为1。
BIT 类型不能定义为NULL 值(所谓NULL 值是指空值或无意义的值)。
2.文本和图形数据类型
这类数据类型用于存储大量的字符或二进制数据。
1、TEXT
TEXT数据类型用于存储大量文本数据,其容量理论上为1 到2的31次方-1 (2, 147, 483, 647)个字节,在实际应用时需要视硬盘的存储空间而定。
SQL Server 2000 以前的版本中,数据库中一个TEXT 对象存储的实际上是一个指针,它指向一个个以8KB (8192 个字节)为单位的数据页(Data Page)。
这些数据页是动态增加并被逻辑链接起来的。在SQL Server 2000 中,则将TEXT 和IMAGE 类型的数据直接存放到表的数据行中,而不是存放到不同的数据页中。
这就减少了用于存储TEXT 和IMA- GE 类型的空间,并相应减少了磁盘处理这类数据的I/O 数量。
2 NTEXT
NTEXT数据类型与TEXT.类型相似不同的,是NTEXT 类型采用UNICODE 标准字符集(Character Set), 因此其理论容量为230-1(1, 073, 741, 823)个字节。
3 IMAGE
IMAGE 数据类型用于存储大量的二进制数据Binary Data。其理论容量为2的31次方-1(2,147,483,647)个字节。其存储数据的模式与TEXT 数据类型相同。
通常用来存储图形等OLE Object Linking and Embedding,对象连接和嵌入)对象。在输入数据时同BINARY数据类型一样,必须在数据前加上字符“0X”作为二进制标识
4.3数据定义功能
数据库的定义
(1)创建:Create database<数据库名>
[ON[primary]<文件>[,...n]
[,<文件组>[,...n]]
[LOG ON<文件>[,...n]]]
[COLLATE<校验方式名>]
[WITH<选项>[,...n]][;]
(2)修改:
ALTER DATABASE<数据库名>
ADD FILE<文件>[,...N]
[TO FILEGROUP{文件组}]
| ADD LOG FILE <文件>[,...n]
| REMOVE FILE <文件名>
| MODIFY FILE<文件>[;]
(3)删除:
DROP DATABASE<数据库名>[,...n][;]
架构的定义
(1)创建:CREATE SCHEMA{<架构名>
|AUTHORIZATION<所有者名>
|<架构名>AUTHORIZATION<所有者名>
}
[{表定义语句|视图定义语句|授权语句|收权语句|拒绝权限语句}][;]
(2)修改:ALTER SCHEMA<架构名>
TRANSFER<对象名>[;]
(3)删除:DROPS CHEMA<架构名>[;]
表的定义:
(1)创建:CREATE TABLE <表名>
(
<属性列名1> <数据类型> [列级约束条件],
<属性列名2> <数据类型> [列级约束条件],
..................................,
[表级约束条件]
)
1.NOT NULL:非空约束,限制列取值非空
2.PRIMARY KEY:主键约束,指定本列为主键
3.FOREIGN KEY:外键约束,定义本列为引用其他表的外键
4.UNIQUE:唯一值约束,限制列取值不能重复
5.DEFAULT:默认值约束,指定列的默认值
6.CHECK:列取值范围约束,限制列的取值范围
一.主键
1).当主键只有一个字段,采用列级约束条件进行约束
CREATE TABLE S
(
SNO CHAR(6) PRIMARY KEY,
SN CHAR(10),
SD CHAR(16)
)
2).当主键有多个字段,采用表级约束条件进行约束
CREATE TABLE SC
(
SNO CHAR(6),
CNO CHAR(6),
GRADE DECIMAL(4,1),
PRIMARY KEY(SNO,CNO)
)
二.外键
1.外键不一定要与主键同名,但是为了方便识别,通常采用同名方式。
2.外键与对应的主键必须定义在同一值域上,即数据类型和长度要完全一致。
(2)修改:ALTER TABLE <表名> ADD <属性列名><数据类型>[完整性约束条件]|<完整性约束>
(3)删除:DROP TABLE <表名>[CASCADE|RESTRICT]
4.4数据查询功能
学生数据库的基本结构:
student表
course表
sc表
单表查询:
SELECT [ALL | DISTINCT]<目标列表达式>[,<目标列表达式>]···
FROM<表名或视图名>[,<表名或视图名>···] | (SELECT语句>)[AS]<别名>
[WHERE<条件表达式>]
[GROUP BY<列名1>[HAVING<条件表达式>]]
[ORDER BY<列名2>[ASC | DESC]];
整个SELECT语句的含义是,根据WHERE子句的条件表达式从FROM子句指定的基本表、视图或派生表中找出满足条件的元组,再按SELECT子句中的目标列表达式选出元组中的属性值形成结果表。
如果有GROUP BY子句,则将结果按<列名1>的值进行分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。如果GROUP BY子句带HAVING短语,则只有满足指定条件的组才予以输出。
如果有ORDER BY子句,则结果还要按<列名2>的值的升序或降序排序。
SELECT语句既可以完成简单的单表查询,也可以完成复杂的连接查询和嵌套查询。
查询条件
谓词
比较
=,>,<,>=,<=,!=,<>,!>,!<; NOT+上述比较运算符
确定范围
BETWEEN AND,NOT BETWEEN AND
确定集合
IN,NOT IN
字符匹配
LIKE,NOT LIKE
空值
IS NULL,IS NOT NULL
多重条件(逻辑运算)
AND,OR,NOT
1.
%(百分号)代表任意长度(长度可以为0)的字符串。例如:a%b 表示以a开头,以b结尾的任意长度的字符串。如acb、addgb、ab等。
_(下划线)代表任意单个字符。例如:a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb、agb等。
2.
COUNT(*)
统计元组个数
COUNT([DISTINCT|ALL]<列名>)
统计一列中值的个数
SUM([DISTINCT|ALL]<列名>)
计算一列值的总和(此列必须是数值型)
AVG([DISTINCT|ALL]<列名>)
计算一列值的平均值(此列必须是数值型)
MAX([DISTINCT|ALL]<列名>
求一列值中的最大值
MIN([DISTINCT|ALL]<列名>)
求一列值中的最小值
多表连接查询
一、外连接
外连接可分为:左连接、右连接、完全外连接。
1、左连接 left join 或 left outer join
SQL语句:select * from student left join course on student.ID=course.ID
2、右连接 right join 或 right outer join
SQL语句:select * from student right join course on student.ID=course.ID
3、完全外连接 full join 或 full outer join
SQL语句:select * from student full join course on student.ID=course.ID
二、内连接 join 或 inner join
SQL语句:select * from student inner join course on student.ID=course.ID
inner join 是比较运算符,只返回符合条件的行。
此时相当于:select * from student,course where student.ID=course.ID
三、交叉连接 cross join
1.概念:没有 WHERE 子句的交叉联接将产生连接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。
SQL语句:select * from student cross join course
四、两表关系为一对多,多对一或多对多时的连接语句
当然上面两表为一对一关系,那么如果表A和表B为一对多、多对一或多对多的时候,我们又该如何写连接SQL语句呢?
其实两表一对多的SQL语句和一对一的SQL语句的写法都差不多,只是查询的结果不一样,当然两表也要略有改动。
比如表1的列可以改为:
Sno Name Cno
表2的列可以改为:
Cno CName
这样两表就可以写一对多和多对一的SQL语句了,写法和上面的一对一SQL语句一样
case表达式:
CASE WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> THEN <表达式>
WHEN <求值表达式> THEN <表达式>
. . .
ELSE <表达式>
END
WHEN 子句中的“< 求值表达式 >”就是类似“列 = 值”这样,返回
值为真值(TRUE/FALSE/UNKNOWN)的表达式。我们也可以将其看作
使用 =、!= 或者 LIKE、BETWEEN 等谓词编写出来的表达式。
CASE 表达式会从对最初的 WHEN 子句中的“< 求值表达式 >”进行
求值开始执行。所谓求值,就是要调查该表达式的真值是什么。如果结果
为真(TRUE),那么就返回 THEN 子句中的表达式,CASE 表达式的执行
到此为止。如果结果不为真,那么就跳转到下一条 WHEN 子句的求值之中。
如果直到最后的 WHEN 子句为止返回结果都不为真,那么就会返回 ELSE
中的表达式,执行终止。
从 CASE 表达式名称中的“表达式”我们也能看出来,上述这些整
体构成了一个表达式。并且由于表达式最终会返回一个值,因此 CASE 表
达式在 SQL 语句执行时,也会转化为一个值。虽然使用分支众多的 CASE表达式编写几十行代码的情况也并不少见,但是无论多么庞大的 CASE 表达式,最后也只会返回一个简单的值。
将查询结果保存到列表中:
SELECT查询列表序列INTO<新表名>
From 数据源
.....
子查询:
在SELECT中嵌套:
学生信息和班级名称位于不同的表中,要在同一张表中查出学生的学号、姓名、班级名称:
SELECT s.student_id,s.student_name,(SELECT class_name FROM t_class c WHERE c.class_id=s.class_id) FROM t_student s GROUP BY s.student_id;
在WHERE中嵌套:
现要查出C语言成绩最高的学生的信息:
SELECT * FROM t_student WHERE student_subject='C语言' AND student_score>=ALL (SELECT student_score FROM t_student WHERE student_subject='C语言') ;
4.5视图
视图的概述:
1.什么是视图
视图是一个虚拟的表,是一个表中的数据经过某种筛选后的显示方式,视图由一个预定义的查询select语句组成。
2.视图的特点
视图中的数据并不属于视图本身,而是属于基本的表,对视图可以像表一样进行insert,update,delete操作。
视图不能被修改,表修改或者删除后应该删除视图再重建。
视图的数量没有限制,但是命名不能和视图以及表重复,具有唯一性。
视图可以被嵌套,一个视图中可以嵌套另一个视图。
视图不能索引,不能有相关联的触发器和默认值,sql server不能在视图后使用order by排序。
视图的定义和使用:
Create view vw1 as
Select st.学号,st.姓名,st.所属院系 from student as st,course as co,score as sc
Where co.课名=’心理学’ and sc.考试成绩>80 and st.学号=sc.学号 and co.课号=sc.课号
视图的修改和删除:
Create view 视图名称[(字段1) (字段2) (字段3)…]
AS
Select 查询语句
[with check option]
Drop view 视图名称
物化视图
4.6数据更改功能
数据插入:
INSERT INTO <表名> (<列名列表>) VALUES (<值列表>)
数据更新:
UPDATE 表名 SET 列1=新值1,列2=新值2 WHERE 过滤条件
数据删除:
DELETE FROM 表名 WHERE 过滤条件
4.7数据控制功能
授权
回收授权
拒权