百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

莫错过,一份值得收藏的数据库技术大全,PART1

ccwgpt 2025-02-20 14:45 15 浏览 0 评论

前言

T1.什么是数据库?

存储数据的仓库

T2.常见的数据库有哪些?

· 微软-------SQLServer

· 微软-------Access

· IBM-------DB2

· 甲骨文-----Oracle

· 甲骨文-----MySQL

· 国产-------人大金仓

T3.生活中那些地方使用数据库?

· 超市商品管理系统---商品信息和价钱

· 银行管理系统----账户信息

· 医院挂号系统----用户信息

· 网上商城系统-商品信息和价钱和等级

· 12306---------账户信息和车次信息

一、数据库发展史

1.1 程序管理阶段

20世纪50年代中期

特点:不能长期存储数据

1.2 文件系统阶段

20世纪50年代后期---20世纪60年代后期

特点:数据缺乏独立性

1.3 数据库系统阶段

20世纪60年代后期--

特点:数据实现共享,减少冗余

二、数据库专业术语

2.1 关系

一个关系就是一张2维表(Excel)

2.2 元组

在2维表中,一行叫做元组,或者称为

"行"或者 "记录"

2.3 属性

在2为表中,一列叫做属性,或者称为

"列"或者"字段"

三、数据库及连接工具介绍

3.1 Oracle数据库介绍

Oracle是美国ORACLE公司研发的一款关系型数据库,主要特点有:速度快、安全性强、可跨平台,主要版本有:Oracle9i、Oracle10g、Oracle11g、Oracle12c

3.2 连接工具介绍

· SQL Developer--Oracle自主研发

· PL/SQL Developer

· Navicat

3.3 Oracle数据库登录

1. 登录到DOS窗口

开始>搜索程序和文件>cmd>回车 2. 在DOS窗口中输入:sqlplus>回车 3. 请输入用户名:system>回车 4. 输入口令:123456>回车

说明:如果出现连接到:Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production SQL>表示登录成功

四、表空间

表空间就是数据库中存储对象(2维表、视图、索引、序列)的容器,因为主要存储2维表(表),所以称为表空间

· 在数据库安装的时候,系统会自动创建表空间(system)

· 可以通过system表空间,创建其它表空间

· 一个数据库中,可以有若干个表空间,也可以只有一个system表空间。

五、数据类型

小说类型=>都市、玄幻、穿越、仙侠

5.1 字符类型

char、varchar、varchar2

char(n) 表示固定长度的字符串,n表示字符串的长度,当实际要保存的数据小于n时,在字符串的右侧,使用空格补齐。

例如: char(10) 存储zhangxs,会占用系统10个存储空间(7+3)

varchar(n) 表示可变长度的字符串,n表示字符串的最大长度,当要保存的数据小于n时,按照实际长度保存。

varchar2,是Oracle自定义的类型,比varchar数据类型兼容性更好,一般在企业开发中,常用varchar2代替varchar

5.2 数值类型

number

number(n) 表示整数类型,n表示能保存整数的最大位数

例如: number(3) 999 88 5

number(n,m) 表示整数或者小数,n表示有效数字的最大位数,m表示小数的最大位数,n-m表示整数的最大位数

例如: number(7,2) 12345.3 1000

5.3 日期类型

date 表示日期类型,包含:年月日时分秒

系统默认日期格式: dd-mon月-yy

· dd----表示几号

· mon---表示几月

· yy-----表示那年

六、数据库语句

6.1 SQL语句

结构化查询语句,通过SQL语句,可以对数据库进行增删改查。

6.2 SQL语句分类

DDL--数据定义语句,主要是对数据库中的表,创建、删除、修改

· 创建----create

· 修改----alter

· 删除----drop

DML--数据操纵语句,主要是对数据库表中的数据,插入、修改(更新)、删除

· 插入---insert

· 更新---update

· 删除---delete

TCL--事务控制语句,主要负责数据库中的事务。

· 提交事务---commit

· 回滚事务---rollback

DQL--数据查询语句,数据库中的重点

· 查询---select

6.3 创建表

格式:

create table 表名( 列名1 数据类型 primary key, 列名2 数据类型, ...... 列名n 数据类型);

create table per01(id number(8) primary key,name varchar2(30),age number(3),sex char(3));

create table per02(id number(8) primary key,name varchar(30));

练习:创建一张表,表名为per03,表中包含的字段有:

id number(8) primary keyname varchar2(30)sex char(3)address varchar2(50)

create table per03(id number(8) primary key,name varchar2(30),sex char(3),address varchar2(50));

练习:创建一张表,表名为ter01,表中包含的字段有:

id number(4) primary keyname varchar2(30)age number(3)sex char(3)sal number(7,2)address varchar(50)ttime date

create table ter01(id number(4) primary key,name varchar2(30),age number(3),sex char(3),sal number(7,2),address varchar(50),ttime date);

6.4 查看表结构

格式: desc 表名;

案例:查看per01表的,表结构

desc per01;

练习:查看per03表的,表结构

desc per03;

6.5 插入语句

6.5.1 向全部列插入数据

格式:

insert into 表名 values(列值1,列值2,列值3.....列值n);

说明:values中的列值必须和表结构中的列名是一一对应的(数量、顺序、类型)

验证: select * from 表名;

案例:向per01表中,插入2条记录

desc per01;insert into per01 values(1001,'张三',23,'男');insert into per01 values(1002,'李四',30,'女');select * from per01;

练习:向per02表中插入2条记录,并验证

(1)desc per02;(2)insert into per02 values(101,'奥利根');(3)insert into per02 values(102,'奥利奥');(4)select * from per02;

练习:向per03表中,插入2条记录,并验证

desc per03;insert into per03 values(1,'王五','男','北京');insert into per03 values(2,'赵六','男','天津');select * from per03;

6.5.2 向指定列插入数据

格式:

insert into 表名(列名1,列名2,列名3.....列名n) values(列值1,列值2,列值3.....列值n);

说明:表名中的列名必须和values中的列值是一一对应的(数量,顺序,类型)。

验证:select * from 表名;

案例:向per01表中插入2条记录

ID NAME AGE SEX9001 tom 209002 rose 女9003 25 男

insert into per01(id,name,age) values(9001,'tom',20);insert into per01(id,name,sex) values(9002,'rose','女');select * from per01;insert into per01(id,age,sex) values(9003,25,'男');

练习:向per03表中,插入数据并验证

ID NAME SEX ADDRESS801 jack 男802 女 上海803 lucy 广州

insert into per03(id,name,sex) values(801,'jack','男');insert into per03(id,sex,address) values(802,'女','上海');insert into per03(id,name,address) values(803,'lucy','广州');select * from per03;

6.6 修改(更新)语句

格式:

update 表名 set 列名1=该列新值, 列名2=该列新值,.....列名n=该列新值 where 条件;

说明:如果没有where条件,修改全部数据。

验证:select * from 表名;

案例:修改per03表中,编号(id)是801的记录,将地址(address)修改为深圳

update per03 set address='深圳' where id=801;select * from per03;

案例:修改per03表中,地址(address)是上海的记录,将姓名(name)修改为rose

update per03 set name='rose' where address='上海';

练习:修改per03表中,姓名(name)是lucy的记录,将性别(sex)修改为女

update per03 set sex='女'where name='lucy';

练习:修改per01表中,编号是9003的记录,将姓名(name)修改为smith,年龄(age)修改为99岁

update per01 set name='smith',age=99 where id=9003;

练习:修改per01表中,将全部年龄(age)修改为18岁

update per01 set age=18;

6.7 删除表中的数据

格式:

delete from 表名 where 条件;

说明:如果没有where条件,删除全部数据。

案例:删除per01表中,将编号(id)是9001的记录删除

delete from per01 where id=9001;

练习:删除per01表中,将姓名(name)是rose的记录删除

delete from per01 where name='rose';

练习:删除per01表中全部数据

delete from per01;

6.8 删除表

格式:drop table 表名;

案例:删除per01、per02、per03表

drop table per01;select * from per01;

复习:

· 创建表

create table 表名( 列名1 数据类型 primary key, 列名2 数据类型, 列名3 数据类型, ...... 列名n 数据类型 );

· 查看表结构

desc 表名;

· 向全部列插入数据

insert into 表名 values(列值1,列 值2,........列值n);

· 向指定列插入数据

insert into 表名(列名1,列名2,...列名n) values(列值1,列值2,...列值n);

· 修改(更新)语句

update 表名 set 列名1=该列新值,列名2=该列新值,....列名n=该列新值 where 条件;

· 删除表中的数据

delete from 表名 where 条件;

· 删除表

drop table 表名;

6.9 查询语句(重点)

6.9.1 没带条件的查询语句

1)查询全部列数据

select * from 表名;

说明: *表示全部列

案例:查询emp表、dept表、salgrade表全部数据

select * from emp; ---员工表select * from dept; ---部门表select * from salgrade; -工资等级表

2)查询指定列数据

格式:

select 列名1,列名2,....列名n from 表名;

案例:查询emp表中,员工的编号(empno)、员工的姓名(ename)、员工的工资(sal)

select empno,ename,salfrom emp;

案例:查询dept表中,部门的编号(deptno),部门名称(dname),部门地址(loc)

select deptno,dname,locfrom dept;

练习:查询emp表中,员工的编号(empno),姓名(ename),职位(job),工资(sal),入职时间(hiredate)

select empno,ename,job,sal,hiredatefrom emp;

练习:查询salgrade表中,工资的等级(grade),最低工资(losal)、最高工资(hisal)

select grade,losal,hisalfrom salgrade;

6.9.2 给列起别名

格式1:

select 列名1 as 别名1,列名2 as 别名2,.....列名n as 别名n from 表名;

案例:查询emp表中,员工的编号(empno),员工姓名(ename),领导编号(mgr),入职时间(hiredate),并给每列起别名

select empno as 员工编号,ename as 员工姓名,mgr as 领导编号,hiredate as 入职时间from emp;

格式2:

select 列名1 别名1,列名2 别名2,.....列名n 别名n from 表名;

练习:查询dept表中,部门编号(deptno),部门名称(dname),部门地址(loc),并给每列起别名

select deptno 部门编号,dname 部门名称,loc 部门地址from dept;

6.9.3 去掉重复的列值(distinct)

格式:

select distinct 列名 from 表名;

案例:查询emp表中,员工的职位(job)信息(去重)

select distinct job from emp;

练习:查询emp表中,部门的编号(deptno)(-去重)

select distinct deptno from emp;

6.9.4 排序(order by)

格式:

select */列名 from 表名order by 列名1 asc/desc,列名2 asc/desc;

说明:

· asc----升序排列(默认)

· desc---降序排列

案例:查询emp表中,员工的编号(empno),姓名(ename),工资(sal),根据员工的编号降序排列

select empno,ename,salfrom emporder by empno desc;

练习:查询emp表中,员工的姓名(ename),职位(job),工资(sal),部门编号(deptno),根据工资升序排列

select ename,job,sal,deptnofrom emporder by sal asc;

练习:查询emp表中,员工的编号(empno),姓名(ename),工资(sal),部门编号(deptno),首先根据工资升序排列,再次根据员工编号降序排列。

select empno,ename,sal,deptnofrom emporder by sal asc,empno desc;

练习:查询emp表中,员工的编号(empno),姓名(ename),职位(job),部门编号(deptno),先根据部门编号降序排列,再根据员工编号升序排列

select empno,ename,job,deptnofrom emporder by deptno desc,empno asc;

说明:

· 如果根据2列排序,先根据前面的列排序,如果列值相同,那么在根据第2列排序

· 排序永远放在格式的最后面

6.9.5 条件查询语句

格式:

select */列名 from 表名 where 条件;

说明: 条件包含关系运算符、逻辑运算符、特殊情况

关系运算符: > < = >= <= <>/!=(不等于)

案例:查询emp表中,工资(sal)大于1500的,员工的编号,姓名,职位,工资

select empno,ename,job,salfrom empwhere sal>1500;

练习:查询emp表中,部门编号是30号部门的,员工的姓名,职位,工资,部门编号(deptno)

select ename,job,sal,deptnofrom empwhere deptno=30;

练习:查询dept表中,部门地址(loc)是BOSTON的,部门的编号(deptno),部门名称(dname),部门地址

select deptno,dname,locfrom deptwhere loc='BOSTON';

练习:查询emp表中,工资不等于1250的,员工的编号,姓名,工资,根据工资降序排列

select empno,ename,salfrom empwhere sal<>1250 order by sal desc;

逻辑运算符:

· and(与)

· or(或)

· not(非)

1)and 并且 连接2个或者多个条件

案例:查询emp表中,工资在1000~3000之间的,员工的编号,姓名,职位,工资

select empno,ename,job,salfrom empwhere sal>1000 and sal<3000;

练习:查询emp表中,部门编号是30号部门并且工资大于1000的,员工的编号,姓名,职位,工资,部门编号

select empno,ename,job,sal,deptnofrom empwhere deptno=30 and sal>1000;

2) or 或者

案例:查询emp表中,职位是SALESMAN或者工资大于1000的,员工的编号,职位,工资

select empno,job,salfrom empwhere job='SALESMAN' or sal>1000;

练习:查询emp表中,工资大于等于3000或者部门编号是20号部门的,员工的编号,姓名,职位,工资,部门编号,根据工资升序排列

select empno,ename,job,sal,deptnofrom empwhere sal>=3000 or deptno=20order by sal asc;

3) not 非

案例:查询emp表中,工资不等于1250,员工的编号,姓名,职位,工资

select empno,ename,job,salfrom empwhere sal<>1250;

select empno,ename,job,salfrom empwhere not sal=1250;

6.9.5.1 查询列值为空的情况(is null)

案例:查询emp表中,奖金(comm)为空的,员工的编号,姓名,奖金

select empno,ename,commfrom empwhere comm is null;

练习:查询emp表中,领导编号(mgr)为空的,员工的编号、姓名、职位、领导编号

select empno,ename,job,mgrfrom empwhere mgr is null;

6.9.5.2 查询列值不为空的情况(is not null)

案例:查询emp表中,奖金不为空的,员工的编号,姓名,职位,工资,奖金,根据工资升序排列

select empno,ename,job,sal,commfrom empwhere comm is not nullorder by sal asc;

练习:查询emp表中,有领导编号的,员工的全部列信息

select * from emp where mgr is not null;

6.9.5.3 between....and

格式:

select */列名 from 表名 where 列名 between 初值 and 终值;

说明:使用between...and查询出来的数据,范围在[初值,终值]之间。

案例:查询emp表中,工资在1000~5000之间的,员工的编号,姓名工资

select empno,ename,salfrom empwhere sal>=1000 and sal<=5000;

select empno,ename,salfrom empwhere sal between 1000 and 5000;

6.9.5.4 in 比较一个列中的几个列值

格式:

select */列名 from 表名 where 列名 in(列值1,列值2,.....列值n);

练习:查询emp表中,员工编号是7521, 7698, 7844, 7902的员工信息

select * from emp where empno=7521 or empno=7698 or empno=7844 or empno=7902;

select * from emp where empno in(7521, 7698, 7844, 7902);

练习:查询emp表中,员工职位是MANAGER, SALESMAN, ANALYST的,员工的编号,姓名,职位,工资

select empno,ename,job,salfrom empwhere job in('MANAGER', ' SALESMAN',' ANALYST');

复习:

· 查询全部列数据

select * from 表名;

· 查询指定列数据

select 列名1,列名2,....列名n from 表名;

· 给列起别名

select 列名1 as 别名1,列名2 as 别名2,....列名n as 别名n from 表名;select 列名1 别名1,列名2 别名2,....列名n 别名n from 表名;

· 去掉重复的列值

select distinct 列名 from 表名;

· 排序

select */列名 from 表名 order by 列名1 asc/desc,列名2 asc/desc;

· 条件查询

select */列名 from 表名 where 条件;

关系运算符:> < = >= <= <>/!=

sal>2000 job='MANAGER'

sal<>1250

逻辑运算符: and or not

sal>1000 and sal<5000

deptno=10 and job='MANAGER'

deptno=30 or sal>2000

not sal=1250

特殊情况: - 列值为空 comm is null - 列值不为空 mgr is not null - between...and和and相似

select */列名 from 表名 where 列名 between 初值 and 终值;

· in 比较一个列中的几个列值

select */列名 from 表名 where 列名 in(列值1,列值2,....列值n);

6.9.5.5 模糊查询(-重点)

格式:

select */列名 from 表名 where 列名 like 条件;

说明条件组成:

· %: 表示0个或者多个任意字符

· _: 表示任意一个字符

案例:查询emp表中,员工姓名的首字母(第1个字母)是M开头的,员工的编号,姓名,职位

Mfsdfdf M===>M%

select empno,ename,jobfrom empwhere ename like 'M%';

案例:查询emp表中,员工姓名尾字母是(最后一个字母)N的,员工的编号,姓名,职位

dsafdN N ==> %N

select empno,ename,jobfrom empwhere ename like '%N';

案例:查询emp表中,员工姓名中包含(含有)字母N的,员工的编号,姓名,工资

fdsN Newr gfNgfg==>%N%

select empno,ename,salfrom empwhere ename like '%N%';

练习:查询emp表中,员工姓名倒数第2个字母是N的,员工的编号,姓名,工资

dfsdNe Nw ==> %N_

select empno,ename,salfrom empwhere ename like '%N_';

练习:查询emp表中,员工姓名正数第3个字母是N的,员工的编号,姓名,工资

select empno,ename,salfrom empwhere ename like '__N%';

6.9.6 处理空值的函数

案例:查询emp表中,员工的编号,姓名,工资,年薪(工资*12)

select empno,ename,sal,sal*12 from emp;

案例:查询emp表中,员工的编号,姓名,工资,奖金(comm),年薪(工资*12+comm)

select empno,ename,sal,comm,sal*12+nvl(comm,0) from emp;

说明:任何数值类型通过"+"和null连接在一起,结果是null,对于这种情况需要使用nvl()函数处理

nvl(列名,数值) 表示如果列值为null,使用数值代替null。

6.9.7 聚合(分组)函数

· count()

· sum()

· avg()

· min()

· max()

1)count(列名/*)

*: 表示统计表中数据的总数量

列名: 表示统计该列中,列值不为空的总数量

案例:统计emp表中,员工的总数量

select count(*) from emp;

案例:统计emp表中,奖金不为空的,员工的总数量

select count(comm) from emp;

练习:统计emp表中,员工职位的总数

select count(distinct job) from emp;

2)sum(列名) 统计列值累加之和

案例:统计emp表中,员工的工资总和

select sum(sal) from emp;

练习:统计emp表中,员工的奖金总和

select sum(comm) from emp;

3)avg(列名) 求平均值

案例:求emp表中,奖金的平均值

select avg(comm) from emp;

练习:求emp表中,工资的平均值

select avg(sal) from emp;

4)min(列名) 求最小值

案例:查询emp表中,员工的最低工资

select min(sal) from emp;

练习:查询emp表中,员工编号的最小值

select min(empno) from emp;

5)max(列名) 求最大值

案例:查询emp表中,员工的最高工资

select max(sal) from emp;

练习:查询emp表中,员工总数,工资总和,平均工资,最低工资,最高工资,并给每列起别名

select count(*) 员工总数,sum(sal) 工资总和,avg(sal) 平均工资,min(sal)

最低工资,max(sal) 最高工资 from emp;

6.9.8 分组查询

解释分组查询:在数据库中的表中,对表中某一列的数据,根据列值分成几组(相同的分成一组),然后对每一组的数据,使用聚合函数,聚合函数经常和分组查询一起使用。

格式:

select 列名/聚合函数from 表名where 条件group by 列名order by 列名/聚合函数 asc/desc;

案例:查询emp表中,每个部门的编号,部门的人数,部门的最高工资

select deptno,count(*),max(sal)from empgroup by deptno;

案例:查询emp表中,工资大于1000的,每个部门的编号,部门的工资总和,部门的平均工资

select deptno,sum(sal),avg(sal)from empwhere sal>1000group by deptno;

练习:查询emp表中,领导编号不为空的,每个部门的编号,部门的最高工资,部门的人数,根据部门编号升序排列

select deptno,max(sal),count(*)from empwhere mgr is not nullgroup by deptnoorder by deptno asc;

练习:查询emp表中,员工姓名中不包含C的,每个职位的名称,职位的最高工资,每个职位的人数,根据人数降序排列

select job,max(sal),count(*)from empwhere not ename like '%C%'group by joborder by count(*) desc;

6.9.9 having语句

解释:分组查询后,得到的结果,再次进行过滤,这个时候使用having语句

格式:

select 列名/聚合函数from 表名where 条件group by 列名having条件order by 列名/聚合函数 asc/desc;

where和having的区别:

· where是对整张表的数据进行过滤,可以单独使用

· having是对分组后的数据进行过滤,

having必须和group by一起使用。

案例:查询emp表中,部门的平均工资大于2000的,每个部门的编号,部门人数,部门的平均工资

select deptno,count(*),avg(sal)from empgroup by deptnohaving avg(sal)>2000;

练习:查询emp表中,工资在1000~5000之间的,每个职位的名称,职位的人数,职位的平均工资,职位的最高工资,要求职位的最高工资小于3000,根据平均工资降序排列

select job,count(*),avg(sal),max(sal)from empwhere sal>1000 and sal<5000group by jobhaving max(sal)<3000order by avg(sal) desc;

6.9.10 常用字符处理函数

1)length(字符串/列名) 统计字符串中字符/列值的个数

案例:查询emp表中,员工的姓名以及姓名的长度

select ename,length(ename) from emp;

案例:查询helloworld字符串的长度

说明:如果试题中没有表,可以使用系统自带表---dual可以验证各种函数的使用

select length('helloworld') from dual;

2)substr(参数1,参数2,参数3) 截取字符串---重点

· 参数1: 要截取的字符串/列名

· 参数2: 从哪里开始截取

如果是正数表示从正数第几位开始截取,如果是负数,表示从倒数第几位开始截取

· 参数3:截取的数量

select substr('helloworld',-3,2) from dual;

select substr('helloworld',5,3) from dual;

练习:查询emp表中,员工的姓名以及姓名最后2个字母

select ename,substr(ename,-2,2) from emp;

3)拼接字符串

· 使用 || 拼接字符串

select '窗前明月光' || '疑是地上霜' || '举头望明月' || '低头思故乡' from dual;select ename || job from emp;```sql- 使用concat拼接字符串```sqlconcat(字符串/列名,字符串/列名)

select ename,job,concat(ename,job) from emp;

复习:

· 模糊查询

select 列名 from 表名where 列名 like 条件;

条件:

%: 0个或者多个任意字符

_: 1个任意字符

· 处理空值的函数

nvl(列名,数值) 如果列值为null,使用数值代替null

· 聚合函数

count(列名/*)

*:表示统计表中数据总数量

列名:列值不为空的,数据总数量

sum(列名) 求和

avg(列名) 求平均值

min(列名) 求最小值

max(列名) 求最大值

· 分组查询

聚合函数经常和分组查询一起使用

select 列名/聚合函数from 表名 ---1where 条件 ---2group by 列名 ----3order by 列名/聚合函数 asc/desc;

· having语句

select 列名/聚合函数from 表名 ---1where 条件 ---2group by 列名----3having 条件order by 列名/聚合函数 asc/desc;

6.9.11 常用数值处理函数

1)round(数值,位数) 四舍五入函数

如果位数>0,表示小数点后保留几位小数,如果位数=0,不保留小数,位数<0,小数点之前第几位进行四舍五入

select round(35.376,2) from dual;select round(35.376,1) from dual;select round(35.576,0) from dual;select round(35.576,-1) from dual;----40select round(35.576,-2) from dual;----0

2)trunc(数值,位数) 截取函数

如果位数>0,表示小数点后保留几位小数,如果位数=0,不保留小数,位数<0,舍掉小数点之前第几位

select trunc(35.376,2) from dual;--35.37select trunc(35.376,1) from dual;--35.3select trunc(35.576,0) from dual;--35select trunc(35.576,-1) from dual;--30select trunc(35.576,-2) from dual;--0

6.9.12 常用日期处理函数

· 常见的日期格式:

系统默认格式: dd-mon月-yy

年月日格式: yyyy-mm-dd

年月日时分秒格式: yyyy-mm-dd hh24:mi:ss

1)sysdate 当前系统日期

案例:查询当前系统时间

select sysdate from dual;

练习:查询昨天、今天、明天的日期

select sysdate-1,sysdate,sysdate+1 from dual;

2)to_char(date,'日期格式的一部分')

案例:查询当前的月份

select to_char(sysdate,'mm') from dual;

练习:查询当前时间的分钟数

select to_char(sysdate,'mi') from dual;

练习:查询emp表中,12月份入职的,员工的编号,姓名,职位,入职时间(hiredate)--重点

select empno,ename,job,hiredatefrom empwhere to_char(hiredate,'mm')='12';

3)to_date('特殊日期格式的字符串','日期格式')

将字符类型按照某种日期格式,转换为日期类型,经常用于插入语句操作

案例:向emp表中插入2条记录

empno ename hiredate2345 ROSE 2019-5-9 2346 JACK 2000-10-112347 TOMS 2008-8-8

insert into emp(empno,ename,hiredate) values(2345,'ROSE',to_date('2019-5-9','yyyy-mm-dd'));insert into emp(empno,ename,hiredate) values(2346,'JACK',to_date('2000-10-11','yyyy-mm-dd'));insert into emp(empno,ename,hiredate) values(2347,'TOMS',to_date('2008-8-8','yyyy-mm-dd'));

6.9.13 多表连接查询

说明:多表连接查询就是,通过一条SQL语句,可以将分布在不同表中的数据,一次查询出来------多表连接查询

格式:

select 别名1.*/列名,别名2.*/列名,...from 表1 别名1,表2 别名2,.....where 关联条件;

案例:查询emp表中,员工的编号,姓名,职位以及dept表中,部门的编号,部门名称

select e.empno,e.ename,e.job,d.deptno,d.dnamefrom emp e,dept dwhere e.deptno=d.deptno;

说明:如果2张表中的,关联条件是通过"="相连接的,称为等值连接查询,特点是把2张表中有关联的数据全部查询出来。

案例:查询emp表中,工资在1000~5000之间的,员工的编号,姓名,职位,工资以及dept表中全部列的数据

select e.empno,e.ename,e.job,e.sal,d.*from emp e,dept dwhere e.deptno=d.deptno and e.sal>1000 and e.sal<5000;

练习:查询emp表中,工资大于1000的,员工的编号,姓名,职位,工资以及dept表中,部门的名称(dname),部门地址(loc),根据工资进行降序排列

select e.empno,e.ename,e.job,e.sal,d.dname,d.locfrom emp e,dept dwhere e.deptno=d.deptno and e.sal>1000order by e.sal desc;

练习:查询emp表中,员工姓名中不包含字母K的并且在10和20号部门下的,员工的编号,姓名,职位,以及dept表中部门名称,部门地址

select e.empno,e.ename,e.job,d.dname,d.locfrom emp e,dept dwhere e.deptno=d.deptno and not e.ename like '%K%' and (e.deptno=10 or e.deptno=20);

select e.empno,e.ename,e.job,d.dname,d.locfrom emp e,dept dwhere e.deptno=d.deptno and not e.ename like '%K%' and e.deptno in(10,20);

2)非等值连接查询

说明:如果2张表中,关联条件不是通过"="相连接的,称为非等值连接查询

案例:查询emp表中,员工的编号,姓名,职位,工资以及salgrade表中,工资等级(grade),最低工资(losal),最高工资(hisal)

emp表中的sal,一定在salgrade表中的最低工资(losal)和最高工资(hisal)之间

e.sal between s.losal and s.hisal

select e.empno,e.ename,e.job,e.sal,s.grade,s.losal,s.hisalfrom emp e,salgrade swhere e.sal between s.losal and s.hisal;

3)自连接

自连接查询就是,列与列之间存在关联关系,我们将1张表看成2张表,使用等值连接方式进行查询。

练习:查询emp表中,员工的编号,姓名,职位,领导编号(mgr),领导姓名

select e.empno,e.ename,e.job,e.mgr,m.enamefrom emp e,emp mwhere m.empno=e.mgr;

6.9.14 子(嵌套)查询

子查询就是在一个查询语句的内部,又包含一个查询语句。

案例:查询emp表中,工资大于平均工资的,员工的编号,姓名,职位,工资

1)求出平均工资

select avg(sal) from emp;

2)合成

select empno,ename,job,salfrom empwhere sal>(select avg(sal) from emp);

练习:查询emp表中,工资大于30号部门最高工资的,员工的编号,姓名,工资

select empno,ename,salfrom empwhere sal>(select max(sal) from emp where deptno=30);

练习:查询dept表中,部门地址(loc)是DALLAS下的,员工的编号,姓名,职位,工资

select e.empno,e.ename,e.job,e.salfrom emp e,dept dwhere e.deptno=d.deptno and d.loc='DALLAS';

select empno,ename,job,sal from emp where deptno=(select deptno from dept where loc='DALLAS');

练习:查询emp表中和JONES是同一个部门的,员工的编号,姓名,职位,部门编号

select empno,ename,job,deptno from emp where deptno=(select deptno from emp where ename='JONES');

复习:

1. 常见字符处理函数

· length(字符串/列名) 统计字符/列值的个数

· substr(参数1,参数2,参数3) 截取字符串

参数1:被截取的字符串/列名

参数2:从哪里开始截取

参数3:截取个数

拼接字符串 || 或者 concat

· || 可以无限拼接

· concat(字符串/列名,字符串/列名)

1. 常见数值处理函数

· round(数值,位数) 四舍五入函数

· trunc(数值,位数) 截取函数

1. 常见日期处理函数

· sysdate 获取系统当前日期

· to_char(date,'日期格式的一部分')

· to_date('日期格式的字符串','日期格式')

1. 多表连接查询

select 别名1.*/列名,别名2.*/列名...from 表1 别名1,表2 别名2....where 关联条件;

6.9.15 事务控制语句

1)提交事务---commit

create table test01(id number(4) primary key,name varchar2(30));insert into test01 values(101,'乔峰');insert into test01 values(102,'虚竹');select * from test01;commit;

2)回滚事务---rollback

说明:回滚事务只可以撤销未保存(没有提交事务的)的事务

insert into test01 values(103,'段誉');insert into test01 values(104,'许仙');select * from test01;rollback;

相关推荐

质量持续改善流程,34页产品研发质量管理流程框架及详细方案

分享职场干货,提升能力!为职场精英打造个人知识体系,升职加薪!产品研发质量管理流程框架及详细方案如何拿到分享的源文件:请您关注、转发,然后私信本头条号“文米”2个字,按照操作流程,专人负责发送源文件给...

[汇川PLC] 汇川IFA程序框架01-新建一个项目

汇川iFA对标西门子,新选择!汇川刚刚发布的iFA平台(2月14日),一眼望去就是对标西门子的全集成自动化平台博途(TIAPortal)。这个平台可以在一个平台上对PLC、变频器、伺服、工业机器人、...

IBM EPF企业过程框架(ibm erp)

前言本人野路子出身,在过往的经历中都是自己摸索着学习,并没有建立体系化的能力框架,也因此往往过多关注具体的技术细节,缺乏体系化方法论支撑。之前也曾尝试去学习“金字塔原理”、“平衡计分卡模型”、“TOG...

嵌入式MCU程序框架设计:三种经典模式,你该选哪种?

在嵌入式开发中,程序框架设计是决定系统性能、可维护性和开发效率的关键。今天,我们将介绍三种经典的嵌入式MCU程序框架设计模式:顺序执行的前后台系统、时间片轮询系统和多任务操作系统(RTOS)。每种模式...

资深工程师分享:PLC程序设计思路分享(二)

在论坛里面有个学员问了一个程序设计的问题,问题如下所示:我现在有个程序没有想到办法,就是有五个气缸!每次随机选择,按先选先动的顺序编程!应该怎么做!能不能写个程序看看?s7-1200的plc.。例如选...

135页企业流程框架——美的战略经营部咨询方法论(可提供PDF)

如果觉得本文不错,欢迎大家转发、点赞和评论,您的鼓励是我持续更新的不竭动力!如何拿到分享的源文件:请您关注本头条号,然后私信本头条号“俊知道”3个字,按照操作流程,专人负责发送源文件给您。...

单片机最好用的程序框架,莫过于状态机了

ZorbFramework是一个基于面向对象的思想来搭建一个轻量级的嵌入式框架。本次分享的是ZorbFramework的状态机的实现。中小型嵌入式程序说白了就是由各种状态机组成,因此掌握了如何构建...

智能硬件产品/项目研发流程框架及交付件模板V5.0

52页流程信息化总体规划项目,制造与供应链高阶流程框架L1-L4

分享职场干货,提升能力!为职场精英打造个人知识体系,升职加薪!流程信息化总体规划项目如何拿到分享的源文件:请您关注、转发,然后私信本头条号“文米”2个字,按照操作流程,专人负责发送源文件给您。...

这52张PPT把期货基础、研究框架和下半年策略都说透了

...

研报学习:稀土产业链研究框架(国信证券)

【推荐】AI大模型研究框架|附下载

锋行链盟推荐阅读非会员仅试读以上内容公众号:锋行链盟后台回复【9033】下载报告回复【5】领取人工智能大模型报告合集|3200份...

四川石窟寺“1+4”保护研究框架协议签订

来源:环球网【环球网文化综合报道】近日,巴中石窟保护利用项目专家论证会召开。四川石窟寺保护研究院、乐山大佛石窟研究院、安岳石窟研究院、广元石窟研究所、巴中石窟研究中心四方共同签订了《四川石窟寺“1+...

中考数学知识框架(中考数学知识点细目表)

如何使用知识框架进行学习和发展 | 2023年7月15日

今天想聊一聊知识框架这回事。在《费曼学习法》一书中看到了这样一个小故事:"从中学开始,小唐就拥有自己的学习小组,每个学习小组都代表了不同的兴趣和方向。他与不同的老师和同学在小组中做针对性的讨论...

取消回复欢迎 发表评论: