复习数据库笔记

这两天重新学习了一下数据库,在此做笔记整理。

数据库分为三层: 

物理层,概念层,逻辑层


SQL语言包含四个部分
1.数据 定义 语言DDL:CREATE / DROP / ALTER
2.数据 操作 语言DML:INSERT / UPDATE / DELETE
3.数据 查询 语言DQL:SELECT
4.数据 控制 语言DCL:GRANT / REVOKE

各种编码的区别:
unicode : 两个字节表示一个字符(可以是英文字母s,也可以是汉字)
 对汉字支持比较好
非unicode : 用一个字节表示一个字母,两个字节表示一个汉字
//big5 : 支持繁体
//iso-8859-1编码 : 支持欧文
//GB2312国标码 
//gbk : 支持更多的汉字 
utf-8
utf-16


可以存放汉字,unicode编码:
nchar
nvarchar 


 
drop table abc

--创建表
CREATE table clerk
(cleId int primary key,       //这里声明主键
 cleName nvarchar(50),
 age int
)

--插入
insert into clerk values(1,'贾宝玉',18)
insert into clerk values(2,'贾政',18)
insert into clerk (cleId,cleName) values(3,'林黛玉')

--查询
select * from clerk

--修改
--把贾政的年龄修改成38
update clerk set age=38 where cleName='贾政'


--把2号人物,名字改为薛蟠,age改为40
update clerk set cleName='薛蟠' , age=40 where cleId=2


--主键能修改吗? 2->4 //必须改为不存在的一个值,即主键值不能重复
update clerk set cleId=4 where cleName='薛蟠'


update clerk set cleName='薛宝钗' where age is null


insert into clerk values(5,'贾母',70)
insert into clerk values(6,'焦大',75)


--删除年龄大于70且小于75
delete from clerk where age>=70  and age<=75
--						或者age 是null
delete from clerk where (age>=70  and age<=75) or age is null

--------------------------------下面是针对一个员工、部门表的操作
--创建一个新的数据库
create database spd1
--创建dept表
create table dept
(deptno int primary key,
 dname nvarchar(30),
 loc   nvarchar(30))


--创建emp表
create table emp
(empno int primary key,
 ename nvarchar(30),
 job   nvarchar(30),
 mgr   int,
 hiredate datetime,
 sal   numeric(8,2),
 comm  numeric(8,2),
 deptno int	foreign key references dept(deptno)		--	因为deptno我们根据需要要做成外键
)


--针对外键,请注意
--①外键只能指向主键
--②外键和主键的数据类型要一致
select * from dept
select * from emp 


--查询所有列
select * frome emp where -- * 能不用就不用 


--查询指定列
select 字段1,字段2 frome 表名 where 条件


--???查询Smith的薪水,工作,所在部门
select sal,job,deptno from emp where ename='smith' --sql server 不区分大小写


--如何取消重复行(distinct只能消除完全一样的行,保留一行)
select distinct 字段 from 表名 where 条件


--???统计多少个部门
select deptno from emp
select distinct deptno from emp


--使用算数表达式	使用列的别名
--???显示每个雇员的年工资+奖金  (年工资就是别名)
select ename,sal*13+comm*13 '年工资' from emp
--如何处理 NULL 的问题 isnull(字段,0)  isnull(comm,0)*13


--如何使用where
--???工资高于3000
select * from emp where sal>3000
--???如何查找1982.1.1后的员工
select * from emp where hiredate>'1982-1-1'
--???如何查找工资在2000到2500的员工情况 (闭区间)
select * from emp where sal between 2000 and 2500


--如何使用 like 操作符 (模糊查询) %表示0到多个字符 _ 表示单个字符
--???显示首字符为 s 的员工姓名,工资
select ename ,sal from emp where ename like 's%'
--???显示第三个字符为 o 的员工
select ename,sal from emp where ename like '__o%'


--批量查询 in
select * from emp where empno in (7369,7521,7499)


--???显示没有上级的雇员的信息
select * from emp where mgr is null



--使用逻辑操作符号
--???查询工资高于500或者岗位为MANAGER的雇员,同时还要姓名首字母为J
select * from emp where (sal>500 or job='manager') and ename like 'j%'


--使用order by 按顺序排名  默认是升序排列 asc  / 降序 desc
--???按照工资高低排名
select * from emp order by sal desc
--???按照入职先后顺序排列
select * from emp order by hiredate asc
select * from emp order by ename asc
--???按照部门号升序而员工工资降序
select * from emp order by deptno , sal desc --逗号后面是候选排序规则


--???使用别名排序。 统计每个人的年薪,并按照从低到高的顺序排列
select ename , (sal +ISNULL(comm,0))*13 年薪 from emp order by 年薪 


---------分页查询----------------------------------------
等学习了子查询再看
----------------------------------------------------




---------表的复杂查询----------------------------------------
--最低工资
select MIN(sal) from emp
select ename , sal from emp where  sal = (select MIN(sal) from emp)
--平均工资和工资总合
--把高于平均工资的员工名字和他的工资显示,并显示平均工资
select AVG (sal) 平均工资 ,SUM(sal) 总工资 from emp
select ename , sal  from emp where sal > (select AVG(sal) from emp)


--统计共有多少员工
select COUNT(*) from emp


--GROUP BY 和 having
--group by 用于对查询的结果分组统计
--having 往往和group by 结合使用,可以对分组查询到的结果进行筛选


--???显示每个部门的平均工资和最高工资	?并显示部门名称(多表查询)
select AVG(sal) 平均工资,deptno,MAX(sal) 最高工资 from emp group by deptno
--???显示每个部门每种岗位的平均工资和最高工资
select avg(sal),min(sal),deptno,job from emp group by deptno ,job order by deptno




--???显示平均工资低于2000的部门号和它的平均工资
select AVG(sal) 平均,deptno from emp group by deptno having AVG(sal)<2000




--对数据分组的总结
--1. 分组函数只能出现在选择列表、having 、 order by子句中
--2. 在select语句中 顺序为 group by 、having 、order by ,例如
select AVG(sal) 平均,deptno from emp group by deptno having AVG(sal)>2000 order by avg(sal) desc
--3. 在选择列中如果有列、表达式 、分组函数,那么这些列和表达式必须有一个出现在group by 子句中,否则会出错






---------表的多表查询----------------------------------------


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值