我的数据库原理及应用学习笔记.docx
《我的数据库原理及应用学习笔记.docx》由会员分享,可在线阅读,更多相关《我的数据库原理及应用学习笔记.docx(15页珍藏版)》请在冰豆网上搜索。
我的数据库原理及应用学习笔记
数据库原理及开发应用
(总结的知识储备)
1.数据库就是储存数据的仓库,专业的解释就是对数据存储和管理的软件和数据本身统称为数据库。
2.大型数据库有Oracle,Sqlsever属于中型数据库,小的太多忽略不计,要知道就上网查。
3.数据库管理系统的主要功能:
数据库定义功能;数据存取功能;数据库运行管理;数据库的建立和维护功能。
4.数据库的三级模式构:
外模式、模式和内模式。
(外模式即是用户模式可以多个,模式只能一个,内模式就是储存模式)。
5.DDL:
数据库模式定义语言DDL(DataDefinitionLanguage)。
6.DML:
数据操作语言(data manipulation language)。
7.DBMS:
数据库管理系统(DatabaseManagementSystem)。
8.DBS:
数据库系统(DatabaseSystem)。
9.DBA:
数据库管理员(DatabaseAdministrator)。
从三方面学习数据库
1.数据库是如何储存数据的?
(主键,外键,唯一键)
2.数据库是如何操作数据的?
(insertupdatedelete)
3.数据库是如何显示数据的?
(select重点)
操作及代码
1.Cratetable语句:
createtablestudent(stu_namenvarchar(30)notnull,stu_numbintnotnull,stu_sexnchar
(1)notnull);
2.主键外键:
stu_numbintprimarykey;(可以在int和primary中间加上constraint约束名称)。
sch_addnvarchar(30)foreignkeyreferencesstudent(stu_numb);
顺带回忆一下主键和外键的定义:
主键:
能够唯一标示一个事物的的字段或者多个字段的组合,叫主键。
(含有主键的表叫做主键表,主键一般是整数不建议用字符串,而且一般用代理主键不要用业务主键,也就是说不要用有业务的字段作为主键,一般就用没有含义的编号当做主键。
)
外键:
如果一个表中的若干个字段来自若干个表的主键或者唯一键,就称这若干个字段为外键。
(含有外键的表叫做外键表,通常都来自主键,因为唯一键可能为null,而且外键不一定来自别的表可能就来自本表)。
自认为总结的超好。
哦哦,还有删除表的时候先删外键表,不然先删主键会报错,原因很简单,外键引用错误。
没完,
主键约束:
不允许重复元素,避免了数据的冗余。
外键约束:
从语法上保证所关联的事物一定存在,而且事物和事物之间的关系是通过外键来体现的。
3.check语句:
stu_markintcheck(stu_mark>=60andstu_mark<=100);
check约束:
保证事物属性的取值在合法的范围内。
4.insert语句:
insertintostudentvalues(‘施宁一’,14,’男’);(必须把所有字段全都输入除非有null的要写null);也可以是:
insertinto(stu_name,stu_sex)values(‘施宁一’,’男’);
5.default语句:
stu_sexnchar
(1)default(‘男’);
default约束:
保证事物的属性一定会有一个值。
6.unique语句:
stu_namenvarchar(30)unique;表示其取值唯一不能重复。
7.update语句:
(书上没写这,网上找的好例子)我们刚刚发现IndianaJones的等级为16,工资为$40,000.00,我们可以通过下面的SQL语句对数据库进行更新(并清除那些烦人的NULL)。
UPDATEEMPLOYEES
SETGRADE=16,SALARY=40000
WHEREFIRST_NAME='Indiana'
ANDLAST_NAME='Jones';
8.delete语句:
(一样是网上的例子,代码大写的效果一样但看着不爽)DELETE语句用来删除已知表中的行。
如同UPDATE语句中一样,所有满足WHERE子句中条件的行都将被删除。
由于SQL中没有UNDO语句或是“你确认删除吗?
”之类的警告,在执行这条语句时千万要小心。
如果决定取消LosAngeles办事处并解雇办事处的所有职员,这一卑鄙的工作可以由以下这条语句来实现:
DELETEFROMEMPLOYEES
WHEREBRANCH_OFFICE='LosAngeles';
如同UPDATE语句中一样,省略WHERE子句将使得操作施加到表中所有的行。
简单的操作及代码总结完了,后面是重点内容和难点部分,主要介绍
查询【select】
1.计算列:
(下面的例子中student是表名,其余的为字段名)
select*fromstudent;(数据库里的注释为--)
--*表示所有的意思。
此语句将表中的所有数据显示。
selectstu_namefromstudent;
selectstu_name,stu_idfromstudent;
selectstu_name,stu_id*10as“学号的十倍”fromstudent;
selectstu_name,stu_id*10as“学号的十倍”,stu_id“学号”fromstudent;
--as可以省略不写,此语句可以经过计算建立新的一列,并且命名。
必须知道的是select123fromstudent;之类的语句结果不会报错,会显示student表的行数,每行都是123这个数据。
注:
在写字段别名时可以用单引号也可以用双引号,但是为了增强可移植性,一般用双引号,因为在Oracle大型数据库中不允许用单引号。
2.distinct【不允许重复的】语句。
selectdistinctstu_namefromstudent;
--将一样的数据都过滤掉,包括null,如果有都只剩下一个。
selectdistinctstu_name,stu_idfromstudent;
--将这两个字段的组合重复的过滤掉了。
但是不能写成
selectstu_id,distinctstu_namefromstudent;用来过滤第二个字段,保留第一个字段。
逻辑上有错误,不可行。
3.between【在某个范围内的查询】语句。
(后面emp是表名,salary是薪水的字段)
select*fromemp
wheresalary>=1500andsalary<=5000
等价于
select*fromemp
wheresalarybetween1500and5000
需要注意的是:
select*fromemp(;)
wheresalary>=1500andsalary<=5000是不可取的,这两个命令是一起的,中间不能打分号。
查找另外一个范围的数据时可以用以下语句:
select*fromemp
wheresalarynotbetween1500and5000
(另外一种是:
select*fromemp
wheresalary<=1500orsalary>=5000
)
4.in【若干个孤立的值】
select*fromempwheresalaryin(1500,3000)
等价于
select*fromempwheresalary=1500orsalary=3000
select*fromempwheresalarynotin(1500,3000)
等价于
select*fromempwheresalary<>1500andsalary<>3000
也作
select*fromempwheresalary!
=1500andsalary!
=3000
--数据库中不等于有两种写法:
!
=和<>推荐使用第二种。
--or取反时记得改为and,呵呵。
5.top【最前面的若干个记录,专属于sqlserver不可移植到其他数据库】
selecttop5*fromemp;
selecttop15percent*fromemp;
--此语句输出的是百分之15的行数的所有字段,如果经计算百分之15是2.1,则输出的是三行。
而且*不能省略,否则报错。
6.null【没有值空值】
零和null不一样,null表示没有值,而零表示一个确定的值。
null不能参与这些运算:
<>!
==
可以参与如下运算:
isisnot
(下面的例子中emp表示表名,而comm表示字段名)
select*fromempwherecommisnull;
--输出的是奖金为空的员工的信息。
select*fromempwherecommisnotnull;
--输出的是奖金不为空的员工信息。
select*fromempwherecomm<>null;
--输出为空error
select*fromempwherecomm!
=null;
--输出为空error
select*fromempwherecomm=null;
--输出为空error
任何类型的数据都允许为null
createtablet1(stu_namenvarchar(30),stu_idint,stu_sexnchar
(1);
insertintot1values(null,null,null);--正确
任何数字与null参与数学运算的结果都是null
(后面例子中empna表示员工名字,empsal表示月薪,empid表示员工号码,comm与上面一样表示年终奖金)
selectempid,empna,empsal*12+commas”年薪”fromemp;
运行结果是最后一个字段都为null,证明了上面的说法。
另外一种正确的写法:
selectempid,empna,empsal*12+isnull(comm.,0)as“年薪”fromemp;
关于函数isnull(comm.,0)的解释:
如果comm的值为null则返回0,如果不是null则返回原本的comm值。
7.orderby【以某个字段排序】
orderbya,b
按a,b都按升序排列。
orderbya,bdesc
a升序,b,降序
orderbyadesc,b
a降序,b升序
orderbyadesc,bdesc
a,b都按降序排列。
--解释:
默认是按照升序排列的,升序是asc可以不写。
(ascending,descending)
8.模糊查询【搜索时经常使用】
格式:
select字段的集合from表名where某个字段的名字like匹配条件(匹配条件通常含有通配符%)
通配符表示任意零个或者多个字符
select*fromempwhereenamelike‘%A%’
--只要含A的ename就输出。
select*fromempwhereenamelike‘A%’
--ename只要首字母为A就输出。
select*fromempwhereenamelike‘%A’
--ename只要以A结尾就输出。
_【下划线】
表示任意单个字符
select*fromempwhereenamelike‘_A%’
--ename只要第二个字母为A就输出。
[a-f]
a到f中的任意单个字符
select*fromempwhereenamelike‘_[a-f]%’
--ename中只要第二个字母是在a到f中的就输出。
[a,f]a或f
[^a-c]
不是a到c中的任意一个字母,看清楚是^不是~自己瞎了别怪我没提醒。
select*fromempwhere部门iplike'_[^发,联]%'
(这个语句是从sqlsever里面复制的,感觉颜色还蛮好看的)
注意:
匹配的条件必须用单引号括起来,不能傻不拉几的用双引号,后面来解释一下要搜索带%_的字段时的方法。
直接把在sqlsever里的复制看:
createtablepeople(namenvarchar(30)notnull,ageint)
insertintopeoplevalues('张三',32);
insertintopeoplevalues('Tom',66);
insertintopeoplevalues('a_b',22);
insertintopeoplevalues('c%d',44);
insertintopeoplevalues('abc_fe',56);
insertintopeoplevalues('Snail',18);
insertintopeoplevalues('施宁一',19);
insertintopeoplevalues('c%',65);
insertintopeoplevalues('long''s',100);
select*frompeople
select*frompeoplewherenamelike'%/%%'escape'/';--把含有%的字段输出了
select*frompeoplewherenamelike'%/_%'escape'/';--把含有_的字段输出了噢耶
9.聚合函数【多行记录返回至一个值,通常用于统计】
函数的分类
单行函数
--每行返回一个值
多行函数
--每行返回一个值
聚合函数是多行函数
例子:
select*frompeople
selectupper(name)frompeople;
--单行函数upper()将每行都返回为大写的字母。
selectMIN(age)frompeople;
--多行函数将多行中最小的值找出来返回了。
聚合函数的分类:
max()
min()
avg()平均值
count()求个数
count(*)返回表中所有记录的个数
selectCOUNT(*)frompeople;
--返回了表people中的记录个数。
count(字段名)
返回字段中包括重复的记录的个数,但是null不会被当做有效的记录算在个数之内。
count(distinct字段名)
--返回了出去重复的记录后的记录个数。
注意:
判断下列sql语句是否正确
1.selectmax(sal),min(sal),count(*)fromemp;--Ok
2.selectmax(sal)“最高薪”,min(sal)“最低薪”,count(*)“员工人数”fromemp;--Ok
3.selectmax(sal),lower(ename)fromemp;
--error单行函数和多行函数不能混用
10.groupby【分组难点】
格式:
groupby字段的集合
功能:
把表中的记录按照字段分成不同的组。
例子:
查询不同部门的平均工资并且按照升序排列
selectdeptno,AVG(sal)fromempgroupbydeptnoorderbydeptno;
注意理解:
groupbya,b,c的用法
先按a分组,如果a相同,再按b分组,如果b相同,再按c分组最终统计的是最小分组的信息
一定要明白下列语句为什么是错误的:
selectdeptno,avg(sal)as“部门平均工资”,ename
fromemp
groupbydeptno
selectdeptno,ename
fromemp
groupbydeptno
selectdeptno,job,sal
fromemp
groupbydeptno,job
记住:
使用groupby之后select中只能出现分组后的整体信息,
不能出现组内的详细信息
11.having【对分组后的信息进行过滤难点】
1.having通常是对分组之后的记录进一步过滤,所以having时一般先使用groupup
2.如果没有使用groupup而使用了having则意味着把所有的内容当做一组来处理
3.Having子句出现的字段必须是分组之后组的整体信息,having子句不允许出现组内的详细信息。
4.Having子句中不能使用别名,尽管select中能使用别名。
5.having和where的异同
相同点:
都是过滤的作用,都不允许使用别名,只允许使用最原始的字段名。
不同点:
where是对原始数据进行过滤,而having是对分组之后的数据进行过滤,where必须在having前面,否则运行出错。
(没试过)
例子:
selectdeptno,avg(sal)“平均工资”,count(*)”部门人数”,max(sal)“部门的最高工资”
fromemp
wheresal>2000-–where是对原始记录的过滤
groupbydeptno
havingavg(sal)>3000-–对分组之后的记录的过滤
(where不能出现聚合函数)
12.连接查询
定义:
将两个或者两个以上的表以一定的连接条件连接起来,从中检索出满足条件的数据。
分类
内连接【重点的重点也是难点的难点】
1.select…fromA,B的用法
产生的结果:
行数是AB的乘积
列数是AB之和
或者说
把A表的每一条记录都和B表的每一条记录组合起来了
形成的是一个笛卡尔积
注意:
select…fromA,B
和select…fromB,A
是一摸一样的。
2.select…fromA,Bwhere…的用法
其中A和B能够互换而且产生的笛卡尔积
通过where的条件语句进行过滤
例子:
--输出5行11列
select*
fromemp,dept--dept和emp互换输出的结果不变
whereempno=7369
3.select…fromAjoinBon…的用法
select…fromAjoinBon…--A和B互换输出结果不变
4.select,from,where,join,on,order,top,having,的混合使用
查询的顺序
selecttop…
fromA
joinB
on…
joinC
on…
where…
groupby…
having…
orderby…
例子:
--把工资大于的所有的员工按照部门分组把部门平均工资大于的最高前个的部门的编号部门的名称部门平均工资的等级
--第一种写法
select“T”.*,”D”
select…fromAjoinBon…--A和B互换输出结果不变
5.select,from,where,join,on,group,order,top,having的混合使用
查询的顺序
Selecttop…
FromA
JoinB
On
Joinc
On
Where…
Groupby…
Having…
Orderby…
例子:
——把工资大于的所有员工按部门平均工资大于的最高前个的部门的编号部门的名称部门品均工资的等级
第一种写法
Select“T”