poetries / mywiki

:books:收集整理日常发现的好资源、前端资源汇总。关注公众号「前端进阶之旅」,一起学习
668 stars 202 forks source link

SqlServer2005学习笔记 #19

Open poetries opened 8 years ago

poetries commented 8 years ago

数据库学习大纲


第一部分:数据库相关概念

什么是数据库

数据库是由表、 关系、 操作组成

为什么需要数据库

数据库的安装和卸载

预备知识

数据结构和数据库的区别

什么是连接 【重点】

建议初学者从三个方面学习数据库数据库是如何存储数据的

必各的一些操作

数据库是如何解决数据存储问题的 【最基础内容, 必须掌握】

1.表的相关数据

表和字段、记录的关系

2. create table命令

3. 什么是约束

事物和事物之间的关系是通过外键来体现的

间题:

ul,i que键是否允许多列为空?

答:

not null

要注意nu11和 default的区别

4. 表和约束的异同

在多的一方添加外键

例子

6. 主键

7. 外键

注意:

问题:

答集: 先删外建表 如果先删主键表,会报错,因为这会导致外建表中的数据引用失败


第二部分:查询

査询【最重要难度最大,考试必考内容,强烈建议所有的学生都要熟练掌握査询的内容】

1.计算列

select* from emp;

select empno, ename from emp

seleot ename, sa1 from emp;

select888 from emp; --ok -一输出的行数是emp表的行数 每行只有一个字段,

select5; --ok -一不推荐

注意:

2. distinct【不允许重复的】

select distinct deptno from emp; --distince deptno会过滤掉重复的deptno select distinct comm from emp; --distinct也可以过滤掉重复的nu11 或者说如果有多个nu11只输出一个 select distinct comm, deptno from emp;-一把comm和deptno的组合进行过滤select deptno, distinct comn from emp1--error逻辑上有冲突

3. between【在某个范围】

4. in【属于若干个弧立的值】

`selectfrom emp where sa1 in(1500, 3000, 5000) 等价于 select from emp where sa1=1500 or sa1=3000 or sa1=5000``

select*from emp where salnot in(1500, 3000, 5000)

select* from enp where sa1〇1500 and sat〇3000 and sat〇5000

5. top【最前面的若干个记录专属于sqlserver的语法,不可移植到其他数据库】

select top5 *from emp; `select top15 percent* from emp;-一输出的是3个,不是2个 select top5 from emp;``` --error

6. nu11【没有值空值】

select* from e叩 where comm 〇 null;-一输出为空error select*from emp where comm !=nu11;-一输出为空error select* from emp where comm = nu11; -一输出为空error

create table t1 (:l,lamenvarchar(20), cnt int, riqi datetime); insert into t1 values(nu1l, nu11, nu11); -0K

7. order by 【以某个字段排序】

例子:

select* from emp order by sa1; 一默认是按照升序排序

select*from emp order by deptno, sa1;

select*from emp order by deptno, sa1 desc

8.模糊査询 【搜索时经常使用】

[a-f]

[a, f]

[a-c]

select* from emp where enamelike'_[A-F]%'''-一把ename中第二个字符不是A也不是B也不是c也不是D也不是E也不是F的记录输出

注意:

select* from student where namelike'%\%%' escape'\' -一把name中包含有%的输出select* from student where namelike'%\_%' escape'\' 一把name中包含有_的输出

9.聚合函数【多行记录返回至一个值通常用于统计分组的信息】函数的分类

聚合函数的分类

返回表中所有的记录的个数

select count(*) from emp; -一返回emp表所有记录的个数 count(字段名)

select count(distinct deptno) from emp; -一返回值是 统计deptno不重复的记录的个数

注意的问题

select ma:x(sa1), min(sa1), count(*) from emp;--ok select max(sa1) -最高工资″, min(sa1)″最低工资″, count(*)″员工人数″ from emp; --ok select max(sa1), 1ower(ename) from emp; --error单行函数和多行函数不能混用 select ma;x(sa1) from emp; --ok默认把所有的信息当做一组

10. group by 【分组难点】

例子

as″部门平均工资⊠ from emp group by deptno

注意:

select deptno, avg(sa1) as″部门平均工资⊠, ename from emp 解oup by deptno

select deptno, ename from emp 解oup by deptno

select deptno, job, sa1 from emp 解oup by deptno, job 记住:使用了gro1」p by之后select 不能出现组内的详细信息中只能出现分组后的整体信息,

11. having【对分组之后的信息进行过滤难点】

例子:

一把工资大于, -一统计输出部门平均工资大于的部门的部门编号部门的平均工资select deptno, avg(sa1)″平均工资″, count(*)″部门人数″,,max(sa1) ″部门的最高工资″ from emp where sa1 >2000 --where是对原始的记录过滤 group by deptno having avg(sa1) > 3000 -一对分组之后的记录过滤

一判断入选语句是否正确

select deptno, avg(sal)″平均工资″, count(*)″部门人数″,,max(sa1) ″部门的最高工资″ from emp group by deptno having avg(sa1) >3000 -一对分组之后的记录过滤 where sa1 > 2000 一一where写在了having的后面 error

12.连接査询

内连接【重点的重点也是难点的难点】

注意:

select* from A, B 输出结果和 select* from B, A 是一模一样的

例子 -一输出70行11列 select* from emp, dept

2. select... from A, Bwhere... 的用法

select... from A, B --A和B可以互换 产生的簡卡尔积, 用where中的条件进行过滤 例子: -一输出5行11列 select* from emp, dept --dept和emp互换输出结果不变 where empno= 7369

推荐使用 sQL99标准

示例:

一把工资大于2000的员工的姓名和部门的名称输出 和 工资的等级 -sc1199标准明显的优于sq192

select″E″.enae,″D″.hme,″S".grade
from e叩 "E″
join dept″D″
on″E″.deptno=″D〟.deptno
Join salgrade″S″
on″E″.sa1>=″S″.1osal md"E″.sa1 <=″S″.hisal
where″E".sa1 > 2000

一把工资大于2ooo的员工的姓名和部门的名称输出 和 工资的等级-sq192标准

select″E″.en訓e,″D″.如ae,″S″.grade
from e叩 ″E″, dept"D〟, salpade″S″
where″E",sa1 > 2000  md  "E″,deptno=″D″,deptno md
(″E″.sa1>=″S″.1osa1 md -E″.sa1 <=″S″.hisa1)

5. select、 from、 where、 Join、 on、 group、 order、 top、 having的混合使用

査询的顺序

select"T″,*,  "D″,如ae,  "S″.grade
from dept″D″
join(select top2″E".deptno,  avg(sa1)″avg_sa1″
from emp″E″
join dept″D″
on″E″.deptno=″D".deptno
Join salpade″S"
on -E″.sa1 between〃S".1osa1 nd″S".hisa1
where ⊠E".sa1 > 1500
group by ⊠E″.deptno
having avg(″E〟.sat) > 2000
order by avg("E".sat) desc
) ″T″
on"D〟.deptno=″T″.deptno
imer join salgrade″S"
on″T".″avg_sa1" between"S″.1osa1 nd"S″.hisa1
  • 一第二种写法

select″T-.*, ″D-. hae, ″S".grade from dept″D″ join(select top2 deptno, avg(sa1) as″avg_sa1″ from emp where sa1 > 1500 group by deptno having avg(sa1) > 2000 order by″avg_sa1″ desc ) ″T″ on″D″.deptno=″T″.deptno Join salgrade″S" on″T".″avg_sa1″ between″S″.1osa1 nd″S″,hisal

6. 习题

考虑如何把 selelit:* from emp, dept where dept.dept:lio= 10 以sq199标准来输出

1>求出每个员工的姓名部门编号薪水和薪水的等级 2>査找每个部门的编号该部门所有员工的平均工资平均工资的等级 3>査找每个部门的编号部门名称该部门所有员工的平均工资平均工资的等级 4>求出emp表中所有领导的信息 5> 求出平均薪水最高的部门的编号和部门的平均工资 6>把工资大于所有员工中工资最低的前3个人的姓名工资部门编号部门名称工资等级输出

自连接

联合

例子:

select"E1″,enae,″E1″.sa1, ″E2″.en訓e″上司的姓名″ from emp″E1″ Join emp″磁″ on"E1".m解 =″E2″.empno uni on select ename, sa1, '已是最大老板' from emp where mgr is nul1

注意:

identity【主键自动增长,用户不需要为identity修饰的主键赋值】 用户如何手动给被i dent i ty修饰的主键赋值不重要

表中删除数据后又插入数据会导致主键不连续递增 怎么办? 主键是否连续增长不十分重要

视图

示例

create view视图的名字 as -se1 ect的前面不能添加begin select语句 -se1 ect的后面不能添加end

注意的问题

-ok create view v$_a

as select avg(sa1) as ⊠avg_sa1″ from emp;

事务【重要】

所谓并发访同是指: 多用户同时访同同一个数据


假设每页显示n条记录, 当前要显示的是第m页 表名是A 主键是A_id select top n from A where A_id not in(select top (m-1)n A_id from emp)