数据库设计的三大范式以及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;

原文地址:https://www.cnblogs.com/Hyacinth-Yuan/p/7780601.html