渣渣小本求职复习之路每天一博客系列——数据库基础(MySQL)(2)
前情回顾:在上一篇,我们稍微回忆了一下数据库的几个概念,什么是数据库什么是笛卡尔积什么是等值连接等,最后还简单介绍了一下SQL(结构化查询语言)。(看到这些,有没有想起前天看过的东西呢?我问了问自己,貌似记得不是太清楚,所以又回去看了一遍博客,复习复习。)
昨天我把自己从实习单位辞职的事情贴了出来,在评论中能看出很多不同的看法。有些人非常支持我,鼓励我坚持自己的决定,不要想太多,我很感谢这些朋友。有些人觉得我是逃避困难,觉得我是渣渣以后肯定也是一事无成,对于这些评论,我本来想一一回复解释,甚至是反驳,可是我并没有这么做。可能是我的文笔不行,思路不够清晰,在文章中没能清楚突出表达我辞职的关键原因和老师的立场,所以才会引发一些误会。通过我自己写的有些言不达意的文字,然后产生对我的判断,而且是如此负面的判断,我觉得就算解释也无济于事。就看一篇日志,对我的了解程度必然是有限的,又怎么能奢望每个人都理解我呢?
希望大家不要在评论中大吵架,学习工作已经够辛苦,何必在上网的时候还找气受呢?没有必要,真的。
————————————————————————————闲聊结束———————————————————————————————
第三章:数据定义
我们一般是用基本表来存储数据的,那基本表是怎么来的呢?在数据库中创建。那数据库哪里来的呢?在数据库文件中创建。数据库文件哪里来的呢······我们可以根据这种反序的推导了解到整个过程,现在,我们从创建数据库/数据库表空间开始。Let's go!
第一节:指定数据和日志文件以及创建数据库
(弱弱说一句,其实我一直不会写这些语句,上课没怎么听,考试也不考,平时貌似也没用到。咳咳,这也许就是只用图形化管理界面和编程经验窄的坏处吧)
首先,我们来看看语句模板是怎样的:
CREATE DATABASE database_name //创建数据库 [ ON [< filespec >] [,< filegroup>]] //创建(指定)数据文件 [ LOG ON {< filespec >}] //创建(指定)日志文件 < filespec >::= [ PRIMARY ] ( [ NAME = logical_file_name ,] //逻辑文件名 FILENAME = 'os_file_name' //系统文件名 [,SIZE = size] //初始大小(一般以MB为单位) [,MAXSIZE = { max_size | UNLIMITED}] //最大大小,可以设为不限制 [,FILEGROWTH = grouth_increment])[,...n] //每次扩容的幅度 < filegroup >::= FILEGROUP filegroup_name< filespec >[,...n]
光看模板和注释,可能还不会太清楚,看一个具体的例子会好一点:
CREATE DATABASE Employee ON (NAME = Employee_dat, FILENAME='c:\program files\microsoft sql server\mssql\data\Employeedat.mdf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ) LOG ON ( NAME = 'Employee_log', FILENAME = 'c:\program files\microsoft sql server\mssql\data\Employeelog.ldf', SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB)
上面的例子属于指定单个数据和日志文件,那么接下来看看如何指定多个数据和日志文件(注意对照语句模板理解哟)
CREATE DATABASE Archive ON PRIMARY( NAME = Arch1,Filename= 'c:\archdat1.mdf',SIZE=100MB,MAXSIZE = 200,FILEGROWTH=20), (NAME =Arch2,Filename= 'c:\archdat1.mdf',SIZE=100MB,MAXSIZE = 200,FILEGROWTH=20) LOG ON (NAME = Archlog1,FILENAME='c: \archlog1.ldf',SIZE=100MB,MAXSIZE=200,FILEGROWTH=20), (NAME = Archlog2,FILENAME='c:\archlog2.ldf', SIZE=100MB,MAXSIZE=200,FILEGROWTH=20)
第二节:表定义
老规矩,还是从语句模板看起:
CREATE TABLE 表名( 列名 数据类型[缺省值][NOT NULL] [,列名 数据类型[缺省值][NOT NULL]]... [, UNIQUE(列名[,列名]...)] [, PRIMARY KEY(列名[,列名]...)] [, FOREIGN KEY(列名[,列名]...)] REFERENCES 表明(列名[,列名]...)] [,check(条件)])
如果很久没接触过SQL,有可能一下子看到这么多参数会不知道哪个是哪个,有什么作用,下面相应的参数说明,大家感受一下。
·DEFAULT(缺省值):指定列的缺省值
·NOT NULL:列值不能为空值
·UNIQUE:取值唯一的列名
·PRIMARY KEY:主关键字(主码)列名
·FOREIGN KEY:外部码列名
·REFERENCES:引用的外部码的表明和列名
·CHECK:指定表级约束条件
具体的例子就不给了,大家可以找找看。我看了课件,只是稍微明白是什么个意思,等我总结出来有更好的表述之后再贴出来。顺带介绍下如何利用子查询创建表,看一下截图
第三节:删除列定义及约束、删除表
删除约束——例如,删除学生姓名必须取唯一值的约束
ALTER TABLE Student DROP UNIQUE(Sname)
删除属性列——先把表中要保留的列及其内容复制到一个新表中,再删除原表,再将新表重命名为原表名直接删除属性列(课件上的原话,不是很理解,感觉怪怪的)
ALTER TABLE student Drop COLUMN nation
删除表的时候,需要注意四点内容:1.所有的数据以及结构都会被删除;2.任何未决的事务都会被提交 3.所有索引都会被删除 4.不能回滚(roll back)这个操作
DROP TABLE student
第四章:数据更新
数据更新三本斧,插入(INSERT)更新(UPDATE)和删除(DELETE)。下面就一一来看着三板斧到底是什么个样子。
第一节:插入数据
如果想在基本表中增加一行数据,我们会用INSERT语句进行操作
INSERT INTO table[(column[,column...])]
VALUES (value [, value...]);
当然啦,采用这种Insert语句一次只能插入一行记录。还有几个点主要我们注意一下的:1.如果没有指定列,Values后面紧接着的值必须与数据表结构的定义一致(包括顺序、类型、字段数),除identity字段。2.INTO子句中没有出现的属性列,新纪录在这些列上将取空值(NULL)或默认值。3.如果在表定义时说明了NOT NULL的属性列不能取空值,否则操作将会失败(这句话好像很废,不让你干,你非要干,当然会失败。)
如果我像把表A中的某一行插入到表B,那么我们可以利用子查询进行这个操作:
INSERT INTO <表名>[(<属性列1>[,<属性列2>...)] 子查询 INSERT INTO B SELECT sno,sname FROM A where id='110'
第二节:更新数据
如果想要修改已经存在的行,就用UPDATE语句。值得注意的是,跟INSERT语句不同,UPDATE语句可以对多行数据进行修改。
UPDATE table
SET column=value[,column=value]
[WHERE condition]
我们还可以采用子查询(基于别的表)进行更新操作,看下面的例子:
UPDATE emp SET deptno=(SELECT deptno FROM emp WHERE empno = 7788) WHERE job =(SELECT job FROM emp WHERE empno = 7788)
第三节:删除数据
DELETE语句的模板(最好能自己想起来,并且口述或写出来):
DELETE [FROM] table
[WHERE condition]
基于另一个表删除行(子查询)的例子就不举了,可以参照前面。而有的时候,删除操作可能会违背约束,例如:如果某行含有一个主键,该主键是作为另一个表中外键的,那么这一行就不能被删除。(好拗口,其实我也不是很理解,有大神给我解释一下么?)
有些SQL语句虽然简单,但是如果平时不怎么用,笔试面试前又没怎么看的话,很可能会在一些非常基础的地方栽跟头,给别人造成不好的印象。今天复习了数据定义和数据更新两个部分,明天我们将进行查询、视图以及索引的回顾。大家可能会认为我今天的内容有点少,其实我也觉得这篇就把另外三个部分包含进来。明天看看要不要把一篇博客的内容增加一些,尽可能把复习强度提升到一个比较合适的地步。
——————————————————————————————第八天——————————————————————————————
今天特别害怕又没写成博客,昨天已经请了一天假,如果连续两天都没写,恐怕坚持失败的可能性就很大很大了。
1. 博客园里面的大牛很多,有些可能不太乐意看着我每天都在首页发一篇这么基础的所谓技术博客,如果不想看的话那么还是别点进来的好。我决定以后只是每个专题的第一篇博客发首页,其他的一般情况下就不发首页了。
2.如果有朋友友情监督我是不是每天都有复习发博客的,可以把我的博客地址http://www.cnblogs.com/levenyes/添加到收藏夹,每天或隔几天看一看情况。又或者点击“加关注”,在最新动态处会通知我博客的更新。强烈希望大家在评论里能给我提出意见和建议,谢谢了!
3.实习离职后的第一天,当然是要好好过,总不能违背自己的诺言。别人对自己的要求,找几个理由借口总可以搪塞,可是自己给自己设定的标准是无论如何都糊弄不过去的。