菜鸟拙见,望请纠正html
一:关系型数据库的设计阶段
1:规划阶段:肯定是否须要使用数据库,使用哪一种类型的数据库,使用哪一个数据库产品。mysql
2:概念阶段:概念阶段的主要工做是收集并分析需求。linux
识别需求,主要是识别数据实体和业务规则。该阶段将参考或产出多种文档,好比“用例图”,“数据流图”以及其余一些项目文档。该阶段结束要能够回答以下问题。sql
须要哪些数据?数据该被怎样使用?哪些规则控制着数据的使用?谁会使用何种数据?客户想在核心功能界面或者报表上看到哪些内容?数据如今在哪里?数据是否与其余系统有交互、集成或同步?主题数据有哪些?核心数据价值几何,对可靠性的要求程度?数据库
3:逻辑阶段:逻辑阶段的主要工做是绘制E-R图,或者说是建模。E-R图以描述实体间的关系。还需考虑属性的域(值类型、范围、约束)。函数
4:实现阶段:实现阶段主要针对选择的RDBMS定义E-R图对应的表,考虑属性类型和范围以及约束。oop
5:物理阶段:在实际物理设备商部署数据库并测试和调优。post
二:设计原则与规范
1:命名规范:
表——“模块名_表名”。表名最好不要用复数,不要过长。测试
存储过程——使用“proc_”前缀。优化
视图——使用“view_”前缀。
触发器——使用“trig_”前缀。
2:选择数据类型
数值类型:
严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。

日期和时间类型

字符串类型
有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不一样,可根据实际状况选择。

3:定义实体关系的原则
当定义一个实体与其余实体之间的关系时,须要考量以下:
牵涉到的实体 :识别出关系所涉及的全部实体。
全部权: 考虑一个实体“拥有”另外一个实体的状况。
基数 :考量一个实体的实例和另外一个实体实例关联的数量。
关系与表数量
描述1:1关系最少须要1张表。
描述1:n关系最少须要2张表。
描述n:n关系最少须要3张表。
范式将帮助咱们来保证数据的有效性和完整性。规范化的目的以下:
消灭重复数据。
避免编写没必要要的,用来使重复数据同步的代码。
保持表的瘦身,以及减从一张表中读取数据时须要进行的读操做数量
最大化汇集索引的使用,从而能够进行更优化的数据访问和联结。
减小每张表使用的索引数量,由于维护索引的成本很高。
规范化旨在——挑出复杂的实体,从中抽取出简单的实体。这个过程一直持续下去,直到数据库中每一个表都只表明一件事物,而且表中每一个描述的都是这件事物为止。
关系模式:
候选键:若一个属性集能惟一标识一个元组,又不含有多余属性,那么这个属性集称为候选键

主键:及设计者设计数据库时选做元组标识的一个候选键
主属性:包含在任一一个候选键的属性称为主属性
函数依赖:某个属性集决定另外一个属性集时,称另外一属性集依赖于该属性集。
部分函数依赖:
范式:
第一范式:数据库表的每一列都是不可分割的基本数据项,同一列不能有多个值。及每一列不可再分及知足第一范式。
第二范式:在第一范式的基础上,每个非主属性彻底依赖于主关键字。彻底依赖及不能存在仅依赖主关键字的一部分属性。

第三范式:在第二范式的基础上,每一个非主属性都不传递依赖于候选键时,则为第三范式。
传递依赖:若X→Y,Y→A,而且Y→X,A不是Y的子集,则称A传递依赖于X。及主属性不能经过一个以上的路径走到非主属性。


BC范式:

若是关系模式R的全部不平凡的,彻底的函数依赖的决定因素(左边的属性集)都是候选码,则R€BCNF,即左边的都是候选键(注意不是主属性)
若是一个关系模式达到了第三范式,而且它只有一个候选键,或则他的候选键都是单属性,那么就达到了BCNF
三:SQL基础语速记(MySQL)
1:操做符

2:经常使用字符串函数
3:经常使用数值函数
4:经常使用日期时间函数
5:分组聚合函数
四:SQL语句速记(MYSQL)
1:增(insert)
基本格式:
insert [into] <表名> (列名1,列名2,列名3,......) values (值1,值2,值3,......);
1):插入一行时,要求必须对该行全部的列赋值。可是赋值方式能够是显式赋值(及将列列出,values 赋予 null )和隐式赋值(及不写出该列,也不写该列的值)
例如:显式赋值 :insert into <表名> (列名1,列名2,列名3) values (值1,null,值3);
隐式赋值:insert into <表名> (列名1,列名3......) values (值1,值3,......);
2):从其余表中复制数据:
例如:insert into <表1> select (值1,值2,值3);
2:删(delect)
基本格式:
delete from <表名> where <条件表达式>;
删除符合条件表达式的行记录
1)注意:不能在delete和from中间指定列名,由于记录要删,老是按照行来删除的,不存在删除一行记录的某几列的值的状况。
2)带查询的删除
例如:
DELETE FROM <表1>
WHERE joined >
(SELECT avg(joined) FROM <表2> WHERE town = 'Stratford');
注意:在WHERE子句的子查询中,不容许访问要删除行的表
3:删除4个最高的罚款
DELETE FROM penalties
ORDER BY amount DESC,playerno ASC
LIMIT 4;
3:改(update)
基本格式
update <表名> set <列名> = <值或值的表达式> where <条件表达式>
例1:把全部罚款增长5%
UPDATE penalties SET amount = amount*1.05;
例2:把住在S 的球员的获胜局数设为0
UPDATE matches
SET won = 0
WHERE playerno IN
(SELECT playerno FROM players WHERE town='S');
例3:多表查询
UPDATE matches m,teams t
SET m.won = 0,t.playerno = 112
WHERE t.teamno = m.teamno
AND t.division = 'first';
4:查(select)
基础关键字
from:来自某张表或则几张表
join:添加某张表
on :表链接查询,每关联一个表就须要加上对应的on条件
group by:分组
mysql> select salary,count(*) from salary_tab
-> where salary>=2000
-> group by salary;
+---------+----------+
| salary | count(*) |
+---------+----------+
| 2000.00 | 1 |
| 3000.00 | 1 |
+---------+----------+
having :聚合条件过滤
order by :排序 ,desc降序,asc升序,默认升序:如:
select * from temp order by id desc;
distinct:去掉重复数据 如: select distinct num from t2;
as :列别名
concat:字符串链接,如查询地址
concat函数,字符串链接
concat_ws函数,指定分隔符的字符串链接
mysql> select id,concat_ws(':',First,Last) "Full Name" from t1;
between v1 and v2:v1和v2之间
in :多个条件查询,相似于or 如:
select * from temp where id in (1, 2, 3);
like:模糊查询,如:
select * from temp where name like ‘%k%’;
limit:从结果集中选取最前面或最后面的几行,一般与order by配合
limit <获取的行数> [OFFSET <跳过的行数>]
limit [<跳过的行数>,] <获取的行数>
mysql> select playerno,name from players order by playerno asc limit 3,5;
mysql> select playerno,name from players order by playerno asc limit 5 offset 3;
解析:跳过前面的3行,从第4行开始取,取5行
count:统计行的数量
select count(*) from salary_tab
max和min函数
select min(salary) from salary_tab;
sum和avg函数
select avg(salary) from salary_tab;
多表连接查询
1:内链接 inner join
只返回两张表中全部知足链接条件的行,即便用比较运算符根据每一个表中共有的列的值匹配两个表中的行。(inner关键字是可省略的)
①传统的链接写法:
在FROM子句中列出全部要链接的表的名字(进行表别名),以逗号分隔;
链接条件写在WHERE子句中;
注意:一旦给表定义了别名,那么原始的表名就不能在出如今该语句的其它子句中
mysql> select s.sname,c.cname,t.tname,x.xuefen
-> from stu s,tea t,course c,xuanke x
-> where s.sid=x.sid and t.tid=x.tid and c.cid=x.cid;
+--------+--------+-----------+--------+
| sname | cname | tname | xuefen |
+--------+--------+-----------+--------+
| 张三 | linux | 冯老师 | 4 |
| 李四 | linux | 冯老师 | 2 |
| 张三 | mysql | 相老师 | 2 |
| 李四 | mysql | 相老师 | 2 |
| 张三 | hadoop | 相老师 | 6 |
| 李四 | hadoop | 相老师 | 2 |
+--------+--------+-----------+--------+
6 rows in set (0.08 sec)
②使用on子句(经常使用):
mysql> select s.sname,t.tname,c.cname,x.xuefen
-> from stu s
-> join xuanke x
-> on s.sid=x.sid
-> join tea t
-> on x.tid=t.tid
-> join course c
-> on c.cid=x.cid;
结果如上……
表之间的关系以JOIN指定,ON的条件与WHERE条件相同。
③使用using子句
mysql> select s.sname,t.tname,c.cname,x.xuefen
-> from stu s
-> join xuanke x
-> using(sid)
-> join tea t
-> using(tid)
-> join course c
-> using(cid);
结果如上……
表之间的关系以join指定,using(链接列)进行链接匹配,相似于on。(相对用的会比较少)
2:外连接 outer join
使用外链接不但返回符合链接和查询条件的数据行,还返回不符合条件的一些行。
在MySQL数据库中外链接分两类(不支持全外链接):
左外链接、右外链接。(outer关键字可省略)。
共同点:都返回符合链接条件和查询条件(即:内链接)的数据行
不一样点:
①左外链接还返回左表中不符合链接条件,但符合查询条件的数据行。(所谓左表,就是写在left join关键字左边的表)
②右外链接还返回右表中不符合链接条件,但符合查询条件的数据行。(所谓右表,就是写在right join关键字右边的表)
mysql> select s.sname,x.xuefen
-> from stu s
-> left join xuanke x
-> on s.sid=x.sid;
+--------+--------+
| sname | xuefen |
+--------+--------+
| 张三 | 2 |
| 张三 | 4 |
| 张三 | 6 |
| 李四 | 2 |
| 李四 | 2 |
| 李四 | 2 |
| 王五 | NULL |
+--------+--------+
7 rows in set (0.00 sec)
解析:stu表是左表,xuanke表是右表:left join是左链接,stu表中”王五”没有选课,在xueke表中没有数据行,不符合链接条件,返回符合查询条件的数据行,因此xuefen为null。
mysql> select s.sname,x.xuefen
-> from xuanke x
-> right join stu s
-> on x.sid=s.sid;
结果如上(用的是右链接的方式)
给链接查询附加条件:
一、写在WHERE子句中
二、使用AND和链接条件写在一块儿
可是:
对于内链接,两种写法结果相同;
对于外链接,两种写法结果不一样。
mysql> select s.sname,x.xuefen
-> from stu s
-> left join xuanke x
-> on x.sid=s.sid
-> where sname='张三';
+--------+--------+
| sname | xuefen |
+--------+--------+
| 张三 | 2 |
| 张三 | 4 |
| 张三 | 6 |
+--------+--------+
3 rows in set (0.01 sec)
mysql> select s.sname,x.xuefen
-> from (select * from stu where sname='张三') s
-> left join xuanke x
-> on x.sid=s.sid;
+--------+--------+
| sname | xuefen |
+--------+--------+
| 张三 | 2 |
| 张三 | 4 |
| 张三 | 6 |
+--------+--------+
3 rows in set (0.00 sec)
①先链接后过滤
select ……from ……
left join ……
on 链接条件
where 过滤条件;
②先过滤后链接
select ……from (select ……from ……where 过滤条件)
left join ……
on 链接条件;
3:交叉连接——笛卡尔积
由于没有链接条件,所进行的表与表间的全部行的链接。
特色:
①链接查询没有写任何链接条件
②结果集中的总行数就是两张表中总行数的乘积(笛卡尔积)
注意:在实际中,应该要避免产生笛卡尔积的链接,特别是对于大表
mysql> select * from stu,tea,course,xuanke;
……
……
108 rows in set (0.00 sec)
如果想专门产生笛卡尔积,可使用交叉链接
mysql> select *
-> from stu
-> crosss join tea;
+------+--------+---------+------+-----------+---------+
| sid | sname | sphonum | tid | tname | tphonum |
+------+--------+---------+------+-----------+---------+
| 1 | 张三 | 110 | 1113 | 相老师 | 1111 |
| 1 | 张三 | 110 | 1114 | 冯老师 | 1112 |
| 2 | 李四 | 120 | 1113 | 相老师 | 1111 |
| 2 | 李四 | 120 | 1114 | 冯老师 | 1112 |
| 3 | 王五 | 130 | 1113 | 相老师 | 1111 |
| 3 | 王五 | 130 | 1114 | 冯老师 | 1112 |
+------+--------+---------+------+-----------+---------+
6 rows in set (0.00 sec)
OVER····