You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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【在某个范围】
-一査找工资在1 500到3000之间(包括和)的所有的员工的信息 select* from e1lIp where sa1>=1500 and sa1<=3000
等价于 selelit* from emp where sa1 between1500 and3000
-一査找工资小于3ooo或大于1 5oo的所有的员工的信息select* from emp where sa1<1500 or sa1>3000
等价于 select* from emp where sa1 not between1500 and3000
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)
-一把sa1既不是也不是也不是的记录输出等价于
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【没有值空值】
零和rm11是不一样的, nu11表示空值,投有值,零表示一个确定的值
nu11不能参与如下运算: 〇 != =
n111可以参与如下运算: is not is
select* from emp where comm is nu11; -一输出奖金为空的员工的信息 select* from emp where comm is not nu11;
一输出奖金不为空的员工的信息
select* from e叩 where comm 〇 null;-一输出为空error select*from emp where comm !=nu11;-一输出为空error select* from emp where comm = nu11; -一输出为空error
一把工资大于,
-一统计输出部门平均工资大于的部门的部门编号部门的平均工资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... fromA, B的用法
产生的结果:
行数是A和B的乘积
列数是A和B之和
或者说
油表的每一条记录都和B表的每一条记录组合在一起形成的是个笛卡尔积
或者说:
把B表的每一条记录都和A表的每一条记录组合在一起形成的是个笛卡尔积
注意:
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
select... from A join B on... select... from A join B on
SQL92标准和 SQL99标准的区别 select... from A, B where. select... from A join B on
输出结果是一样
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. 习题
判断以下语句输出是几行 select'l: from emp, dept where emp.deptno= 10 select* from emp, dept where dept.deptno= 10
-一过滤条件不是连接条件
考虑如何把
selelit:* from emp, dept where dept.dept:lio= 10 以sq199标准来输出
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
注意:
若干个select子句要联合成功的话,必须的满足两个条件
这若干个select子句输出的列数必须是相等的
这若干个se1 ect子句输出列的数据类型至少是兼容的
identity【主键自动增长,用户不需要为identity修饰的主键赋值】
用户如何手动给被i dent i ty修饰的主键赋值不重要
表中删除数据后又插入数据会导致主键不连续递增 怎么办?
主键是否连续增长不十分重要
视图
为什么需要视图
示例
求出平均工资最高的部门的编号和部门的平均工资
总结:
简化査询
避免了代码的冗余
避免了书写大量重复的sq1语句
什么是视图
视图从代码上看是一个select语句
视图从逻辑上看被当做一个虚拟表看待
如何创建视图
create view视图的名字
as
-se1 ect的前面不能添加begin
select语句
-se1 ect的后面不能添加end
注意的问题
创建视图的 se1 ec t语句必须的为所有的计算列指定别名
-error
create view v$_a
as
select avg(sa1) from emp;
数据库学习大纲
第一部分:数据库相关概念
什么是数据库
数据库是由表、 关系、 操作组成
为什么需要数据库
数据库的安装和卸载
预备知识
数据结构和数据库的区别
什么是连接 【重点】
建议初学者从三个方面学习数据库数据库是如何存储数据的
insert update delete T-SQL
存储过程函数触发器select
(重点的重点)必各的一些操作
数据库是如何解决数据存储问题的 【最基础内容, 必须掌握】
1.表的相关数据
表和字段、记录的关系
2. create table命令
create table最后一个字段的后面建议不要写逗号说明:简単掌握后面我们会再详细的介绍
3. 什么是约束
不允许重复元素選免了数据的冗余
事物和事物之间的关系是通过外键来体现的
间题:
ul,i que键是否允许多列为空?
答:
not null
要注意nu11和 default的区别
4. 表和约束的异同
表和表之间的联系
既可以把表A 的主键充当表B的外键
也可以把表B的主键充当表A的外键
把表A 的主键充当表B的外键
或者讲: 把A表的主键添加到B表来充当B表的外键
在多的一方添加外键
多对多必须的通过単独的一张表来表示
例子
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【在某个范围】
select* from e1lIp where sa1>=1500 and sa1<=3000
等价于
selelit* from emp where sa1 between1500 and3000
select* from emp where sa1<1500 or sa1>3000
等价于
select* from emp where sa1 not between1500 and3000
4. in【属于若干个弧立的值】
`selectfrom emp where sa1 in(1500, 3000, 5000)
等价于
select from empwhere 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;``` --error6. nu11【没有值空值】
select* from emp where comm is not nu11;
select* from e叩 where comm 〇 null;
-一输出为空errorselect*from emp where comm !=nu11;
-一输出为空errorselect* from emp where comm = nu11;
-一输出为空errorcreate table t1 (:l,lamenvarchar(20), cnt int, riqi datetime); insert into t1 values(nu1l, nu11, nu11);
-0Kselect empno, ename, sa1*12+comm ″年薪" from emp;
select ename, sa1*12+isnu11(comm, 0)″年薪″ from emp;
--is null(comm, 0)如果comm是nu11就返回零否则返回comm的值
7. order by 【以某个字段排序】
order by a, b
--a和b都是升序order by a, b desc
--a升序 b降序order by a desc, b
-a降序 b升序order by a desc, b desc
--a和b都是降序例子:
select* from emp order by sa1;
一默认是按照升序排序-一先按照deptno升序排序,如果deptno相同,再按照sa1升序排序
select* from emp order by deptno desc, sa1;
-一先按deptno降序排序如果deptno相同再按照sal升序排序
-一记住sa1是升序不是降序
--orderby a desc, b, c, d
desc只对a产生影响不会对后面的b c d产生影响select*from emp order by deptno, sa1 desc
8.模糊査询 【搜索时经常使用】
select字段的集合 from表名 where某个字段的名字1ike匹配的条件
匹配的条件通常含有通配符
%
表示任意o个或多个字符
select*from emp where enamelike'%A%'
select*from emp where enamelike'A%'
select* from emp where enamelike'%A'
select* from emp where enamelike'_A%'
[a-f]
select* from emp where
enamelike'_[A-F]%'''
-一把ename中第二个字符是A或B或c或D或E或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.聚合函数【多行记录返回至一个值通常用于统计分组的信息】函数的分类
単行函数
多行函数
例子:
selectlower(ename) from emp;
一最终返回的是行1ower0是单行函数select max(sa1) from emp;
一返回行max0是多行函数聚合函数的分类
-min()
-avg() 平均值
-count()求个数
-count(*)
返回表中所有的记录的个数
select count(*) from emp;
-一返回emp表所有记录的个数count(字段名)
select courlt(deptno) from emp;
``select coul,it(l1omm) from emp;`
select count(distinct deptno) from emp;
-一返回值是 统计deptno不重复的记录的个数
注意的问题
select ma:x(sa1), min(sa1), count(*) from emp;
--okselect 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 【分组难点】
例子
select deptno, avg(sa1)
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【对分组之后的信息进行过滤难点】
因此使用having时通常都会先使用group by
则意味着having把所有的记录当做一组来进行过滤
极少用
select count(*) from emp having avg(sa1) > 1000
where和having一样,
例子:
一把工资大于,
-一统计输出部门平均工资大于的部门的部门编号部门的平均工资select deptno, avg(sa1)″平均工资″, count(*)″部门人数″,,max(sa1) ″部门的最高工资″
from emp
where sa1 >2000 --where是对原始的记录过滤
group by deptno
having avg(sa1) > 3000 -一对分组之后的记录过滤
一判断入选语句是否正确
12.连接査询
内连接【重点的重点也是难点的难点】
select... fromA, B
的用法产生的结果:
油表的每一条记录都和B表的每一条记录组合在一起形成的是个笛卡尔积
注意:
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
select... from A, B where.
select... from A join B on
输出结果是一样
推荐使用 sQL99标准
on指定连接条件
where对连接之后临时表的数据进行过糖
示例:
一把工资大于2000的员工的姓名和部门的名称输出 和 工资的等级
-sc1199标准明显的优于sq192
一把工资大于2ooo的员工的姓名和部门的名称输出 和 工资的等级-sq192标准
5. select、 from、 where、 Join、 on、 group、 order、 top、 having的混合使用
査询的顺序
例子:
6. 习题
select'l: from emp, dept where emp.deptno= 10
select* from emp, dept where dept.deptno= 10
考虑如何把
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
注意的问题
-error
create view v$_a
as
select avg(sa1) from emp;
-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)
The text was updated successfully, but these errors were encountered: