chapter04_关系数据库标准语言SQL_1_SQL

  • SQL的功能

    (1) 数据定义:定义表、视图、索引

    (2) 数据操纵:增删改查

    (3) 数据控制:访问权限、事务

  • 三级模式和SQL的对应关系

    概念模式 -- 基本表

    外模式 -- 视图

    内模式 -- 存储文件

  • UNIQUE

    (1) 表示列值必须唯一

    示例

      CREATE TEMPORARY TABLE `temp` (
          `num1` int(11) DEFAULT NULL UNIQUE,
          `num2` int(11) DEFAULT NULL UNIQUE,
          `num3` int(11) DEFAULT NULL,
      );
    

    (2) 如果需要命名 UNIQUE 约束,以及为多个列定义 UNIQUE 约束,使用下面的 SQL 语法

    示例

      CREATE TABLE `temp` (
          `num1` int(11) DEFAULT NULL,
          `num2` int(11) DEFAULT NULL,
          `num3` int(11) DEFAULT NULL,
          CONSTRAINT unique_id UNIQUE(num1, num2)
      );
    

    注:可以类比联想创建外键约束时的语法

      CREATE TABLE `temp` (
          `num1` int(11) DEFAULT NULL,
          `num2` int(11) DEFAULT NULL,
          `num3` int(11) DEFAULT NULL,
          CONSTRAINT fk_temp_num1 FOREIGN KEY (num1)
      );
    

    (3) 如果表已经创建

      ALTER TABLE temp
      ADD (CONSTRAINT uc_ID 可省略) UNIQUE (num1, num2);
    

    (4) 撤销UNIQUE约束

      ALTER TABLE temp
      DROP INDEX uc_PersonID(没命名的话就是num1这种)
    
  • 主键可以是一组属性

    示例

      CREATE TABLE Persons (
          Id_P int NOT NULL,
          LastName varchar(255) NOT NULL,
          FirstName varchar(255),
          Address varchar(255),
          City varchar(255),
          CONSTRAINT pk_PersonID PRIMARY KEY (Id_P, LastName)
      );
    

    前面的CONSTRAINT pk_PersonID 是给这个主键约束命名为 pk_PersonID

  • 删除表和视图的时候都可以后面添加 CASCADE/RESTRICT

    DROP TABLE temp CASCADE 代表temp上建立的索引和表上定义的视图一并删除;

    DROP TABLE temp RESTRICT 代表表上没有定义视图或参照约束表时删除该表,否则报错

  • 索引 index

    (1) 在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据

    (2) 用户无法看到索引,它们只能被用来加速搜索/查询

    (3) 更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引

    (4) 一个表上可以建立一个或多个索引

    (5) 在创建表时添加索引

      CREATE TABLE temp (
          num1 int, 
          num2 int,
          INDEX num1_index (num1), 
          INDEX num2_index (num2)
      );
    

    (6) 创建表完成以后添加索引

      CREATE INDEX num_index ON temp (num1, num2);
    

    (7) UNIQUE在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值

      CREATE UNIQUE INDEX num_index ON temp (num1, num2);
    

    (8) CLUSTER表示要创建聚集索引。一个基本表上仅能建立一个聚集索引

      CREATE CLUSTER INDEX num_index ON temp (num);
    
  • 聚合函数

    作用在多条记录上,例如SUM, COUNT, MAX, AVG等

  • HAVING 和 WHERE

    (1) HAVING是对聚合后的结果进行条件的过滤,而WHERE是在聚合前就对记录进行过滤

    (2) HAVING常常和GROUP BY连用,用于分组查询;此时是不能用WHERE的,因为此时还没有记录,不能用聚合函数

    (3) 能用WHERE的时候要尽量用WHERE,因为用where先过滤记录,这样因为结果集减小,将对聚合的效率大大提高,最后再根据逻辑看是否用having进行过滤

  • SELECT

    (1) 完整写法

    SELECT (DISTINCT) <列名, 常量, 算术表达式>
    FROM <表名, 视图名>
    (WHERE <条件表达式>)
    (GROUP BY <列名>)
    (HAVING <条件表达式>)
    (ORDER BY <列名>) (ASC/DESC);

    (2) SELECT 后面可以是列名,也可以是字符串常量算术表达式

    (3) 分组查询 GROUP BY 中,除了要分组的列名以外,不能再出现其他的列名

  • 子查询

    (1) 带有EXISTS的子查询返回的是TRUE/FALSE,若返回TRUE则保留当前记录,因此带有EXISTS的子查询中常常使用 SELECT *

      SELECT name FROM student AS s1 
      WHERE EXISTS (SELECT * FROM student AS s2 WHERE s1.dept = s2.dept AND s2.name = 'Lily');
    

    (2) EXISTS常用的是它的否定形式

  • UNION, MINUS, INTERSECT分别代表结果的并集、差集、交集,但是有的数据库不一定支持这三个关键字,此时可以用子查询代替

    示例

      SELECT name FROM student CROSS JOIN sc WHERE sc.no = 'C1' AND student.sno = sc.sno
      INTERSECT
      SELECT name FROM student CROSS JOIN sc WHERE sc.no = 'C2' AND student.sno = sc.sno;
    

    等价于

      SELECT name FROM student WHERE 
      sno IN (SELECT sno FROM sc WHERE cno = 'C1') 
      AND sno IN (SELECT sno FROM sc WHERE cno = 'C1');
    
  • INSERT可以和SELECT结合在一条语句中使用

    示例

      INSERT INTO cs_avg (no, grade)
      SELECT sno, AVG(grade) FROM sc WHERE sno IN (SELECT sno FROM student WHERE dept = 'computer science');
    
  • INSERT, DELETE, UPDATE 相比 SELECT 最大的区别是 INSERT, DELETE, UPDATE只涉及单个表, 而SELECT还涉及子查询和表的联接

    所以, 使用INSERT, DELETE, UPDATE要保证数据库的一致性,多张表要么都操作,要么都不操作(事务,ACID的C:consistency)

  • 视图

    (1) 系统仅将视图的定义保存在数据字典中,在对视图操作时才生成数据(相当于子查询);视图相当于窗口

    (2) 创建视图的完整语句

      CREATE VIEW <视图名> (<列名1, 列名2, ...>)
      AS
      SELECT (DISTINCT) <列名, 常量, 算术表达式>
      FROM <表名, 视图名> 
      (WHERE <条件表达式>)
      (GROUP BY <列名>)
      (HAVING <条件表达式>)
      (ORDER BY <列名>) (ASC/DESC)
      (WITH CHECK OPTION);
    

    (3) 创建视图时必须使用列名的情况

    1° 目标列中包含聚合函数

    2° 多个表定义的视图,多个表有相同列名

    3° 需要定义与基本表列名不相同的视图的列名

    (4) WITH CHECK OPTION选项的作用:

    DELETE, INSERT, UPDATE时检查是否满足条件,不满足时拒绝执行操作(MySQL不支持CHECK约束,通过建立视图的方式可以“曲线救国”)

    (5) 对视图的更新最终会转换成对基本表的更新,所以有些更新可以执行,有些更新不能执行:

    不能更新的限制:

    1° 由多个基本表导出的视图

    2° 视图定义使用了GROUP BY 或聚集函数

    3° 列中含有常量或表达式

    4° 定义中含有DISTINCT

  • (1) 对表的操作

    SELECT, INSERT, UPDATE, DELETE, ALTER TABLE, CREATE INDEX

    (2) 在视图和列上的操作

    SELECT, INSERT, UPDATE, DELETE

    (3) 对权限的操作

    GRANT, REVOKE

  • GRANT

    GRANT 语句执行后,DBMS把授权的结果存入数据字典,用户提出操作请求时进行检查

  • 嵌入式SQL与主程序

    (1) 嵌入式SQL与主程序的通信

    SQL中设置一个通信区SQLCA,SQLCA是一个数据结构,包含描述当前工作状态的信息,应用程序可以通过这些信息了解数据库执行的情况

    (2) 游标

    SQL是面向集合的,一次可以生成多条记录;而应用程序一次只能处理一行;

    游标是一个数据缓冲区,用来存放SQL语句的执行结果;

    游标包含两个部分:结果集 + 指针;通过移动指针每次将结果集中的一行给应用程序

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

推荐阅读更多精彩内容