数据库基础(二) -- 结构化查询语句

结构化查询语句

SQL数据库体系结构

在SQL中,外模式对应视图,模式对应于基本表,内模式对应于存储文件。元组称为行,属性称为列。

特征

  1. 一个SQL模式是表和约束的集合。
  2. 一个表是行的集合,每行的列是一个序列,每列对应一个数据项。
  3. 一个表可以是基本表,也可以是视图。基本表是实际存储在数据库中的表,视图是从基本表或其他视图导出的表,它本身不独立存储在数据库中,也就是数据库中只存放视图的定义而不存放视图的数据,这些数据仍然存放在导出视图的基本表中。因此视图是一个虚表。
  4. 一个基本表可以跨一个或多个存储文件,一个存储文件也可存放一个或多个基本表,一个表可以存放若干索引,索引也存放在存储文件中。每个存储文件与外部存储器上一个物理文件对应,存储文件的逻辑结构组成了关系数据库的内模式。
  5. 用户可以用SQL语句对视图基本表进行查询操作。在用户看来,视图和基本表都是一样的,都是关系(即表格)。
  6. SQL用户可以是应用程序,也可以是终端。

SQL的数据定义

SQL的数据定义包括对SQL模式,基本表(table),视图(view),索引(index)的创建和销毁。

SQL模式的创建和销毁

CREATE SCHEMA<模式名> AUTHORIZATION<用户名>
<!-- eg.   该模式名为 ST_COURSE,拥有者 Dali -->
CREATE SCHEMA ST_COURSE AUTHORIZATION Dali

DROP SCHEMA<模式名>[CASCADE | RESTRICT]
撤销有两种方式:
CASCADE(连锁式):执行DROP时,把SQL模式及其以下属性的基本表,视图,索引等所有元素全部撤销。
RESTRICT(约束式):执行DROP时,只有当SQL模式中没有任何下属元素时,才能撤销SQL模式,否则拒绝执行DROP语句。

SQL提供的基本数据类型

  1. 数值型

    INTEGER 长整型(也可写INT)

    SMALLINT 短整型

    REAL 取决于机器精度的浮点数

    DOUBLE PRECISION 取决于机器精度的双精度浮点数

    FLOAT(n) 浮点数,精度至少为n位数字

    NUMERIC(p,d) 定点数,由p位数字(不包括符号,小数点)组成,小数点后有d位数字(也可写

    ​ 成DECIMAL(p,d)或DEC(p,d))

  2. 字符串型

    CHAR(n) 长度为n的定长字符串

    VACHAR(n) 具有最大长度n的变长字符串

  3. 位串型

    BIT(n) 长度为n的二进制位串

    BIT VARYING(n) 最大长度为n的变长二进制位串

  4. 时间型

    DATE 日期,包含年,月,日,形为 YYYY-MM-DD

    TIME 时间,包含一日的时,分,秒,形为HH:MM:SS

SQL允许在上面列出的域上执行比较操作,但算术操作只限于数值型。

SQL允许用户使用 “CREATE DOMAIN”语句定义新的域。

CREATE DOMAIN PERSON_NAME CHAR(10)
定义了一个新的域 PERSON_NAME,以后就可以把它作为基本数据类型看待,用户在定义其他列的时候可以采用 PERSON_NAME 作为数据类型

基本表的创建,修改,撤销

基本表结构的创建

定义基本表结构,需要指出它在哪个模式中,后面为了简单起见,模式名可以省略不写。每个属性的类型可以是基本数据类型,也可以是用户自定义的域名。

完整性规则主要有三种子句:主键子句(PRIMARY KEY),检查子句(CHECK),外键子句(FPREIGN KEY)

CREATE TABLE SQL模式名.基本表名
    (列名1 类型1,
     列名1 类型,
     ...
     完整性约束,
     ...)
     
<!-- eg. 创建基本表 S,主键约束是SNO -->
CREATE TABLE S
    (SNO CHAR(4) NOT NULL,
     SNAME CHAR(20) NOT NULL,
     SADDR CHAR(20),
     PRIMARY KEY(SNO));
<!-- eg. 创建基本表 P,主键约束是PNO -->
CREATE TABLE P
    (PNO CHAR(4) NOT NULL,
     PNAME CHAR(20) NOT NULL,
     COLOR CHAR(8),
     WEIGHT SMALLINT,
     PRIMARY KEY(PNO));
<!-- eg. 创建基本表 J,主键约束是JNO -->    
CREATE TABLE J
    (JNO CHAR(4) NOT NULL,
     JNAME CHAR(20) NOT NULL,
     COLOR CHAR(8),
     JCITY CHAR(20),
     BALANCE NUMERIC(7,2),
     PRIMARY KEY(JNO));
<!-- eg. 创建基本表 SPJ,主键约束是SNO,PNO,JNO, 外键是 SNO,PNO,JNO,条件是QTY在[0,10000]-->
CREATE TABLE SPJ
    (SNO CHAR(4) NOT NULL,
     PNO CHAR(4) NOT NULL,
     JNO CHAR(4) NOT NULL,
     PRICE NUMERIC(7,2),
     QTY SMALLINT,
     PRIMARY KEY(SNO,PNO,JNO),
     FOREIGN KEY(SNO) REFERENCES S(SNO),
     FOREIGN KEY(PNO) REFERENCES P(PNO),
     FOREIGN KEY(JNO) REFERENCES J(JNO),
     CHECK(QTY BETWEEN 0 AND 10000));

基本表结构的修改

  1. 增加新的属性 ALERT … ADD ...

    ALERT TABLE 基本表名 ADD 新属性名 新属性类型
    <!-- eg. 在S表中增加一个电话属性(TELE) -->
    ALERT TABLE S ADD TELE CHAR(12);
    

    新增加的属性不能定义为 NOT NULL。基本表在新增加属性后,原有元组在新增加的属性列上的值都被定义为空值(NULL)

  2. 删除原有属性 ALERT … DROP ...

    ALERT TABLE 基本表名 DROP 属性名 [CASCADE | RESTRICT]
    <!-- eg. 删除S表电话属性(TELE) -->
    ALERT TABLE S DROP TELE CASCADE;
    

    CASCADE:在基本表中删除某属性时,所有引用到该属性的视图和约束也要一起自动被删除。

    RESTRICT:在没有视图或约束引用该属性时,才能在本表中删除该属性,否则拒绝删除操作。

  3. 撤销基本表 DROP TABLE

    DROP TABLE 基本表名 [CASCADE | RESTRICT]
    <!-- eg. 撤销S表 -->
    DROP TABLE S RESTRICT;
    

    撤销基本表后,其所有数据会丢失。

    只有在没有视图或约束引用基本表S中的列时才能撤销,否则拒绝撤销。

视图的创建和撤销

  1. 视图的创建 CREATE VIEW

    CREATE VIEW 视图名(列表名) AS SELECT 查询语句
    <!-- eg. 创建视图 JSP_NAME -->
    CREATE VIEW JSP_NAME(JNO,JNAME,SNO,SNAME,PNO,PNAME,QTY)
     AS SELECT J.JNO,JNAME,S.SNO,SNAME,P.PNO,PNAME,QTY FROM S,P,J,SPJ
     WHERE S.SNO = SPJ.SNO AND P.PNO = SPJ.PNO J.JNO = SPJ.JNO;
    

    在SQL中,外模式一级数据结构的基本单位是视图(VIEW),视图是若干基本表或其他视图构造出来的表。

    在创建一个视图时,系统把视图定义存放在数据字典中,而并不存储视图对应的数据,在用户使用视图的时采取求对应的数据,因此视图被视为 “虚表”。

  2. 视图的撤销 DROP VIEW

    DROP VIEW 视图名
    <!-- eg. 撤销视图 JSP_NAME -->
    DROP VIEW JSP_NAME;
    

SQL的数据查询

  1. SELECT语句

    SELECT A1,A2....An FROM R1,R2....Rm WHERE F
    

    WHERE 子句条件表达式F中可以使用下列运算符。

    • 算术比较运算符:<,<=,>,>=,<> 或 !=
    • 逻辑运算符:AND,OR,NOT
    • 集合成员资格运算符:IN,NOT IN
    • 谓词:EXISTS(存在量词),ALL,SOME,UNIQUE
    • 聚合函数:AVG(平均值),MIN(最小值),MAX(最大值),SUM(和),COUNT(计数)
    • F中的运算对象还可以是另一个SELECT语句,即 SELECT语句嵌套

    SELECT语句查询结果之间还可以进行集合的并,交,差操作。运算符是:并(UNION),交(INTERSECT),差(EXCEPT)

    SELECT [DISTINCT] 目标表的列名或列表达式序列
    FROM 基本表名和(或)视图序列|表引用
    [WHERE 行条件表达式]
    <!-- GROUP BY 对指定列的值进行分组,同时提取满足 HAVING 子句中组条件表达式的那些组 -->
    [GROUP BY 列名序列 [HAVING 组条件表达式]]  
    <!-- ORDER 子句对输出的目标表进行排序,附加说明 ASC 升序,DESC 降序,默认是升序-->
    [ORDER BY 列名[ASC|DESC],...]
    

联接操作

  1. 内联接(INNER UNION):结果为两个联接表中匹配行的联接

    //两个子句等价
    SELECT * FROM R,S WHERE R.r_id = S.s_id;
    SELECT * FROM R inner join S on R.r_id = S.s_id;
    

内连接.png
  1. 外联接

    左外联接(LEFT OUTER JOIN):结果中包括左表(JOIN子句最左边)中所有的行,不包括右表中不匹配的行

    SELECT * FROM R LEFT OUTER JOIN S ON R.r_id = S.s_id;
    

左外联接.png

右外联接(RIGHT OUTER JOIN):结果包括右表(出现在JOIN右边)中所有的行,不包括左表中不匹配的行

SELECT * FROM R RIGHT OUTER JOIN S ON R.r_id = S.s_id;

右外联接.png

  1. 完全外联接(FULL OUTER JOIN)

    结果包含所有联接表中的所有行,不论他们是否匹配

    SELECT * FROM R FULL OUTER JOIN SPJ ON R.r_id = SPJ.s_id
    左外联接 UNION 右外联接 可以实现全联接
    SELECT * FROM R RIGHT OUTER JOIN S AND R LEFT OUTER JOIN S ON R.r_id = S.s_id;
    

完全外联接.png
  1. 交叉联接(CROSS JOIN)

结果包括两个联接表中所有行组合,交叉联接返回的是两个表的笛卡尔积。

SELECT * FROM R CROSS JOIN S ON R.r_id = S.s_id;

SQL的更新操作

插入

INSERT INTO 表名(列名表) VALUES(元组值)

VALUES中的元组值的列的顺序必须和表中的列名表一一对应。

删除

DELETE FROM <表名> WHERE <条件表达式>

修改

UPDATE 表名 SET 列名 = 值表达式[,列名 = 值表达式...]
[WHERE 条件表达式]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容