第一课:
1.什么是数据库?
数据库它是用来存放数据仓库。
它是一组相关数据的集合。
数据库由表,关系和操作对象组成。
2.数据存储的发展历史:
a.原始时期,甲骨文
b.奴隶社会,大脑
c.封建社会,纸
d.计算机,磁盘的方式存放
3.数据库发展:
a.萌芽阶段--磁盘的方式存放数据
b.初级阶段--层次,网状模型
c.中级阶段--关系型数据库SQLServer2005
d.高级阶段--关系对象型Oracle
4.SQLServer的发展:
3家公司(IBMSybaseMS)
1988--》1992--》IBM--》1995--》2008
5.数据库的数据的存放:
表--行和列
行--记录元祖实体(客观存在,可以被描述的事物)
列--字段属性域
6.如何管理数据库:
SQLServer2005数据库管理系统(DBMS)
a.打开服务。(建立数据库管理系统与磁盘数据库文件的联系)
b.打开数据管理工具(身份验证)
windows用户房东老板
sa密码为空租房人
7.如何创建数据库。
很简单
8.数据库的分类:
系统数据库:
master主要数据库存放的是数据库系统本身的一些配置信息。
model模板数据库是创建其他数据库的模板,默认路径,默认大小,都是以model作为模板
msdbms微软的意思,微软自己开发一系列的函数,存储过程。
tempdbtempdb临时数据库,保存了一些操作时的临时文件
用户数据库:
用户自定义的数据库。
9.数据库文件的分类:
数据库文件(主要数据文件mdf,次要数据文件ndf)
日志文件(ldf)
创建一个默认的数据库,只会有两个文件一个mdf,ldf
mdf主要文件:主要用来存放数据信息
ndf次要文件:次要数据文件用来分担主要文件的压力的
ldf日志文件:存放一些日志信息(用户的操作的跟踪)
在一个数据库中,每个文件的个数:
主要文件有且仅有一个
次要文件可有可无
日志文件必须要有一个,可以有多个
10.数据库的创建时的配置:
初始大小,
自动增长,
路径,
数据库文件类型,
数据库名称
11.--GO代表批处理,它可以将GO语句以上的代码
--作为一个批次传递给DBMS执行
--作用:1.提高代码的执行效率2.控制代码的优先级
--GO一般用在每一条建库建表的语句之后
12.如何建表
SQLServer里面的数据类型:
数值类型:
int4
smallint2
bigint8
float8双精度注意:sqlserver中没有double
real4单精度
字符类型:
char(8)'abcd'固定长度的数据类型。浪费空间
varchar(8)'abcd'可变长度的数据类型。节约空间
5000字节上限
text大文本类型
nchar,nvarchar,ntext
以上三种:可以用来多存储一个编码格式:unicode编码。
时间类型:
datetime类型时间类型的存储格式:2011-9-179\17\2011
bit类型:
bit类型0,1注意:在数据库中没有true/false
二进制类型:
image
货币类型:
money
usemaster--为什么首先要使用master数据库
go
ifexists(select*fromsysdatabaseswherename='emp')
dropdatabaseemp
go
createdatabaseemp
on--on代表数据文件组
(
name='emp_mdf',--逻辑名称
filename='c:\emp.mdf',--物理名称
size=3mb,--初试大小
maxsize=10mb,--上限
filegrowth=1mb--每次增长1Mb
),
(
name='emp_ndf',
filename='c:\emp.ndf',
size=3mb,
maxsize=10mb,
filegrowth=10%
)
logon
(
name='emp_ldf',
filename='c:\emp.ldf',
size=3mb,
maxsize=10mb,
filegrowth=10%
)
go
第二课:
数据的完整性:
准确性+有效性=完整性
怎么去维护数据的完整性呢?
约束分类:
1.实体完整性约束:(实体,行)
a.主键约束:(单一主键,复合主键)唯一,非空
举例:(编号都可以建主键)
注意:在一张表只能有一条主键,但是主键可以建在多个列上。
b.唯一约束:唯一。
举例:(身份证,电话)
c.标识列约束做了自动增长的限制(标识种子,递增量)
注意:标识列不允许插值,他是自动增长的。
2.域完整性约束:(域,列)
a.数据类型约束。
b.非空约束。
c.默认值约束。
d.检查约束。check约束eage>0andeage<100
3.引用完整性约束:(两表之间关系的准确有效)
外键约束:确保在子表中的数据,必须要来自于主表。
empexam(eidint,escoreint)
建了外键之后,在删除的时候,必须先删子表再删主表。
4.自定义完整性约束:
5.代码实现所有约束。
useemp
go
ifexists(select*fromsysobjects
wherename='studentexam')
droptablestudentexam
go
ifexists(select*fromsysobjects
wherename='studentinfo')
droptablestudentinfo
go
createtablestudentinfo
(
stuidintidentity(1,1),
stunamevarchar(20),
stusexvarchar(20),
stuageint,
stucardvarchar(18),
stujointimedatetime
)
go
altertablestudentinfo--alter修改
addconstraintpk_stuidprimarykey(stuid)
go
altertablestudentinfo
altercolumnstunamevarchar(20)notnull
go
altertablestudentinfo
addconstraintdf_stusexdefault'男'forstusex
go
altertablestudentinfo
addconstraintck_stuage
check(stuage>0andstuage<100)
go
altertablestudentinfo
addconstraintuq_stucardunique(stucard)
go
altertablestudentinfo
addaddressvarchar(200)--添加列
go
altertablestudentinfo
altercolumnaddresstext--修改列
go
altertablestudentinfo
dropcolumnaddress--删除列
go
createtablestudentexam
(
stuidint,
stuscoreint
)
go
altertablestudentexam
addconstraintfk_stuidforeignkey(stuid)
referencesstudentinfo(stuid)--添加外键
go
--references引用了studentexam
第三课:
--1.数据的导入导出
--2.数据冗余:数据出现重复的现象。
--数据冗余带来的问题就是:浪费磁盘的空间
--但是这是一个矛盾问题。
--3.sql代码:
--sql结构化查询语言structedquerylanguage
--sql1979IBM
--sql语言行业标准,标准sql
--Oralepl-sql
--sqlservert-sqltransaction
--基于事物的结构化查询语言
--T-sql语言的分类:
--DDL数据库定义语言defination
--createdropusealter
--DML数据库操作语言manager
--insertdeleteupdateselect
--DCL数据库控制语言control
--grant授予revoke收回
--其他一些功能函数,流程控制的语法
--T-sql语言中运算符:
1.关系运算符
<,>,<=,>=,
注意:赋值单等=,比较=
不等于!=,<>
2.逻辑运算符
在java中与&;&;或||非!
sql与and或or非not
优先级:not>and>or
3.通配符
下划线'张_'一个任意字符
百分号'张%'代表任意长度的字符
中括号'张[0-9]'某个返回的任意一个字符
中括号取非'张[^0-9]'不在0-9之内的任意一个字符
card='湘A[0-9][0-9][0-9][0-9][0-9]'有问题
注意:一定要使用like
正确的写法:
cardlike'湘A[0-9][0-9][0-9][0-9][0-9]'
4.添加数据的语法:
a.insertinto表名values(值,值,值,值)
createtablestudentinfo
(
stuidintidentity,
stunamevarchar(20),
stusexvarchar(8)default'男',
stuageint,
stucardvarchar(18),
stujointimedatetime
)
droptablestudentinfo
select*fromstudentinfo--*号代表所有的列
insertintostudentinfovalues
('zx','男',29,'43112345','2011-9-1')
insertintostudentinfovalues
('mzh',default,20,'43012345','2011-9-1')
--插值的时候要注意:
1.标识列不要插值的。
2.数据类型要一一对应,字符串和日期类型要单引号
3.个数(列和值的个数)要对应
4.如果有默认值的情况请使用default关键字
5.添加的数据要满足先前定义好的约束
b.insertinto表名(列,列,列,列)
values(值,值,值,值)
insertintostudentinfo
(stuname,stusex,stuage,stucard,stujointime)
values('yl','女',20,'43023456','2011-9-1')
--修改语法
update表名
set列=列值
where列=列值
--请修改zx同学的性别为女,身份证为430110、
updatestudentinfo
setstusex='女',stucard='430110'
wherestuname='zx'
select*fromstudentinfo
--请修改身份证以430开头的所有学员的性别为女
updatestudentinfo
setstusex='女'
wherestucardlike'430%'
--删除语法:
deletefrom表名--删除所有数据
deletefrom表名where列=列值--根据条件删除
--删除学员编号为1的同学:
deletefromstudentinfowherestuid=1
select*fromstudentinfo
--请删除性别为女,而且在2011-9-1号入学的同学
deletefromstudentinfowherestusex='女'
andstujointime='2011-09-01'
insertintostudentinfo
values('wjq','女',20,'43011111','2011-9-1')
--标识列是一个消耗品,不能被恢复的
--但有个语法可以恢复标识列
truncatetablestudentinfo--删除
--类似于格式化
truncate和delete的区别
效率高低
清空种子可以不可以
能否操作主表不能可以
但是truncatetable最致命的缺点在于:
truncatetable后面不能接条件,意味着它只能整表删除
如果只能整表删除,意味着它不能删主表
--查询
usepubs
--查询的语法
--select*fromtitles
--查询所有的列来自哪张表
select*fromtitles
--请查询titles表中的前3条记录
selecttop3*fromtitles
--请查询titles表中前一半的记录
selecttop50percent*fromtitles
--排序(升序和降序):
select*fromtitlesorderbypriceasc
select*fromtitlesorderbyprice--默认是升序
select*fromtitlesorderbypricedesc
--按两个列排序先按第一个列排,如果有重复,
--在这个范围内排第二个列
selectpub_id,pricefromtitles
orderbypub_iddesc,pricedesc
--请查询价格最贵的书籍的信息
selecttop1*fromtitlesorderbypricedesc
select*fromtitles
whereprice=(selectmax(price)fromtitles)
--为表来取别名:3种方式
selecttitle_idas'书籍编号',
title'书籍名称',
'书籍类型'=[type]
fromtitles
--注意:type是关键字,又是列名
--如果一个字既是关键字,又是列名请使用[]带区分
--请查询价格为空的书籍的信息
select*fromtitleswherepriceisnull
select*fromtitleswherepriceisnotnull
--请查询书籍名称以The开头的书籍信息
select*fromtitleswheretitlelike'The%'
--请查询书籍价格在10到20块之间的书籍信息
select*fromtitleswhereprice>=10andprice<=20
select*fromtitleswherepricebetween10and20
between10and20包含了10和20这两个值
注意:10和20,必须小的写前面,大的写后面
--请查询出版时间在2000年到1998年出版的书籍信息
select*fromtitleswherepubdate
between'1998-1-1'and'2000-1-1'
--请查询出版社为0736和0877出版的所有书籍的信息
select*fromtitleswherepub_id='0736'or
pub_id='0877'
select*fromtitles
wherepub_idin('0736','0877')
--刚才讲的查询中
--1.isnull
--2.betweenand
--3.like
--4.in这四个语法是模糊性查询
第四课:
--简单的查询
usepubs
select*fromtitles
selecttitle_idas'书籍编号',
title'书籍名称',
'书籍类型'=[type]
fromtitles
selecttop3*fromtitles
selecttop30percent*fromtitles
select*fromtitlesorderbypricedesc
--按出版的价格总量来排序
select*fromtitlesorderbyprice*royaltydesc
--请查询价格在10到20之间的书籍的信息
select*fromtitleswherepricebetween10and20
--价格未定的书籍信息
select*fromtitleswherepriceisnull
--请查询价格最贵的书籍信息
selecttop1*fromtitlesorderbypricedesc
select*fromtitleswhereprice=
(selectmax(price)fromtitles)
--请查询出版日期在1991年到2000年之间的书籍信息
select*fromtitleswherepubdatebetween
'1991-01-01'and'2000-01-01'
--书籍名称以The开头的书籍信息
select*Fromtitleswheretitlelike'The%'
--请查询0736和0877出版的所有书籍的信息
select*fromtitleswherepub_idin('0736','0877')
1.日期函数
selectgetdate()--获取当前时间
--datediff(时间的类型,小的时间,大的时间)求两个时间差
selectdatediff(yy,getdate(),'2012-8-8')
--时间的计算dateadd(时间类型,量,某个时间)
selectdateadd(day,200,getdate())
--获得某个时间的部分--返回整型
selectdatepart(mm,getdate())
--获得某个时间的部分的名称--返回字符类型
selectdatename(mm,getdate())
selectdatepart(dw,getdate())
selectdatename(dw,getdate())
--请查询出版了已经5年的书籍信息
select*fromtitles
wheredatediff(mm,pubdate,getdate())>5*12
字符串函数:
selectlen('zhaoxin')--返回一个字符串的长度
selectdatalength('赵鑫')--返回一个字符串字节的长度
--replace(操作字符,把什么,替换成什么)
selectreplace('我日你','日','**')--替换函数
selectreplace('zhaoxin','','')
--stuff(操作字符,哪里开始,几位,替换字符)
selectstuff('zhaoxinge',1,4,'a')--截取并替换
--注意:数据库中的字符的下标从1开始数起
--substring(操作字符,从哪开始,截取几位)
selectsubstring('zhaoxinge',5,3)--截取函数
selectleft('zhaoxin',4)--左截取
selectright('zhaoxin',3)--右截取
--去空格
selectltrim('zhaoxin')
selectrtrim('zhaoxin')
selectrtrim(ltrim('zhaoxin'))
--转大写,转小写
selectupper('zhaoxin')
selectlower('ZHAOXIN')
--查询某个字符在某个字符串中的索引位置
selectcharindex('@','zhaoxin@163')
数学函数
--求绝对值函数
selectabs(-123)
--求平方根
selectsqrt(9)
--求幂的函数
selectpower(5,3)
--四舍五入?如果要去掉后面0,该怎么办?
selectround(3.1455926,2)
--向上取整,向下取整
selectceiling(3.000001)
selectfloor(3.9999999)
--随机函数(取值范围0--1)
selectrand()
--请给我获得一个0到10之间的随机整数
selectfloor(rand()*10)
--请获得一个11-22之间的随机整数
rand()*(大-小)+小
selectfloor(rand()*11+11)
系统函数
select123+123
select'123'+'123'
select123+'123'--内置有个转换
select123+'abc'--+号两边的数据类型一定要统一
--convert(目标类型,操作数)
selectconvert(varchar(4),123)+'abc'
selectconvert(numeric(3,2),round(3.1415926,2))
注意:
select123+null
select'abc'+null
--null加任何数都为空
--聚合函数
--max()求最大值
--min()最小值
--avg()平均值
--sum()求和
--count()记录的条数
selectmax(price)fromtitles
selectmin(price)fromtitles
selectavg(price)fromtitles
selectsum(price)fromtitles
selectcount(*)fromtitles--count(*)不会忽略空值
聚合函数两大特点:
1.返回值只有一行一列。
2.所有的聚合函数忽略空值。
createtablestudentexam
(
stuidint,
stuscoreint
)
insertintostudentexamvalues(1,98)
insertintostudentexamvalues(2,96)
insertintostudentexamvalues(3,null)
selectavg(stuscore)fromstudentexam
--聚合函数的作用为了做统计。
--请查询,每类书籍的平均价格
select*fromtitles
select[type],avg(price)fromtitlesgroupby[type]
business13.7
mod_cook11
popu_com12
--请查询,每个出版社出版的最低的书籍价格
--出版社编号,最低价格
selectpub_id,min(price)fromtitlesgroupbypub_id
--请查询每个国家有多少个出版社
select*frompublishers
--国家数量
selectcountry,count(*)frompublishers
groupbycountry
--请查询每个月,每个出版社,出版的最贵的书籍价格
selectdatepart(mm,pubdate)as'月份',
pub_idas'出版社',max(price)as'价格'
fromtitles
groupbydatepart(mm,pubdate),pub_id
--在分组聚合的情况下,在select后面的列中,
--没有使用聚合函数的列,一定要出现在groupby中
第五课:
1.having筛选
2.select语句的完整结构和执行顺序
3.连接查询。
连接查询是用一条sql语句查询多张表的数据的方式。
连接查询的分类:
a.内连接innerjoin
b.外连接(有3种)
A.左外连接leftjoin
B.右外连接rightjoin
C.全外连接fulljoin
c.交叉连接crossjoin
做连接查询有一个前提条件,两张表之间要有公共字段。
公共字段要有两个要求
1.数据类型要一致。
2.这两个字段必须代表相同类型的实体。
连接查询语法
select列,列,列from表1innerjoin表2
on表1.公共字段=表2.公共字段
select列,a.列,b.列from表1asainnerjoin表2asb
ona.公共字段=b.公共字段
innerjoin内连接,返回的是两张表公共字段的交集。
leftjoin左外连接。
左外连接是以左表为基准,左表中的数据首先显示出来,
然后到右表中找匹配项,如果能找到则显示,如果找不到
则以空代替。
请查询商业书籍被哪些出版社出版过?
select*fromtitles
select*frompublishers
使用什么连接首先看,已知条件:
已知条件:商业书籍business
selectdistinctb.*fromtitlesasaleftjoinpublishersasb
ona.pub_id=b.pub_id
wherea.type='business'
注意:左表在join关键字前面的表,
右表在join关键字后面的表。
distinct去掉重复的数据。
请查询1991年出版过书籍的出版社信息。
已知条件:年份1991.
selectdistinctb.*fromtitlesasaleftjoinpublishersasb
ona.pub_id=b.pub_id
wheredatepart(year,a.pubdate)='1991'
右外连接:
是以右表为基准,右表的数据先显示,然后到左表中找
匹配,如果有显示出来,如果没有用空代替。
请查询新月书店出版过一些什么书籍?
selectdistincta.*fromtitlesasarightjoin
publishersasbona.pub_id=b.pub_id
wherepub_name='NewMoonBooks'
请查询每个出版社,出版过基本书籍?
要求:pub_name,出版数量。
selectpub_name,count(*)as'出版数量'
fromtitlesasarightjoinpublishersasb
ona.pub_id=b.pub_id
groupbypub_name
全外连接:
全外连接两表都是准心,两表中的数据全部出来,互相找匹配
找得到就显示,找不到以空代替。
全外连接返回两表数据的并集。
fulljoin
交叉连接:
又名笛卡尔积,没有实际项目意义。
交叉连接的数量为两表数量的乘积。
注意:交叉连接不需要写公共字段。
selectsname,a.studentsid,courseid,score
fromstudentsasacrossjoinscoreasb
三表连接的写法:
union的两种用法。
复制表的3种写法。
--聚合分组。
--分组的目的是为了做聚合运算的。
select列名,*4
from表名1
where条件表达式2
groupby列--分组3
having条件表达式--筛选5
orderby列desc/asc6
--查询每类书籍的平均价格
select*fromtitles
select[type],avg(price)fromtitlesgroupby[type]
select*frompublishers
--请查询每个国家对应的出版社数量
selectcountry,count(*)frompublishersgroupbycountry
--请查询每个月每个出版社出版的最贵的书籍的信息。
selectpub_id,datepart(mm,pubdate)as'月份',
max(price)as'最高价格'
fromtitles
--wheremax(price)>10
groupbypub_id,datepart(mm,pubdate)
havingmax(price)>10
--在之前的基础上,去除最高价格在10块以下的书籍的信息
3.聚合函数不能出现在where条件中
--连接查询
--联合union
select*fromaa
union--union是纵向的联合会去重复的
select*fromcc
select*fromaa
unionall--unionall不去重复的纵向联合
select*fromcc
两表做联合要满足
1.表结构要一致。
2.数据类型要兼容。
最后产生的新的结果集的列名以第一张表的列名为主
insertintoaa
select3,3union
select4,4union
select5,5union
select6,6
--一次性插入多条数据的语法。
--复制表:
select*fromtitles
--将现有的表复制到一张新表中
select*intowoyunfromtitles
--1.创建了一张与原本相同结构的表
--2.把数据复制到这个新表中
--注意:woyun这张表一定要是一张新表。
select*fromwoyun
deletefromwoyun
--将现有的数据复制到一张相同结构的表中
insertintowoyunselect*fromtitles
--注意:woyun表必须是已存在的表。
select*intowokaofromtitleswhere1<>1
--用来复制表结构。
第六课:
1.权限控制:
--sqlServer有3重安全级别
--1.登录用户:
sp_addlogin'jym','jqx'
--注释:‘jym’是用户名,‘jqx’是密码,表示创建了一个叫‘jym’的用户
--2.数据库用户:
useMySchool
sp_grantdbaccess'jym','mll'
--注释:‘ml’是‘jym’的别名,表示可以查看数据库,但不能操作表
--3.为数据库用户授予权限:
grantinsert,delete,update,select
onclasstomll--数据库级别权限
grantcreatetabletomll--系统级别权限
--注释:授予增、删、改、查的权限
--收回权限:
revokeinsert,delete,update,selectfrommll
--角色:
--是一种权限的集合
useMySchool--切换到数据库
sp_addrole'znl'--注释:创建角色
grantinsert,delete,update,selectonclass
toznl
grantinsert,delete,update,selectonlesson
toznl
--为角色授予权限
sp_addlogin'lyq','wjq'
sp_addlogin'wjq','lyq'
useMySchool--切换到数据库
sp_grantdbaccess'lyq','sl'
sp_grantdbaccess'wjq','xs'
sp_addrolememberznl,lyq--将角色加入到
sp_addrolememberznl,wjq
denyinsert,delete,update,selectonclasstolyq
--禁用某个用户在角色中的权限
2.数据库设计:
--1.为什么要设计数据库?
不设计数据库可能产生一些问题:
1.数据冗余
2.添加异常
3.删除异常
4.更新异常
--2.软件开发的生命周期:
a.可行性及需求分析:
需求分析(常用方式:座谈式,诱导式,原型式):数据分析,业务分析
注意:需求分析做好,撰写需求文档,交给客户签字。
b.概要设计阶段:
1.标识实体2.确立实体之间的关系3.标识实体的属性
绘制E-R图,Entity-RelationShip
c.详细设计阶段:
将E-R图,转换成数据库,对数据库的合理性进行评定
使用数据库规范理论(三大范式理论)
d.代码编写阶段:
实现项目的所有功能。
e.软件测试阶段:单元测试,集成测试,压力测试,用户测试(培训用户使用)
f.安装部署阶段:
--3.绘制E-R图:
方形:表示实体(名词)椭圆形:表示属性(名词)棱形:表示关系(动词)
确立关系:
1对1,1对多,多对1,多对多
确立关系中的重点:在项目中不允许有多对多的关系
如何处理:把多对多拆成两个1对多
--4.使用三大范式理论来评定数据库设计:
三大范式:
第一范式:要求表中的每一个列都必须具有原子性(每个列都不可分割)
解决办法:拆
第二范式:在满足第一范式的基础上,去除部分函数依赖
1.一般来说,一个表如果有复合主键,绝对不满足第二范式
2.表是否描述一件事情
解决办法:拆
第三范式:在满足第二范式的基础上,去除传递函数依赖
解决办法:拆
部分函数依赖:表中的非主键列,部分依赖主键列
传递函数依赖:表中的非主键列传递的依赖于主键列