我的数据库原理及应用学习笔记.doc
数据库原理及开发应用(总结得知识储备)1. 数据库就就是储存数据得仓库,专业得解释就就是对数据存储与管理得软件与数据本身统称为数据库。2. 大型数据库有Oracle,Sql sever属于中型数据库,小得太多忽略不计,要知道就上网查。3. 数据库管理系统得主要功能:数据库定义功能;数据存取功能;数据库运行管理;数据库得建立与维护功能。4. 数据库得三级模式构:外模式、模式与内模式。(外模式即就是用户模式可以多个,模式只能一个,内模式就就是储存模式)。5. DDL: 数据库模式定义语言DDL(Data Definition Language)。6. DML:数据操作语言(data manipulation language)。7. DBMS: 数据库管理系统(Database Management System)。8. DBS:数据库系统(Database System)。9. DBA:数据库管理员(Database Administrator)。从三方面学习数据库1. 数据库就是如何储存数据得?(主键,外键,唯一键)2. 数据库就是如何操作数据得?(insert update delete)3. 数据库就是如何显示数据得?(select重点)操作及代码1. Crate table 语句:create table student(stu_name nvarchar(30) not null,stu_numb int not null,stu_sex nchar(1) not null);2. 主键外键:stu_numb int primary key;(可以在int 与primary中间加上constraint 约束名称)。 sch_add nvarchar(30) foreign key references student (stu_numb); 顺带回忆一下主键与外键得定义:主键:能够唯一标示一个事物得得字段或者多个字段得组合,叫主键。(含有主键得表叫做主键表,主键一般就是整数不建议用字符串,而且一般用代理主键不要用业务主键,也就就是说不要用有业务得字段作为主键,一般就用没有含义得编号当做主键。) 外键:如果一个表中得若干个字段来自若干个表得主键或者唯一键,就称这若干个字段为外键。(含有外键得表叫做外键表,通常都来自主键,因为唯一键可能为null,而且外键不一定来自别得表可能就来自本表)。自认为总结得超好。 哦哦,还有删除表得时候先删外键表,不然先删主键会报错,原因很简单,外键引用错误。 没完,主键约束:不允许重复元素,避免了数据得冗余。外键约束:从语法上保证所关联得事物一定存在,而且事物与事物之间得关系就是通过外键来体现得。 3. check语句: stu_mark int check(stu_mark>=60 and stu_mark<=100);check约束:保证事物属性得取值在合法得范围内。4. insert 语句:insert into student values(施宁一,14,男);(必须把所有字段全都输入除非有null得要写null);也可以就是:insert into (stu_name ,stu_sex) values(施宁一,男);5. default语句:stu_sex nchar(1) default (男); default约束:保证事物得属性一定会有一个值。6. unique语句:stu_name nvarchar(30) unique;表示其取值唯一不能重复。7. update语句:(书上没写这,网上找得好例子)我们刚刚发现Indiana Jones得等级为16,工资为$40,000、00,我们可以通过下面得SQL语句对数据库进行更新(并清除那些烦人得NULL)。UPDATE EMPLOYEESSET GRADE = 16, SALARY = 40000WHERE FIRST_NAME = 'Indiana' AND LAST_NAME = 'Jones'8. delete语句:(一样就是网上得例子,代码大写得效果一样但瞧着不爽)DELETE语句用来删除已知表中得行。如同UPDATE语句中一样,所有满足WHERE子句中条件得行都将被删 除。由于SQL中没有UNDO语句或就是“您确认删除吗?”之类得警告,在执行这条语句时千万要小心。如果决定取消Los Angeles办事处并解雇办事处得所有职员,这一卑鄙得工作可以由以下这条语句来实现:DELETE FROM EMPLOYEESWHERE BRANCH_OFFICE = 'Los Angeles'如同UPDATE语句中一样,省略WHERE子句将使得操作施加到表中所有得行。简单得操作及代码总结完了,后面就是重点内容与难点部分,主要介绍 查询【select】1. 计算列:(下面得例子中 student就是表名,其余得为字段名)select * from student; (数据库里得注释为-)-* 表示所有得意思。此语句将表中得所有数据显示。select stu_name from student;select stu_name ,stu_id from student;select stu_name ,stu_id * 10 as “学号得十倍”from student; select stu_name ,stu_id * 10 as “学号得十倍”,stu_id “学号” from student;-as 可以省略不写,此语句可以经过计算建立新得一列,并且命名。必须知道得就是select 123 from student;之类得语句结果不会报错,会显示student表得行数,每行都就是123这个数据。注:在写字段别名时可以用单引号也可以用双引号,但就是为了增强可移植性,一般用双引号,因为在Oracle大型数据库中不允许用单引号。2. distinct【不允许重复得】语句。select distinct stu_name from student;-将一样得数据都过滤掉,包括null,如果有都只剩下一个。select distinct stu_name ,stu_id from student;-将这两个字段得组合重复得过滤掉了。但就是不能写成select stu_id ,distinct stu_name from student ;用来过滤第二个字段,保留第一个字段。逻辑上有错误,不可行。3. between【在某个范围内得查询】语句。(后面emp就是表名,salary就是薪水得字段)select * from empwhere salary >=1500 and salary <=5000 等价于select * from empwhere salary between 1500 and 5000需要注意得就是:select * from emp(;)where salary >=1500 and salary <=5000就是不可取得,这两个命令就是一起得,中间不能打分号。查找另外一个范围得数据时可以用以下语句:select * from empwhere salary not between 1500 and 5000(另外一种就是:select * from empwhere salary <=1500 or salary >=5000 )4. in【若干个孤立得值】select * from emp where salary in (1500,3000)等价于select * from emp where salary =1500 or salary =3000select * from emp where salary not in (1500,3000)等价于select * from emp where salary <>1500 and salary <>3000 也作select * from emp where salary !=1500 and salary != 3000-数据库中不等于有两种写法: != 与 <> 推荐使用第二种。-or取反时记得改为and,呵呵。5、 top【最前面得若干个记录,专属于sql server不可移植到其她数据库】select top 5 * from emp;select top 15 percent * from emp;-此语句输出得就是百分之15得行数得所有字段,如果经计算百分之15就是2、1,则输出得就是三行。而且 * 不能省略,否则报错。6、 null【没有值 空值】零与null不一样,null表示没有值,而零表示一个确定得值。null不能参与这些运算:<> != =可以参与如下运算:is is not (下面得例子中emp 表示表名,而 m表示字段名)select * from emp where m is null;-输出得就是奖金为空得员工得信息。select * from emp where m is not null;-输出得就是奖金不为空得员工信息。select * from emp where m <> null;-输出为空errorselect * from emp where m != null;-输出为空errorselect * from emp where m = null;-输出为空error任何类型得数据都允许为nullcreate table t1 (stu_name nvarchar(30),stu_id int ,stu_sex nchar(1);insert into t1 values(null,null,null);-正确任何数字与null参与数学运算得结果都就是null(后面例子中empna表示员工名字,empsal表示月薪,empid表示员工号码,m与上面一样表示年终奖金)select empid,empna,empsal * 12 + m as ”年薪” from emp;运行结果就是最后一个字段都为null,证明了上面得说法。另外一种正确得写法:select empid,empna,empsal * 12 + isnull(m、,0) as “年薪”from emp;关于函数 isnull(m、,0)得解释:如果m得值为null则返回0,如果不就是null则返回原本得m值。7、 order by【以某个字段排序】order by a,b按a,b都按升序排列。order by a,b desca升序,b,降序order by a desc, ba 降序,b升序order by a desc,b desca,b 都按降序排列。-解释:默认就是按照升序排列得,升序就是asc 可以不写。(ascending,descending)8. 模糊查询【搜索时经常使用】格式:select 字段得集合 from 表名 where 某个字段得名字 like 匹配条件(匹配条件通常含有通配符 % )通配符表示任意零个或者多个字符select * from emp where ename like %A%-只要含A得ename 就输出。select * from emp where ename like A%-ename只要首字母为A就输出。select * from emp where ename like %A-ename 只要以A结尾就输出。_【下划线】表示任意单个字符select * from emp where ename like _A%-ename只要第二个字母为A就输出。a-f a到f 中得任意单个字符select * from emp where ename like _a-f%-ename中只要第二个字母就是在a到f中得就输出。a,f a或fa-c不就是a到c中得任意一个字母,瞧清楚就是 不就是 自己瞎了别怪我没提醒。select * from emp where 部门ip like '_发,联%'(这个语句就是从sql sever里面复制得,感觉颜色还蛮好瞧得)注意:匹配得条件必须用单引号括起来,不能傻不拉几得用双引号,后面来解释一下要搜索带 % _ 得字段时得方法。直接把在sql sever里得复制瞧:create table people (name nvarchar(30) not null, age int)insert into people values ('张三',32);insert into people values ('Tom',66);insert into people values ('a_b',22);insert into people values ('c%d',44);insert into people values ('abc_fe',56);insert into people values ('Snail',18);insert into people values ('施宁一',19);insert into people values ('c%',65);insert into people values ('long''s',100);select * from peopleselect * from people where name like '%/%' escape '/' ; -把含有%得字段输出了select * from people where name like '%/_%' escape '/' -把含有_得字段输出了噢耶9. 聚合函数【多行记录返回至一个值,通常用于统计】函数得分类单行函数-每行返回一个值多行函数-每行返回一个值聚合函数就是多行函数例子:select * from people select upper(name) from people ;-单行函数upper()将每行都返回为大写得字母。select MIN(age) from people ;-多行函数将多行中最小得值找出来返回了。聚合函数得分类:max()min()avg()平均值count()求个数count(*)返回表中所有记录得个数select COUNT(*) from people ;-返回了表people中得记录个数。count (字段名)返回字段中包括重复得记录得个数,但就是null不会被当做有效得记录算在个数之内。count (distinct 字段名)-返回了出去重复得记录后得记录个数。注意:判断下列sql语句就是否正确1. select max(sal),min(sal),count(*) from emp;-Ok2. select max(sal) “最高薪”,min(sal) “最低薪”,count(*) “员工人数” from emp; -Ok3. select max(sal),lower(ename) from emp ; -error单行函数与多行函数不能混用10. group by 【分组 难点】格式: group by 字段得集合功能: 把表中得记录按照字段分成不同得组。例子: 查询不同部门得平均工资并且按照升序排列select deptno , AVG(sal) from emp group by deptno order by deptno ;注意理解:group by a, b, c得用法 先按a分组,如果a 相同,再按b分组,如果b相同,再按c分组最终统计得就是最小分组得信息一定要明白下列语句为什么就是错误得:select deptno , avg(sal) as “部门平均工资”,enamefrom emp group by deptnoselect deptno,enamefrom empgroup by deptnoselect deptno, job, salfrom emp group by deptno,job记住:使用group by之后select 中只能出现分组后得整体信息,不能出现组内得详细信息11. having【对分组后得信息进行过滤 难点】1. having通常就是对分组之后得记录进一步过滤,所以having时一般先使用group up2. 如果没有使用group up而使用了having则意味着把所有得内容当做一组来处理3. Having子句出现得字段必须就是分组之后组得整体信息,having子句不允许出现组内得详细信息。4. Having子句中不能使用别名,尽管select中能使用别名。5. having与where得异同相同点:都就是过滤得作用,都不允许使用别名,只允许使用最原始得字段名。不同点:where就是对原始数据进行过滤,而having就是对分组之后得数据进行过滤,where必须在having前面,否则运行出错。(没试过)例子:select deptno ,avg(sal) “平均工资”,count(*) ”部门人数”,max(sal) “部门得最高工资”from empwhere sal> 2000 -where就是对原始记录得过滤group by deptnohaving avg(sal)>3000 -对分组之后得记录得过滤 (where不能出现聚合函数)12. 连接查询定义:将两个或者两个以上得表以一定得连接条件连接起来,从中检索出满足条件得数据。分类内连接【重点得重点 也就是难点得难点】1. select from A,B 得用法产生得结果:行数就是A B 得乘积列数就是A B 之与或者说把A表得每一条记录都与B 表得每一条记录组合起来了形成得就是一个笛卡尔积 注意:select from A,B 与 select from B,A 就是一摸一样得。2. select from A,B where 得用法其中A与B能够互换而且产生得笛卡尔积通过where得条件语句进行过滤例子:-输出5行 11列select *from emp,dept -dept与emp 互换 输出得结果不变where empno = 73693. select from A join B on 得用法select from A join B on -A与B 互换 输出结果不变4. select , from ,where ,join , on , order , top ,having ,得混合使用查询得顺序 select top from A join B on join C on where group by having order by 例子: -把工资大于得所有得员工按照部门分组把部门平均工资大于得最高前个得部门得编号部门得名称部门平均工资得等级 -第一种写法 select “T” 、*,”D”select from A join B on -A与B互换输出结果不变5. select , from, where , join , on , group ,order, top , having 得混合使用查询得顺序Select top From A Join B OnJoin cOn WhereGroup byHavingOrder by例子:把工资大于得所有员工按部门平均工资大于得最高前个得部门得编号部门得名称部门品均工资得等级第一种写法Select “T”