之前虽然学过三大范式,可老也记不牢
看过的最简单易懂的三大范式解析,学习一下
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;