zoukankan      html  css  js  c++  java
  • 数据库设计的三大范式以及SQL的再复习

    之前虽然学过三大范式,可老也记不牢

    看过的最简单易懂的三大范式解析,学习一下

    http://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html

    之前也学过一些SQL的知识,只是一段时间不用就忘

    现读一遍【深入浅出SQL】,希望再次梳理下SQL的相关知识,以便回顾。此为前记。

    CREATE DATABASE a;

    USE a;

    CREATE TABLE a_list(

    contact_id INT NOT NULL AUTO_INCREMENT,

    a.name VARCHAR(10) NOT NULL DEFAULT ax,

    a.type VARCHAR(6)

    PRIMARY KEY(contact_id)

    );

    DROP TABLE a;

    INSERT INTO your_table(col_name1,col_name2,...)

              VALUES('value1','value2',...)

    SELECT * FROM your_table

    WHERE 后面的词:AND、OR、BETWEEN、IN、NOT IN、LIKE

    DELETE和UPDATE table SET cost=cost+1 where ...

    原子性数据

    ALTER TABLE my_contacts

    ADD COLUMN contact_id INT NOT NULL AUTO_INCREMNET FIRST(AFTER 列名),

    ADD PRIMARY KEY (contact_id);

    ALTER后面的词:

    CHANGE 可同时改变现有列的名称和数据类型

    ALTER TABLE 某table

    CHANGE COLUMN 原列名 新列名 INT NOT NULL  

    MODIFY  修改现有列的数据类型或位置

    MODIFY COLUMN 列名 VARCHAR(120);

    ADD  在当前表中添加一列——可自选类型

    DROP  从表中删除某列(可能导致数据遗失)

    ALTER TABLE projekts

    RENAME TO project_list;

    一些便利的字符串函数,可以和select、update、delete搭配使用

    select right(列名,2) from my_contacts;  取出列名的后2个字符,并不改变数据表中的内容

    substring_index(列名,',',1) 取出第一个逗号前的所有内容

    substring(your_string,start,length) 取出从start开始长度为length的字符串

    upper(your_string) lower(your_string)

    reverse(your_string) 反转字符串里的字符排序

    ltrim(your_string)    rtrim(your_string)返回清除多余空格后的字符串,它们分别清除字符左侧和右侧的多余空格

    length(your_string)

    update movie_table

    set category =

    case 

      when drama='T' then 'drama'

      when comedy='T' then 'comedy'

      when cartoon='T' then 'cartoon'

      else 'misc'

    end; (找到第一种符合的情况即赋值,虽无break,仍有break的效用)

    ORDER BY title ASC,purchased DESC; 排序

    GROUP BY 分组汇总

    函数: 

    sum(列名)    AVG(列名)

    MIN()     MAX()        COUNT()

    关键字  DISTINCT 选出与众不同的值   IN和NOT IN     EXISTS和NOT EXISTS

    LIMIT查询结果的数量     LIMIT 19,10  从第20个结果开始列出10条数据 (SQL 结果从0开始计算的)

    创建带有外键的表:

     使用一对一表的时机:父表只有一行与子表的某行相关

    1、抽出数据以获得更快速的查询。例如,如果大多数时候你只需要查询SSN,就可以查询较小的SSN表

    2、如果有列包含还不知道的值,可以单独存储这一列,以免主要表中出现NULL

    3、我们可能希望某些数据不要太常被访问。隔离这些数据即可管制访问次数,以员工表为例,他们的薪资信息最好存为另一张表

    4、如果有一大块数据,例如BLOB类型,这段数据或许存为另一张表会更好

    交叉联接(笛卡尔积)  cross join

    内联接:相等联接(每个男孩有的玩具)

    select boys.boy,toys.toy

    from boys

      INNER JOIN

      toys

    ON boys.toy_id=toys.toy_id

    内联接:不等联接(每个男孩没有的玩具)

    select boys.boy,toys.toy

    from boys

      INNER JOIN

      toys

    ON boys.toy_id   <>  toys.toy_id

    ORDER BY boys.boy

    内联接:自然联接(利用相同列名进行联接)

    select  boys.boy,toys.toy

    from boys

      NATURAL JOIN

      toys;

     外联接:返回某张表的所有行,并带有来自另一张表的条件相符的行

    LEFT OUTER JOIN 左外联接:接收左表的所有行,并用这些行与右表中的行匹配

    外联接一定会提供数据行,无论该行能否在另一表中找到相匹配的行。左外联接的结果集中的NULL表示右表中没有找到与左表相符的记录

    RIGHT OUTER JOIN右外联表

    INNER JOIN 自联接:自联接能把单一表当成两张具有完全相同的信息的表来进行查询

    UNION 联合:使用UNION合并的select语句中的列的数量必须一致

    select title from job_current

    UNION

    select title from job_desired

    UNION

    select title from job_listings

    ORDER BY title;

    UNION ALL 运作方式与UNION相同,只不过它会返回列的所有内容,而不是每个值的复制实例

     联合规则:选取的列的数据类型必须可以互相转换,也就是说,数据会试着转换为相容类型,如果无法转换,查询就会失败

    INTERSECT(交集)

    EXCEPT(差集)

    select title from job_desired

    INTERSECT

    select title from job_listings

    检查约束check:限定允许插入某个列的值。它与WHERE子句都使用相同的条件表达式

    coin CHAR(1) CHECK (coin IN ('P','N','D','Q'))

    如果插入的值无法通过CHECK条件,则出现错误信息

    创建视图

    CREATE VIEW a AS 

    SELECT查询

    视图是只有在查询中使用VIEW时才存在的表,虚拟表

    视图对数据库的好处:

    1、视图把复杂查询简化为一个命令,更简单轻松

    2、即使一直改变数据库结构,也不会破坏依赖表的应用程序

    3、创建视图可以隐藏读者无需看到的信息

    视图除了查询,还可以插入、更新与删除

    CHECK OPTION:检查每个进行INSERT或DELETE的查询,它根据视图中的WHERE子句来判断这些查询可否执行

    在视图后添加CHECK OPTION,即要求RDBMS检查每个INSERT与DELETE语句——它会根据视图中的WHERE子句来检查这类查询是否符合条件

    删除视图:DROP VIEW a;

    事务:一群可完成一组工作的SQL语句。在事务过程中,如果所有步骤无法不受干扰地完成,则不该完成任何单一步骤

    判断一组SQL语句是否构成一个事务的四个原则(ACID):

    ATOMICITY:原子性。事务里的每个步骤都必须完成,否则只能都不完成。

    CONSISTENCY:一致性。事务完成后应维持数据库的一致性。

    ISOLATION:隔离性。每次事务都会看到具有一致性的数据库,无论其他事务有什么行动

    DURABILITY:持久性。事务完成后,数据库需要正确地存储数据并保护数据免受断电或其他威胁的伤害

    三种SQL事务工具可以保障账户的安全:

    START TRANSACTION; #持续追踪后续所有的SQL语句,直到你输入COMMIT或ROLLBACK为止

    COMMIT; #若所有语句都已经妥当,提交所有程序代码造成的改变

    ROLLBACk; #若改变结果不太对劲,逆转过程,回到事务开始前的状态

    存储引擎必须是BDB或InnoDB,两种支持事务的引擎之一

     改变存储引擎:ALTER TABLE your_table TYPE=InnoDB;

    安全问题:

    根用户(root):具有所有数据库操纵能力。

    可为其他用户创建帐号:

    SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');(MYSQL中)

    CREATE USER else INDENTIFIED BY '987654';

    使得用户else ,happy获得a表的查询权限:

    GRANT SELECT(多个列名) ON  #可选仅见表中的几列    GRANT ALL 的话all包括增删改查

    a  TO else,happy

    WITH GRANT OPTION;#授予else,happy也可把此权限授予其他人

    撤销权限:REVOKE,语法与GRANT相同

    REVOKE GRANT OPTION  ON       只移除 GRANT OPTION权限

    DELETE ON a

    FROM  else

     当撤销权限时,else赋给其他用户的此权限也被撤销,不过,有两个关键字可用于控制撤销的范围:

    CASCADE:表示权限的撤销具有连锁反应,包括目标在内的被授权人的权限都会被撤销

    RESTRICT:如果有间接用户受到影响,则可返回错误信息

    角色:授予一群人所需权限,同时又让他们每个人都有自己的帐号的方式

    CREATE ROLE data_entry; #授予权限时,直接把角色当成用户就好

    为用户添加角色(授予权限):

    CRANT data_entry TO doc WITH ADMIN OPTION;#且允许用户doc把角色data_entry授予其他人

    卸除角色:DROP ROLE data_entry;

    REVOKE data_entry FROM doc  CASCADE/RESTRICT;

  • 相关阅读:
    BZOJ 4769: 超级贞鱼 逆序对 + 归并排序
    BZOJ 4897: [Thu Summer Camp2016]成绩单 动态规划
    luogu 4059 [Code+#1]找爸爸 动态规划
    CF718C Sasha and Array 线段树 + 矩阵乘法
    计蒜客 2238 礼物 期望 + 线段树 + 归并
    BZOJ 2157: 旅游 (结构体存变量)
    BZOJ 3786: 星系探索 ETT
    BZOJ 3545: [ONTAK2010]Peaks 启发式合并 + 离线 + Splay
    Spring的几种初始化和销毁方法
    SpringCloud之Zuul高并发情况下接口限流(十二)
  • 原文地址:https://www.cnblogs.com/Hyacinth-Yuan/p/7780601.html
Copyright © 2011-2022 走看看