数据库第四章总结

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数据控制功能

授权

回收授权

拒权

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浓雾欲漫爱意

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值