郝斌 SqlServer2005 学习笔记
Posted 每天进步一点
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了郝斌 SqlServer2005 学习笔记相关的知识,希望对你有一定的参考价值。
1.0 什么是数据库
狭义:存储数据的仓库。
广义:可以对数据进行存储和管理的软件以及数据本身统称为数据库。
另外一种说法:数据库是由表、关系、操作组成。
2.0 为什么要学习数据库
几乎所有的应用软件的后台都需要数据库。
数据库存储数据占用的空间小,容易持久化。
存储比较安全。
容易维护和升级。
数据移植比较容易。
简化对数据的操作。
3.0 数据结构和数据库的区别
数据结构是在系统软件级别研究数据的存储和操作。(内存)
数据库是在应用软件级别研究数据的存储和操作。(外部存储)
4.0 数据库中连接概念
5.0 对内存数据的操作,编程语言更加灵活;对于硬盘数据的操作,通过数据库管理软件更加容易。但是对于复杂的数据操作,当通过数据库语言没法操作时,通常把数据先写入内存通过编程语言处理以后,再存入数据库。
6.0 建议初学者从三个方面学习数据库
? 数据库是如何存储数据的
字段、记录、表、约束
? 数据库是如何操作数据的
insert、update、delete、TL-SQL、存储过程、函数、触发器
? 数据库是如何显示数据的
select(查询)
7.0 创建数据库
8.0 删除数据库
9.0 数据库的备份和还原
10.0 数据库的分离和附加
11.0 用户的创建和密码修改
安全性→登录名
12.0 表以及表相关的基本概念
字段(也叫 列):模拟的是某一个事物的某一个静态的特征。
记录(也叫 元组):字段的组合,表示的是一个具体的事物。
表:记录的组合,表示的是同一类事物的集合。
表、字段、记录的关系:字段是事物的属性,记录是事物本身,表示事物的集合。
13.0 表的创建
create table tabel_name( 字段名 数据类型 约束 );
注意:SQLServer 创建表的时候,最后一个字段的都好最好不写。如果最后一个字段带上逗号oracle会报错。
14.0 主键和外键
主键:能够唯一标识一个事物的一个字段或者多个字段的组合。
外键:是指另外表中的主键(也可以是唯一键)。包含外键字段的表示外键表。外键也可能来自本表的主键。
外键所在的表是子表(外键表),外键依赖的那个表叫做主表(主键表)。
通过外键约束从语法上保证了本事物所关联的其他事物一定是存在的。
事物和事物之间的关系是通过外键来体现的。
在进行删除操作的时候,有主外键关系的表之间,要先删除外键表,再删除主键表。如果先删除主键表,会报错,因为这会导致外键表中依赖的数据找不到。当然也可以先删除主外键关系,然后随便先删除那张表。
15.0 什么是约束
对一个表中的属性操作的限制叫做约束。
主键约束 primary key
外键约束 foreign key (id) references outTable (id) ;
检查约束 check (a>1000 and a<8000)
保证事物属性的取值在合法的范围之内。
默认约束 default ( ‘男’)
保证事物的属性一定会有一个值。
唯一约束 unique
主键不可以为null,但是唯一约束的字段是可以为null。
保证事物属性的取值不重复。
SQLserver1 唯一约束只允许有一列为null。
oracle 唯一约束允许多列为null。
非空约束 not null
保证该属性一定有值。
默认字段的值可以为null。
注意:约束可以组合使用
16.0 关系
关系的分类:
一对一:
一般可以把两个事物设计在一张表中;
也可以设计为两张表,通过一个关系表维护这两个事物。
也可以设计为两张表,在其中一个表中设置外键。
一对多:
一般在多的一方的表中增加一个外键。
多对多:
多对多必须新建一张关系表,把多对多关系转化为一对多关系。
关系表,有两个外键,分别来自多对多的两张表。
关系表的主键一般是联合主键,是各个字段组合形成的主键。
关系的实现:
通过外键来体现表和表之间的关系。
17.0 查询分析器显示行号
工具→选项
18.0 数据库关系图
19.0 查询 之 查询所有
– * 代表所有的列
select * from emp;
– 计算列和别名(as可以省略,别名用双引号,或者不用)
select ename, sal*12 as “年薪” from emp;
–查询字段可以是一个常量
select ename, sal*12 as “年薪”, 5, ‘aa’ from emp;
注意: oracle的别名不允许使用单引号,但是SqlServer却允许。
– SqlServer没有问题,但是oracel会报错
select *, e.ename from emp e;
– SqlServer 和oracel都执行成功
select e.*, e.ename from emp e;
20.0 查询 之 distinct
– distinct 去掉查询列表组合的重复,只能写在所有查询字段的前面
select distinct deptno from emp;
注意:distinct 对 null 的处理是多个null会输出一个。
21.0 查询之 between … and …
–不包含1500 和3000
select * from emp e where e.sal > 1500 and e.sal<3000;
–包含1500 和3000
select * from emp e where e.sal between 1500 and 3000;
–以下三条是等价写法
select * from emp e where e.sal >= 1500 and e.sal<=3000;
select * from emp e where not e.sal < 1500 and not e.sal>3000;
select * from emp e where not (e.sal < 1500 or e.sal>3000);
– not between…add…
select * from emp e where not e.sal between 1500 and 3000;
22.0 查询之 in
– in
select * from emp e where e.sal in (1500,2500,3000);
–等价写法
select * from emp e where e.sal = 1500 or e.sal = 2500 or e.sal = 3000;
– not in
select * from emp e where e.sal not in (1500,2500,3000);
–等价写法(!= 和<>都是不等于)
select * from emp e where e.sal != 1500 and e.sal <> 2500 and e.sal != 3000;
注意:not in 转化为逻辑表达式时是 and
23.0 查询之top
– top (oracle通过rownum)
select top 5 * from emp;
– 百分数如果不是整数,向上取整
select top 50 percent * from emp;
–注意:top一般是在最后执行,where等子句先执行
24.0 null
– 注意null 不能用=,!=,<>比较
select * from emp e where e.comm is null;
select * from emp e where e.comm is not null;
–因为null参与的表达式运算结果是null,因此要通过isnull函数避免,否则没有奖金的员工年薪为null
select ename, sal*12+isnull(comm,0) as “年薪” from emp;
25.0 order by 字段名 asc/desc
select ename, sal*12+isnull(comm,0) as “年薪” from emp order by 年薪desc;
26.0 like
– like(%代表个或多个字符,_代表一个字符)
select ename,deptno,sal from emp e where e.ename like ‘%king%’;
– 注意:字符的大小写有区别,实际开发中,一般把like两边的都转为大写或小写
select ename,deptno,sal from emp e where upper(e.ename) like upper(‘%king%’);
–第二个字符是A到F中的一个(模糊查询不仅是_和%,还有一些正则表达式匹配)
select * from emp where ename like ‘_[A-F]%’;
–模糊查询中的转义,通过escape 指定转义的字符,默认是\
select * from emp where job like ‘%_%’ escape ‘\’;
27.0 函数的分类
单行函数:输入一个行,返回还是一行。
多行函数:输入多行,返回是一行。聚合函数是多行函数。
常见聚合函数:
max() min() avg() count() sum()
select count(*)from emp; –返回所有的行数
select count(deptno) from emp; – 返回值,重复的部门编号也会被统计
select count(distinct deptno) from emp; –返回值,重复的部门编号只统计一次
select count(comm) from emp; –返回值为,说明为null的列不会被统计
–返回所有的行数,可以认为1 是在查询字段中添加的一个常量,统计这个常量的个数
select count(1) from emp;
–多个聚合函数可以同时使用
select max(sal),min(comm),avg(sal),count(*) from emp;
28.0 group by
–聚合函数和分组一块使用,是先分组,然后对分组进行聚合
–注意:查询的字段要不包含在聚合函数中,要不包含在分组子句中(非常重要)
–换句话说:使用group by 之后,select中只能出现分组house的整体信息,不能出现组内详细信息
select deptno, avg(sal) from emp group by deptno;
–按照多个字段分组,聚合函数统计的是最小的那个分组信息
select deptno,ename from emp group by deptno,ename;
–分组中有null,null也会被当做一组
select comm,count(1) from emp group by comm;
–默认也可以理解为这里是把当前整张表的数据为一个分组
select max(sal),min(comm),avg(sal),count(*) from emp;
29.0 having 对分组之后的数据进行过滤
select deptno, avg(sal) from emp group by deptno having avg(sal)>2000;
–(报错) 不能用别名avgsal,原因是条件执行在前。
select deptno, avg(sal) as avgsal from emp group by deptno having avgsal >2000;
–(报错) 分组以后没有ename这一列,当然也就不能再having中使用
select deptno, avg(sal) from emp group by deptno having ename like ‘%a%’;
–正确
select deptno, avg(sal) from emp group by deptno having count(ename)> 5;
–名字不包含a,输出平均工资大于的部门和平均工资
select deptno,avg(sal) from emp where ename not like ‘%a%’ group by deptno having avg(sal) > 2000;
–注意:having子句中不能使用查询列表中的别名.其实where子句中也不能使用。
–注意:where子句中不能使用聚合函数
– (报错)ORDER BY 子句中的列”emp.ename” 无效,因为该列没有包含在聚合函数或GROUP BY 子句中。
select deptno, avg(sal) from emp group by deptno having avg(sal)>2000 order by ename;
30.0 连接
–笛卡尔积
select count(deptno) from emp; –14行
select count(deptno) from dept; – 5行
select count(1) from emp,dept; –70行14*5 = 70
select e.ename, e.deptno,d.deptno, d.dname from emp e ,dept d;
– 对笛卡尔积进行过滤14行
select e.ename, e.deptno,d.deptno, d.dname from emp e, dept d where e.deptno = d.deptno;
–内连接14行 3+5+6 = 14
select deptno, count(1) from emp group by deptno;
select e.ename, e.deptno,d.deptno, d.dname from emp e join dept d on e.deptno = d.deptno;
–查询工资等级
select * from emp e join dept d on e.deptno = d.deptno
join salgrade s on e.sal between s.losal and hisal;
–输出工资最高的前三名的员工的姓名,工资.工资等级,部门名称,员工的名字中不包含a
select top 3 ename,sal,grade,dname
from emp e join dept d on e.deptno = d.deptno
join salgrade s on e.sal between s.losal and hisal
where ename not like ‘%a%’
order by e.sal desc;
– 查找每个部门的编号,该部门所有员工的平均工资平均工资的等级
select deptno,avgsal,grade
from (select deptno, avg(sal) avgsal from emp group by deptno) t
join salgrade s on t.avgsal between s.losal and hisal ;
–查询出每个员工的领导的姓名
select e1.empno,e1.mgr,e1.ename, e2.empno,e2.ename
from emp e1 join emp e2 on e1.mgr = e2.empno;
–查询出emp表中所有领导的姓名
select * from emp where empno in (select mgr from emp);
–左外连接(左外连接的结果行数可能等于或大于左表的函数)
select * from emp e left join dept d on e.deptno = d.deptno;
–右外连接(同理)
select * from emp e right join dept d on e.deptno = d.deptno;
31.0 identity 表示主键的值自动增长。
语法格式:identity[(m,n)]
m:表示的是初始值,n表示的是每次自动增长的值。
要么同时指定m和n的值,要么m和n的值都不指定,取默认值(1,1)。
注意:数据类型为整型的列才可以被定义成标识列。
dbcc checkident(‘emp’,reseed,3) 表示把表emp的自动增长的初始值设置为3。
给identity字段插入数据
set identity insert scott.dbo.dept on;
表示把数据库scott中表dept中给identity修饰的字段插入值的权限打开;
insert into dept (deptid) values(100);
32.0 视图
33.0 事务
begin transaction 开始事务
commit transaction 提交事务
rollback transaction 回滚事务
事务的三种运行模式:
? 自动提交事务
每条单独的语句都是一个事务,如果成功执行,自动提交事务;如果错误,则自动回滚。SqlServer采用的就是这种模式。
? 显式事务
每个事务均以begin transaction 语句显式开始。
以commit 或 rollback显式提交和回滚事务。
? 隐式事务
注意:在SqlServer中不能单独的使用commit,rollback语句。
事务的特性:
? 原子性,
? 一致性
? 隔离性
? 持久性
34.0 分页
–分页查询
select top 3
from emp
where empno not in (select top 5 empno from emp order by sal desc)
order by empno desc;
–分页模式
select top n from A where A_id not in (select top(m-1)* A_id from emp);
表设计()
主键设计一般单独添加一列,这一列不能是有实际意义的事物的属性。
强烈建议不要使用有业务含义的字段充当主键。
主键命名一般是:表名ID,或者是 表名_id。
以上是关于郝斌 SqlServer2005 学习笔记的主要内容,如果未能解决你的问题,请参考以下文章