第一课
一.熟悉SQL Sever 平台环境
1.服务管理器
启动:开始 → 程序 → SQL Sever → 服务管理器
服务器名:建议先接到自己的机器上。(我的电脑 → 属性 → 网络标识)
2.企业管理器
新建库(库名:school)
新建表(表名:student)
字段
|
类型
|
长度
|
可否为空
|
id
|
int
|
4
|
|
name
|
varchar
|
8
|
|
age
|
int
|
4
|
√
|
gradeint
|
int
|
4
|
|
将“id”字段设置为主键(在该字段上单击右键 → 设置主键)。
主键:不可重复的字段,并且不可为空。
录入数据:在表上单击右键 → 打开表 → 返回所有行。
二.SQL语句
1.查询
启动“查询分析器”:在“企业管理器”窗口,“工具”→“SQL查询分析器”
查询语句:
select 字段名 from 表名 where 条件
例:
select age from dbo.student where age=25
select name from dbo.student where grade=4
(库名要选择school,dbo指权限,dbo.student可以从左边窗口的“树”中拖拽)
字段名:
1)* 选择所有字段 例:select * from dbo.student
2)选择某个字段,如 name。例:select name from dbo.student
3)选择多个字段,如 id,name (逗号为英文状态下)。可包含*,可以重复。
上机实验,看看下面两条语句的输出结果有何不同:
select id,name from dbo.student
select name,id from dbo.student
4)字段重命名,如 id as iidd 。支持中文。例:select id as 学号 from dbo.student
可与3)结合使用:
select id as 学号,name as 姓名,age as 年龄,grade as 年级 from dbo.student
5)运算,如 age-grade+1。
例:select name as 姓名,age-grade+1 as 入学年龄 from dbo.student
select 3500*12*(1-0.15) as 年薪
(不涉及表的操作,可以去掉from,只显示一行,相当于计算器。)
6)在字段名前加 distinct ,如 distinct grade 。distinct 表示“唯一的”,如果有重复的记录,则只显示一个。
7)top n * ,显示前n条记录。
8)表名.字段 ,多个表时使用。
9)函数(字段)
各函数的用法,可参考帮助。(查询分析器里,帮助 → 目录与索引 → 索引,然后输入函数名,回车后即可看到用法。)
一些常用的函数:
① len( )
select len(name) from dbo.student
② left( )
select left(name,1) from dbo.student
select distinct left(name,1) from dbo.student
select left(name,1)+'先生' from dbo.student
③ right( )
select right(name,1)+'先生'
其他:lower( ),upper( ),substring( ),cast( ),get data(),convert( ),ltrim( ),stuff( ),charindex( ),dateadd( ),dateiff( )
10)聚组函数
①max( )
select max(age) as 最大年龄 from dbo.student
② min( )
select min(age) as 最小年龄 from dbo.student
③avg( )
select avg(age) as 平均年龄 from dbo.student
④sum( )
select sum(age) as 年龄总和 from dbo.student
以上四个函数的参数要求为数值型!
⑤ count(*)
求记录总数, * 指可为任意型
第二课
条件:
1)字段可以使用运算符 = , > , < , >= , <= , <>
如 select * from dbo.student where age=30
2)字段 in ( , , )
如 select * from dbo.student where age in (30,27.29)
3)字段 between
and
如 select * from dbo.student where age between 25 and 28
4)使用通配符
①字段 like ‘%b’
如:查询name字段中最后一位是b的
select * from dbo.student where name like ‘%b’
“%”代表若干个字符:
name like ‘b%’、name like ‘%b%’、name like ‘%b%q’
②字段 like ‘_b’
“_”为下划线,代表一个字符
5)上堂课讲到的字段的各种变化均可与前四种变化结合使用。
如 select * from dbo.student where len(name)>=3
6)使用关系运算符
①[条件] and [条件]
条件的组合,前四种变化均可使用,如:
select * from dbo.student where age>31 and name like ‘%b’
②[条件] or [条件]
and 与 or 均可多个并列使用,也可组合使用:
③[条件] and [条件] or [条件]
④not([条件])
前面讲到的所有条件均可被not否定。
2.删除
delete from [表名] where [条件]
删除语句中的条件与查询语句中的使用方法一样,如:
delete from dbo.student where age=30
delete from dbo.student where name like ‘b%’
3.更改
update 表名 set 字段,字段
update 表名 where 条件
如:删掉所有大四的学生,其他年级的加1
delete from dbo.student where grade=4
update dbo.student set grade=grade+1
4.插入
insert into 表名 values( , , ),如:
insert into dbo.student values(520,Felix,12,02)
表名后面可以列出字段,但要求省略的字段是在数据库设计时可以为空的
insert into dbo.student(id,name,grade) value(520,Felix,02)
范式分析
范式(NF),指导我们在数据库调研中,拆表的工具和规则。
例:给哈师大做一个数据库
学号,姓名,性别,年龄,学生来自哪个省,系,系主任,系主任工资,基本工资,补贴,奖金,课程,教材
原则:
1.简单字段(简单域):不允许表内包含表
所以,系主任工资与基本工资,补贴,奖金不可同时存在于一个表,要单独建立一个工资表。
而工资表里要是只有基本工资,补贴,奖金这三项,还要知道是给谁的工资,所以,要加上主任的名字。
第一次拆分结果:
1)学号,姓名,性别,年龄,省,系,系主任,课程,教材
2)工资表:基本工资,补贴,奖金,主任名(不用再拆)
2.唯一依赖
字段A、B,决定了A即确定了B,叫做B依赖于A。如:A为学号,B为姓名。
如果一个字段能唯一的决定其他字段(其他字段都能从它推断出来),那么就将此字段设置为主键。
第二次拆分结果:
1)学号,姓名,性别,年龄,省,系,系主任
2)课程基本情况表:课程,教材,课程描述
3.无传递依赖
传递依赖:若A→B,B→C,则A→C
表中不允许有传递依赖,A→B,B→C要分成2个表。
学号→系,系→系主任
第三次拆分结果:
1)学生基本情况表:学号,姓名,性别,年龄,省,系
2)系基本情况表:系,系主任
4.无多对多
多对多,如学生与课程之间,一个学生,可以选修多门课,而一门课也可以被多个学生学。
这种情况下,就要在两个表(学生基本情况表,课程基本情况表)建立一个中间表:选课表,
中间表一般要先把两个表的主键写上,所以,
选课表:课程,学号,成绩
5.代码表
有一些字段的记录种类确定,而且记录容易输入错误,这种情况要建立代码表,如:
省:省号,省名
课程:课程号,课程名
系主任:主任编号,主任名
代码表原则:
1)易记(编号往往用字符串,如:黑龙江,HLG)
2)易扩展(位数多些)
代码表的另一个好处就是,如果记录名字更改,则只改代码表即可。如:要是一万个学生来自黑龙江,若是有一天黑龙江改名为白龙江,那只要在“省”代码表里,将省名改过来就可以,而无须在“学生基本情况”表里,将每一个黑龙江都改为白龙江。
最后的结果:
学生基本情况表:学号,姓名,年龄,省号,系
系基本情况表:系,系主任名,主任编号
工资表:主任编号,主任名,基本工资,补贴,奖金
课程基本情况表:课程号,课程名,课程描述
选课表:课程号,学号,成绩
省:省号,省名
课程:课程号,课程名
系主任:主任编号,主任名
拆分例子:
给一个酒店做一套管理系统,假设职工只在一个酒店工作。
职工编号,职工姓名,职工岗位,年龄,工资,加班费,基本工资,奖金,酒店号,酒店老板,老板年龄,员工出生地
1.简单字段
工资表:职工号,基本工资,加班费,奖金
2.唯一依赖
员工基本情况表:职工号,职工名,年龄,酒店号,省号
3.无传递依赖
酒店基本情况:酒店号,酒店名,地址,老板号
企业经营者基本情况:老板号,老板名
4.无多对多
任职情况表:员工号,岗位号
岗位表:岗位号,岗位名,岗位描述
第三课
varchar与char的差别:varchar是按链表式开辟空间。char是按内存开辟空间,无论是否存储数据都开辟空间。
delete与drop table的差别:
delete from 表 where 条件
删除表中内容
drop table 表
将表从内存中删除
insert into 表(字段) value(值)
插入一条记录
批处理增加:
insert 表(字段)
select 字段
unionAll select 字段
unionAll select 字段
……
将表1的数据复制到表2:(两个表中的字段类型必须一样)
insert 表1(字段)
select 字段 from 表2
update 表 set 字段=值 from 表2 where 条件
多表关系查询:1.内连
2.外连
3.全连
4.合并
5.嵌套
嵌套:通过另一个表的条件显示本表的信息。
例1:查询60分以下的学生姓名
学生表:学号,姓名
成绩表:学号,课号,成绩
select 姓名
from 学生表
where 学号 in(select 学号 from 成绩表 where 成绩<60);
例2:
读者表:借书证号,姓名,身份证号,性别,年龄,工作单位,照片
罚款:借书证号,书号,罚款日期,罚款金额,过期天数
还书:书号,借书证号,还书日期
借阅:书号,借书证号,借阅日期
图书:书号,书名,作者,出版社,数量,单价
1)查询借阅时间为2003年1月1日以前的读者姓名、年龄和工作单位
select 姓名,年龄,工作单位
from dbo.读者
where 借书证号 in(select 借书证号 from dbo.借阅 where 借阅日期<‘2003-01-01’);
2)罚款金额小于200的书名
select 书名
from dbo.书名
where 书号 in(select 书号 from dbo.罚款 where 罚款金额<200);
3)借C++的读者姓名、年龄、工作单位
select 姓名,工作单位,年龄
from dbo.读者
where 借书证号 in(select 借书证号
from dbo.借阅
where 书号 in(select 书号
from dbo.图书
where 书名='C++'));
内连:通过两个表共同的关系,显示两个表的信息。(内连包含嵌套)
1)select * from 表1 inner join 表2 on 关系 where 条件
select * from 表1 a inner join 表2 b on 关系 where 条件(将来可用a代替表1,b代替表2)
例1:select * from 学生表 inner join 成绩表 on 学生表.学号=成绩表.学号
或 select * from 学生表,成绩表 where 学生表.学号=成绩表.学号
例2:select * from dbo.图书,dbo.借阅 where dbo.借阅.书号=dbo.图书.书号
显示读者姓名、借阅时间
select dbo.读者.姓名,dbo.借阅.借阅时间
from dbo.读者
inner join dbo.借阅
on dbo.读者.借书证号=dbo.借阅.借书证号
三个表关联:
select dbo.读者.姓名,dbo.借阅.借阅日期,dbo.图书.书名
from dbo.读者
inner join dbo.借阅
on dbo.读者.借书证号=dbo.借阅.借书证号
inner dbo.图书
on dbo.借阅.书号=dbo.图书.书号
外连(最常用,包含内连)
左连:left join
select * from 表1 left join 表2 on 表1.字段=表2.字段
表1的所有信息全部显示,表2只显示和表1共有的信息。如:
表a:
表b:
左连后:
a
|
b
|
c
|
c
|
1
|
11
|
1
|
11
|
2
|
22
|
Null
|
null
|
3
|
33
|
Null
|
Null
|
※左连后显示的表为虚拟表,内存中并不存在。
drop table a,b
新建表a,b(SQL语句)
create table a(a.int,b.int)
insert a
select 1,11
unionAll select 2,22
unionAll select 3,33
create table b(c.int,d.int)
insert b
select 1,11
unionAll select 4,44
unionAll select 5,55
显示表a,b中内容
select * from a
select * from b
将a,b左连
select * from a left join b on a.a=b.c
右连:right join
全连(两表罗列): full join
a,b全连后:
a
|
b
|
c
|
d
|
1
|
11
|
1
|
11
|
2
|
22
|
Null
|
Null
|
3
|
33
|
Null
|
Null
|
Null
|
Null
|
4
|
44
|
Null
|
Null
|
5
|
55
|
select * from a full join b on a.a=b.c
注:a full join b
与b full join a
显示结果不一样。
合并:记录罗列在一起
select 字段1 from 表1
union
select 字段2 from 表2
注:1)表1,表2字段个数相同且对应的类型一样
2)字段1,字段2相同
对库的操作:数据备份,导入、导出
热备份:
控制台根目录下,在库上单击右键 → 所有任务 → 备份数据库,
SQL Server备份 → 库名 → 常规 → 添加 → 文件名,起一个备份文件名,扩展名为.bak,选择备份文件存放的文件夹,确定。
冷备份:
把“服务管理器”停了,打开文件夹“Program Files→MS SQL Server→MSSQL→Data”,选择要备份的库文件(*.MDF,*.LDF),复制到别处。
还原:
新建库,在库名上点右键 → 所有任务 → 还原数据库 → 从设备,
单击“选择设备”→ 添加,找到备份的文件(*.bak),确定。
注:1)在“选项”中,应将“物理文件名”,改为备份文件名。
2)在“选项”中,应将“在现在数据库上强制还原”一项选中。
导入、导出:
在库文件上单击右键 → 所有任务 → 导入(导出)数据 → 下一步。
选择数据源,
服务器:local为本地服务器,
在“数据库”中选择要导入(导出)的库,下一步。
目的:选择一个,如果选择的是Excel或文本文件,应新建一个文件。
服务器:选择要导入(导出)的服务器,下一步。