文章目录
第一章 数据库基础1.1、数据库基本概念1.2、数据库的分类1.3、E-R模型(Entry-Relation)1.4、SQL语句分类
第二章、查询基础3.1、简单的select语句3.2、使用算术表达式 + - / *3.3、连接运算符 ||3.4、使用字段别名 as3.5、空值 is null3.6、去除重复行 distinct3.7、查询结果排序 order by asc(desc)3.8、比较运算符 > < (!= or <>) between and3.9、in操作 not in3.10、模糊查询 like3.11、逻辑运算符 or and not3.12、练习
第三章 单行函数3.1、字符函数3.2、数值函数3.3、日期函数
第四章、分组函数4.1、count()4.2、avg(),max(),min(),sum()4.3、GROUP BY子句4.4、having子句4.5、分组函数嵌套4.6、练习
第五章、多表查询5.1、笛卡尔集(Cross Join)5.2、等值连接(Equijoin)(Natural join..on)5.3、非等值连接(Non-Equijoin)5.4、自连接(Self join)5.5、左外联接(Left Outer Join )5.6、右外联接(Right Outer Join)5.7、满外联接(Full Outer Join)5.8、集合操作
第一章 数据库基础
1.1、数据库基本概念
数据库(Database, DB)数据库管理系统(Database Management System, DBMS)数据库管理员(Database Administrator, DBA) 数据库系统( Database System, DBS )
1.2、数据库的分类
关系型数据库
关系型数据库把复杂的数据结构,归结为简单的二维表形式存储 我们所有的操作也是建立在一张或者多张表,可以对表格进行数据的分类、合并、连接…
常见的关系型数据库
ORACLE 甲骨文 使用广泛、大型公司、产品免费、服务收费、稳定、安全 "ORACLE 8I/9I "ORACLE 10g/11g gird 网格计算、提高访问速度,目前主流 "ORACLE 12c cloudMySQL MYSQL AB 开源 中小型公司 sun公司收购 社区版免费 企业版收费SQLSserver 微软开发DB2 IBM 图形
非关系型数据库
NoSQL 不仅仅是SQL键值形式存储的数据库 RedisHBase 列存储MongoDB 文档型
1.3、E-R模型(Entry-Relation)
E-R模型三要素:实体、关系、属性实体间联系(1:1)(1:n)(n:m)
1.4、SQL语句分类
DML语句(数据操作语言)Insert、Update、 Delete、MergeDDL语句(数据定义语言)Create、Alter、 Drop、TruncateDCL语句(数据控制语言)Grant、Revoke事务控制语句Commit、Rollback、Savepoint
第二章、查询基础
3.1、简单的select语句
3.2、使用算术表达式 + - / *
3.3、连接运算符 ||
3.4、使用字段别名 as
3.5、空值 is null
3.6、去除重复行 distinct
3.7、查询结果排序 order by asc(desc)
3.8、比较运算符 > < (!= or <>) between and
3.9、in操作 not in
3.10、模糊查询 like
% 表示零或多个字符
_ 表示一个字符
3.11、逻辑运算符 or and not
3.12、练习
Select * from emp
where deptno
=30;
Select empno
,ename
from emp
where job
= „Manager‟
;
Select * from emp
where comm
>sal
;
Select sal
+nvl
(comm
,0),ename
from emp
;
Select * from emp
where (deptno
=10 and job
=‟MANAGER‟
) or (deptno
=20 and job
=‟CLERK‟
);
Select * from emp
where deptno
=10 and job
not in(„MANAGER‟
,‟CLERK
) ‟
and sal
>=2000;
Select distinct job
from emp
where comm
is not null and comm
>0
Select * from emp
where comm
<500 or comm
is null;
select ename
from emp
order by hiredate
;
第三章 单行函数
3.1、字符函数
大小写控制 lower() upper()
select lower
('HelloWorld') 转小写
, upper
('HelloWorld') 转大写
from dual
;
首字母大写 initcap
select Initcap
('hello world') 首字母大写
from dual
字符连接函数 concat 等同于||
select concat
('hello','world') from dual
;
求母字符串中的某个子串 substr
select substr
('Hello World',3) from dual
;
从第三位开始截取
select substr
('Hello World',3,4) from dual
;
**字符数和字节数 length 和 lengthb **
Select length
('China') 字符数
, Lengthb
('China') 字节数
from dual
;
instr 查找子串在母串中的位置
select instr
('hello world','o') from dual
;
select instr
('hello world','ll') from dual
;
去掉字符串前后指定的字符
select trim
('H' from 'Hello World') from dual
;
替换函数 replace
select replace('Hello World','l','*') from dual
;
3.2、数值函数
round() 四舍五入trunc() 截断mod() 求余
Select round(45.458,2) 四舍五入
,
trunc
(45.458,2) 截断
,
mod(1600,300) 求余
from dual
;
3.3、日期函数
查看当前系统时间
select Sysdate
From Dual
;
时间转换成字符 to_char()
select to_char
(Sysdate
,'yyyy-mm-dd hh24:mi:ss') from dual
;
显示昨天,今天,明天
select sysdate
-1,sysdate
,sysdate
+1 from dual
;
员工信息,显示工龄(天)
select empno
,ename
,sysdate
-hiredate
from emp
;
员工信息,工龄按天,星期,月显示
select empno
,ename
,
sysdate
-hiredate 天
,
(sysdate
-hiredate
)/7 星期
,
(sysdate
-hiredate
)/30 月
from emp
;
months_between 两个日期相差的月数
select (sysdate
-hiredate
)/30 方式一
,
months_between
(sysdate
,hiredate
) 方式二
from emp
;
加月份 add_months
select add_months
(sysdate
,1) from dual
;
某个日期当月的最后一天 last_day
select last_day
(sysdate
) from dual
;
next_day 下一个查询日的日期
select next_day
(sysdate
,'星期五') from dual
;
对日期进行四舍五入
select round(sysdate
,'MONTH') 月
,round(sysdate
,'YEAR') 年
from dual
;
对日期截断
select trunc
(sysdate
,'MONTH') 月
,trunc
(sysdate
,'YEAR') 年
from dual
;
第四章、分组函数
4.1、count()
如果数据库表的没有数据,count(*)返回的不是null,而是0
4.2、avg(),max(),min(),sum()
4.3、GROUP BY子句
出现在SELECT列表中的字段或者出现在order by 后面的字段,如果不是包含在分组函数中,那么该字段必须同时在GROUP BY子句中出现。
包含在 GROUP BY子句中的字段则不必须出现在SELECT列表中。
可使用where字句限定查询条件
可使用Order by子句指定排序方式
如果没有GROUP BY子句,SELECT列表中不允许出现字 段(单行函数)与分组函数混用的情况。
select empno
, sal
from emp
;
select avg(sal
) from emp
;
select empno
, initcap
(ename
), avg(sal
) from emp
;
不允许在 WHERE子句中使用分组函数。
select deptno
, avg(sal
) from emp
where avg(sal
) > 2000
group by deptno
;
4.4、having子句
select deptno
, job
, avg(sal
)
from emp
where hiredate
>= to_date
('1981-05-01','yyyy-mm-dd')
group by deptno
,job
having avg(sal
) > 1200
order by deptno
,job
;
4.5、分组函数嵌套
select max(avg(sal
))
from emp
group by deptno
;
4.6、练习
Select avg(sal
) from emp
where sal
>500 group by deptno
;
select deptno
,avg(sal
) from emp
group by deptno
having avg(sal
)>500 ;
Select max(comm
) from emp
where deptno
= 30 ;
select ename
from emp
where comm
= (select max(comm
) from emp
where deptno
=30);
Select job
,min(sal
),count(*) from emp
group by job
;
Select count(*),deptno
from emp
group by deptno
;
select * from emp e1
,(select deptno
,avg(sal
) as avgsal
from emp
group by deptno
) e2
where e1
.deptno
=e2
.deptno
and e1
.sal
> e2
.avgsal
;
第五章、多表查询
5.1、笛卡尔集(Cross Join)
select * from emp
,dept
;
5.2、等值连接(Equijoin)(Natural join…on)
select empno
, ename
, sal
, emp
.deptno
, dname
from emp
, dept
where emp
.deptno
= dept
.deptno
;
5.3、非等值连接(Non-Equijoin)
select ename
,empno
,grade
from emp
,salgrade
where sal
between losal
and hisal
;
5.4、自连接(Self join)
select e
.empno
,e
.ename
,m
.empno
,m
.ename
from emp e
,emp m
where e
.mgr
= m
.empno
;
select e
.empno
,e
.ename
,m
.empno
,m
.ename
from emp e
,emp m
where m
.mgr
= e
.empno
;
5.5、左外联接(Left Outer Join )
select s
.sid
,s
.sname
,s1
.sid
,s1
.sname
from student s
,student1 s1
where s
.sid
=s1
.sid
(+);
select empno
,ename
,dname
from emp
left outer join dept
on emp
.deptno
= dept
.deptno
;
5.6、右外联接(Right Outer Join)
select s
.sid
,s
.sname
,s1
.sid
,s1
.sname
from student s
,student1 s1
where s
.sid
(+)=s1
.sid
;
select empno
,ename
,dname
from emp
right outer join dept
on emp
.deptno
= dept
.deptno
;
5.7、满外联接(Full Outer Join)
select empno
,ename
,dname
from emp
full outer join dept
on emp
.deptno
= dept
.deptno
;
5.8、集合操作
· UNION:并集,所有的内容都查询,重复的显示一次
· UNION ALL:并集,所有的内容都显示,包括重复的
· INTERSECT:交集:只显示重复的
· MINUS:差集:只显示对方没有的(跟顺序是有关系的)
首先建立一张只包含20部门员工信息的表: CREATE TABLE emp20 AS SELECT * FROM emp WHERE deptno=20 ;
1、 验证UNION及UNION ALL
UNION:
SELECT * FROM emp
UNION
SELECT * FROM emp20
;
使用此语句重复的内容不再显示了
UNION ALL:
SELECT * FROM emp
UNION ALL
SELECT * FROM emp20
;
重复的内容依然显示
2、 验证INTERSECT
SELECT * FROM emp
INTERSECT
SELECT * FROM emp20
;
只显示了两个表中彼此重复的记录。
3、 MINUS:返回差异的记录
SELECT * FROM emp
MINUS
SELECT * FROM emp20
;
只显示了两张表中的不同记录
满链接也可以用以下的方式来表示:
select t1
.id
,t2
.id
from table1 t1
,table t2
where t1
.id
=t2
.id
(+)
union
select t1
.id
,t2
.id
from table1 t1
,table t2
where t1
.id
(+)=t2
.id