奋战了近两个月,机房收费系统总算完工,等待验收的到来啊,在整个的学习中,我感受较深的是米老师的囫囵吞枣理论,今天就拿数据库应用来说说!
当初学习数据库的时候还是一年前,当初纯粹是囫囵吞枣啊!把sql,视图,事务等内容都吞到到肚子里,到了今天验证了那句话“出来混,早晚要还的”当初的枣吞得太生硬,在一年的时间里经过不停地打磨和敲击,在vb6里c#里,vs里!到今天化开了它神秘的面纱,得以窥见一斑!
在sqlsever中能够用sql语句建立视图,主键等,也可以用一种图形化的方法建立,在说视图之前,必须要说的一个前提是jion语句,说白了就是怎么将两张表组合成一张表!
前提:我们有两张表
学生表:
记录姓名:
ID | Name |
201301 | 张三 |
201302 | 李四 |
201303 | 王五 |
201304 | 赵六 |
201305 | 冯七 |
201306 | 马八 |
衣服:
记录衣服:
ID | Clothes |
201301 | t恤 |
201302 | 外套 |
201303 | 牛仔裤 |
201304 | 鸭舌帽 |
201201 | 墨镜 |
一、外连接
外连接可分为:左连接、右连接、完全外连接。
以左连接为例: left join 或 left outer join
sql语句:select * from 学生left join 衣服on 学生.ID=衣服.ID
执行结果:
ID | Name | ID | Clothes |
201301 | 张三 | 201301 | t恤 |
201302 | 李四 | 201302 | 外套 |
201303 | 王五 | 201303 | 牛仔裤 |
201304 | 赵六 | 201304 | 鸭舌帽 |
201305 | 冯七 | null | null |
201306 | 马八 | null | null |
大家看,左链接就会以左表(学生表为基准)进行填充,没有对应数据的值为空(null)。
大家再看其他的例子,就会明白:
右链接:right join 或 right outer join
ID | Name | ID | Clothes |
201301 | 张三 | 201301 | t恤 |
201302 | 李四 | 201302 | 外套 |
201303 | 王五 | 201303 | 牛仔裤 |
201304 | 赵六 | 201304 | 鸭舌帽 |
null | null | 201201 | 墨镜 |
完全外连接: full join 或 full outer join
ID | Name | ID | Clothes |
201301 | 张三 | 201301 | t恤 |
201302 | 李四 | 201302 | 外套 |
201303 | 王五 | 201303 | 牛仔裤 |
201304 | 赵六 | 201304 | 鸭舌帽 |
201305 | 冯七 | null | null |
201306 | 马八 | null | null |
null | null | 201201 | 墨镜 |
二、内连接 join 或 inner join
sql语句:select * from 学生 inner join 衣服on 学生.ID=衣服.ID
执行结果:
ID | Name | ID | Clothes |
201301 | 张三 | 201301 | t恤 |
201302 | 李四 | 201302 | 外套 |
201303 | 王五 | 201303 | 牛仔裤 |
201304 | 赵六 | 201304 | 鸭舌帽 |
可见内连接只返回符合条件的行。
三、交叉连接 cross join
sql语句:select * from student cross join course
执行结果:
ID | Name | ID | Clothes |
201301 | 张三 | 201301 | t恤 |
201302 | 李四 | 201302 | t恤 |
201303 | 王五 | 201303 | t恤 |
201304 | 赵六 | 201304 | t恤 |
201305 | 冯七 | 201305 | t恤 |
201306 | 马八 | 201306 | t恤 |
201301 | 张三 | 201302 | 外套 |
201302 | 李四 | 201302 | 外套 |
201303 | 王五 | 201302 | 外套 |
201304 | 赵六 | 201302 | 外套 |
201305 | 冯七 | 201302 | 外套 |
201306 | 马八 | 201302 | 外套 |
201301 | 张三 | 201303 | 牛仔裤 |
201302 | 李四 | 201304 | 牛仔裤 |
201303 | 王五 | 201305 | 牛仔裤 |
201304 | 赵六 | 201306 | 牛仔裤 |
201305 | 冯七 | 201307 | 牛仔裤 |
201306 | 马八 | 201308 | 牛仔裤 |
201301 | 张三 | 201304 | 鸭舌帽 |
201302 | 李四 | 201305 | 鸭舌帽 |
201303 | 王五 | 201306 | 鸭舌帽 |
201304 | 赵六 | 201307 | 鸭舌帽 |
201305 | 冯七 | 201308 | 鸭舌帽 |
201306 | 马八 | 201309 | 鸭舌帽 |
可见第一个表的行数乘以第二个表的行数等于我们要查的结果的表,这种表较为冗余,一般我们不用!
这只是数据库的简单应用,我们要处理比较分散的数据时用到这些比较多,如果数据集中,这些就很少用到,所以设计数据库时数据的粒度是一个很值得考虑的问题!粒度太大,数据冗余,粒度太小,关系复杂,还是那句话“合适就好”