郝斌 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 学习笔记的更多相关文章
- 郝斌老师C语言学习笔记(一)
		
在给变量分配内存时,很可能这段内存存在以前其他程序使用留下的值.当使用VC编译器,若编译器发现没有给变量赋值而使用,就会返回一个以“85”开头的很大的数字(此时该段内存中为一个垃圾数,为了避免出现较常 ...
 - [C]郝斌C语言课程大纲及笔记
		
本笔记整理于郝斌老师C语言课程,做学习参考之用. 1.[编程笔记]第一章 C语言概述 2.[编程笔记]第二章 C语言预备知识 3.[编程笔记]第三章 运算符与表达式 4.[编程笔记]第四章 流程控制 ...
 - 大一C语言学习笔记(5)---函数篇-定义函数需要了解注意的地方;定义函数的易错点;详细说明函数的每个组合部分的功能及注意事项
		
博主学习C语言是通过B站上的<郝斌C语言自学教程>,对于C语言初学者来说,我认为郝斌真的是在全网C语言学习课程中讲的最全面,到位的一个,这个不是真不是博主我吹他哈,大家可以去B站去看看,C ...
 - Deep Learning(深度学习)学习笔记整理系列之(八)
		
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...
 - MySQL实战45讲学习笔记:事务隔离级别(第三讲)
		
一.隔离性与隔离级别 1.事务的特性 原子性 一致性 隔离性 持久性 2.不同事务隔离级别的区别 读未提交:别人改数据的事务尚未提交,我在我的事务中也能读到.读已提交:别人改数据的事务已经提交,我在我 ...
 - 学习笔记-AngularJs(二)
		
在接下来学习angularjs中,我按照的就是之前 学习笔记-AngularJs(一)所讲的目录来搭建一个学习的项目,做一个互联网大佬人物简介的例子,当然也可以使用angualrjs上面提供的官方例子 ...
 - amazeui学习笔记--css(布局相关1)--网格Grid
		
amazeui学习笔记--css(布局相关1)--网格Grid 一.总结 基本使用 1.div+class布局:amaze里面采取的就是div+class的布局方式 <div class=&q ...
 - 数据结构学习笔记——顺序数组1
		
线性表最简单的刚开始就是顺序存储结构,我是看着郝斌的视频一点一点来的,严蔚敏的书只有算法,没有具体实现,此笔记是具体的实现 为什么数据结构有ADT呢,就是为了满足数据结构的泛性,可以在多种数据类型使用 ...
 - js学习笔记:webpack基础入门(一)
		
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
 
随机推荐
- poj 1284 Primitive Roots(未完)
			
Primitive Roots Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3155 Accepted: 1817 D ...
 - Eclipse更改颜色主题
			
通过在线安装的方式 Help -> Install New Software Work with: 输入 http://eclipse-color-theme.github.com/update ...
 - LINQ学习(1)
			
LINQ LINQ,语言集成查询(Language INtegrated Query)是一组用于C#和Visual Basic语言的扩展.它允许编写C#或者Visual Basic代码以查询数据库相同 ...
 - zato集群部署
			
注: SQL ODB和Cluster’s config需要首先依次创建,其他三个次序随意 对不熟悉的命令,使用server create *** -h 查看帮助文档 修改完后配置文件,要重启(zato ...
 - vue打包后运行在本地/非服务器端环境的访问路径
			
vue打包前的配置: 项目目录下--> config文件夹---> index.js: build: { assetsPublickPath: './', // 设置成相对路径 ...
 - Hadoop学习笔记(4) ——搭建开发环境及编写Hello World
			
Hadoop学习笔记(4) ——搭建开发环境及编写Hello World 整个Hadoop是基于Java开发的,所以要开发Hadoop相应的程序就得用JAVA.在linux下开发JAVA还数eclip ...
 - SpringCloud实战之初级入门(一)— eureka注册中心
			
目录 写在前面 1.资料目录 2.环境介绍 3.eureka注册中心 3.1 创建工程 3.2 启动工程 5.eureka注册中心集群高可用 6.结语 7.一点点重要的事情 写在前面 我在软件行业浸泡 ...
 - Can't read stdin: end of file found
			
问题是在我修改svn的账号和密码后出现的,因为百度出来的情况只有一种答案,所以记录一下我的情况,给其他人多一种排查思路.问题根源是,由于该版本库只有一个账号,更改了账号密码,没有同步修改post-co ...
 - SPOJ2666 QTREE4
			
我是萌萌的传送门 我是另一个萌萌的传送门 一道树分治……简直恶心死了……我在调代码的时候只想说:我*************************************************…… ...
 - 1-2 Sass安装(windows版)
			
在 Windows 平台下安装 Ruby 需要先有 Ruby 安装包,大家可以到 Ruby 的官网(http://rubyinstaller.org/downloads)下载对应需要的 Ruby 版本 ...