oracle查询练习
1
成绩表score如下,查询出每门课都大于80分的学生姓名
准备数据
-建表-
SQL> create table score(
2 name varchar(50),
3 kecheng varchar(50),
4 fenshu number(3)
5 );
插入数据
SQL> insert into score(name,kecheng,fenshu) values('张三','语文',81);
1 row inserted
SQL> insert into score(name,kecheng,fenshu) values('张三','数学',78);
1 row inserted
SQL> insert into score(name,kecheng,fenshu) values('李四','语文',76);
1 row inserted
SQL> insert into score(name,kecheng,fenshu) values('李四','数学',90);
1 row inserted
SQL> insert into score(name,kecheng,fenshu) values('王五','语文',81);
1 row inserted
SQL> insert into score(name,kecheng,fenshu) values('王五','数学',100);
1 row inserted
SQL> insert into score(name,kecheng,fenshu) values('王五','英语',88);
1 row inserted
score表
SQL> select * from score;
NAME KECHENG FENSHU
张三 语文 81
张三 数学 78
李四 语文 76
李四 数学 90
王五 语文 81
王五 数学 100
王五 英语 88
7 rows selected
方法一
SQL> select name from score group by name having min(fenshu)>80;
NAME
王五
方法二
SQL> select distinct name from score where name not in(
2 select name from score
3 where fenshu
2
删除除了自动编号不同,其他都相同的学生冗余信息
准备数据
SQL> create table students1
2 (
3 自动编号 number(5),
4 学号 number(10),
5 姓名 varchar(40),
6 课程编号 varchar(60),
7 课程名称 varchar(160),
8 分数 number(3)
9 );
Table created
SQL> insert into students1 values(1,2005001,'张三',0001,'数学',69);
1 row inserted
SQL> insert into students1 values(2,2005002,'李四',0001,'数学',69);
1 row inserted
SQL> insert into students1 values(3,2005001,'张三',0001,'数学',69);
1 row inserted
SQL> commit;
Commit complete
students1表
SQL> select * from students1;
自动编号 学号 姓名 课程编号 课程名称 分数
----------------------------------------
1 2005001 张三 1 数学 69
2 2005002 李四 1 数学 69
3 2005001 张三 1 数学 69
方法一
SQL> delete from students1 where 自动编号 not in(
2 select min(自动编号)
3 from students1
4 group by 学号,课程编号);
1 row deleted
方法二
SQL> delete from students1 where rowid not in(
2 select min(rowid)
3 from students1
4 group by 学号,课程编号);
1 row deleted
3
一个叫team的表,里面只有一个字段name,一共有4条记录,分别是abcd,对应4个球队,现在4个球队进行比赛,用一条sql语句显示所有可能的比赛组合
team表
SQL> select * from team;
NAME
a
SQL> select * from team;
NAMEb
c
d
方法一,考虑主客场
SQL> select * from team a,team b
2 where a.nameb.name;
NAME NAME
--------- ---------
a b
a c
a d
b a
b c
b d
c a
c b
c d
d a
d b
d c
12 rows selected
方法二,不考虑主客场
SQL> select * from team a,team b
2 where a.name
4
请用sql语句实现,从testdb数据表中查询出所有月份的发生额都比101科目相应月份的发生额
高的科目,
注意: testdb中有很多科目,都有1-12月份的发生额
testdb表
SQL> select * from testdb;
ACCID OCCMONTH DEBITOCCUR
------- -------- -----------
101 1 34
101 2 35
101 3 36
101 4 37
102 1 44
102 2 45
102 3 46
102 4 47
103 1 44
103 2 45
103 3 36
103 4 37
12 rows selected
方法一
SQL> select distinct accid from testdb where accid not in(
2 select b.accid
3 from testdb a,testdb b
4 where a.accid='101'
5 and b.accida.accid
6 and a.occmonth=b.occmonth
7 and a.debitoccur>=b.debitoccur)
8 and accid'101';
ACCID
-------
102
5
行转列,将表a查询为表b
表a
SQL> select * from a;
YEAR MONTH AMOUNT
---- ----- ------
1991 1 1.1
1991 2 1.2
1991 3 1.3
1991 4 1.4
1992 1 2.1
1992 2 2.2
1992 3 2.3
1992 4 2.4
8 rows selected
表b
YEAR M1 M2 M3 M4
---------- ---------- ---------- ---------- ----------
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4
方法一
SQL> select 1991 year,1.1 m1,1.2 m2,1.3 m3,1.4 m4 from dual
2 union all
3 select 1992 year,2.1 m1,2.2 m2,2.3 m3,2.4 m4 from dual;
YEAR M1 M2 M3 M4
---------- ---------- ---------- ---------- ----------
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4
方法二
SQL> select year,
2 max(case month when 1 then amount end) m1,
3 max(case month when 2 then amount end) m2,
4 max(case month when 3 then amount end) m3,
5 max(case month when 4 then amount end) m4
6 from a group by year;
YEAR M1 M2 M3 M4
---- ---------- ---------- ---------- ----------
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4
方法三
SQL> select * from
2 (select year,amount m1 from a where month=1)
3 natural join
4 (select year,amount m2 from a where month=2)
5 natural join
6 (select year,amount m3 from a where month=3)
7 natural join
8 (select year,amount m4 from a where month=4);
YEAR M1 M2 M3 M4
---- ---- ---- ---- ----
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4
6
article_history表存放文章的修改记录有以下字段,查询出所有文章的最后修改人和修改时间
title文章标题
last_time修改时间
username修改人姓名
source文章来源
pin_name作者笔名
article_history
SQL> select * from article_history;
TITLE LAST_TIME USERNAME SOURCE PIN_NAME
--------------------------------------------------------
1 2019/12/4 1 s cnblog s
2 2019/12/4 1 l cnblog l
1 2019/12/4 1 s cnblog s
2 2019/12/4 1 l cnblog l
1 2019/12/5 9 s cnblog s
方法一
SQL> select title,username,last_time from article_history where
(title,last_time) in(
2 select title,max(last_time)
3 from article_history
4 group by title);
TITLE USERNAME LAST_TIME
---------------------------------------------------------
2 l 2019/12/4 1
1 s 2019/12/5 9
7
有两个表AA和BB,均有key和value两个字段,如果BB的key在AA中也有,就把BB中的value换为AA中对应的value
准备数据
SQL> create table aa
2 (
3 key varchar(100),
4 value varchar(100)
5 );
Table created
SQL>
SQL> create table bb
2 (
3 key varchar(100),
4 value varchar(100)
5 );
Table created
SQL>
SQL> insert into aa values('aa','gond');
1 row inserted
SQL> insert into aa values('bb','tend');
1 row inserted
SQL> insert into aa values('cc','ailie');
1 row inserted
SQL> insert into bb values('aa','geng');
1 row inserted
SQL> insert into bb values('bb','dlis');
1 row inserted
SQL> insert into bb values('dd','lista');
1 row inserted
aa表
SQL> select * from aa;
KEY VALUE
--------------------------------
aa gond
bb tend
cc ailie
bb表
SQL> select * from bb;
KEY VALUE
----------------------------------
aa geng
bb dlis
dd lista
方法一
SQL> update bb b
2 set value=(select value from aa a where b.key=a.key)
3 where exists(select 1 from aa a where b.key=a.key);
2 rows updated
方法二
SQL> merge into bb b
2 using aa a
3 on(b.key=a.key)
4 when matched then
5 update
6 set b.value=a.value;
2 rows merged
8
什么是事务,事务有哪些特性,各个特性是什么意思
- 一个commit,rollback就是一个事务
- 原子性,一个事务,要么都执行,要么都回滚,是一个整体
- 一致性,事务发生之前,所有人查询数据都是一致的,事务发生之后,所有人查询数据都是一致的
- 隔离型,事务之间相互隔离,比如一个insert和另一个update,相互之间不影响
- 持久性,事务发生之后,如果没有别的事务,则数据不会再改变
9
有如下三个表
students表
SQL> select sno 学号,sname 姓名,class 所属班级 from students;
学号 姓名 所属班级
---------- -------------------- -----
108 曾华 95033
105 匡明 95031
107 王丽 95033
101 李军 95033
109 王芳 95031
103 陆君 95031
6 rows selected
courses表
SQL> select cno 课程编号,cname 课程名称 from courses;
课程编号 课程名称
----- --------------------
3-105 计算机导论
3-245 操作系统
6-166 数据电路
9-888 高等数学
scores表
SQL> select sno 学号,cno 课程编号,score 成绩 from scores;
学号 课程编号 成绩
----- -------------------- ------------
103 3-245 86.0
105 3-245 75.0
109 3-245 68.0
103 3-105 92.0
105 3-105 88.0
109 3-105 76.0
101 3-105 64.0
107 3-105 91.0
108 3-105 78.0
101 6-166 85.0
107 6-106 79.0
108 6-166 81.0
12 rows selected
1使用标准sql嵌套语句查询选修课程名称为'计算机导论'的学员学号和姓名
方法
SQL> select sno,sname from students where sno in(
2 select sno from scores where cno=(
3 select cno from courses where cname='计算机导论'));
SNO SNAME
---------- --------------------
103 陆君
105 匡明
109 王芳
101 李军
107 王丽
108 曾华
6 rows selected
2使用标准sql嵌套语句查询选修课程编号为'3-245'的学员姓名和班级
方法
SQL> select sname,class from students where sno in(
2 select sno from scores where cno='3-245');
SNAME CLASS
-------------------- -----
陆君 95031
匡明 95031
王芳 95031
3使用标准sql嵌套语句查询不选修课程编号为'6-166'的学员姓名和所属单位
方法
SQL> select sname,class from students where sno not in(
2 select sno from scores where cno='6-166');
SNAME CLASS
-------------------- -----
匡明 95031
陆君 95031
王芳 95031
王丽 95033
4查询选修了课程的学员人数
方法
SQL> select count(distinct sno) from scores;
COUNT(DISTINCTSNO)
------------------
6
5查询选修课程没有超过3门的学员学号和所属班级
方法
SQL> select sno,class from students where sno in(
2 select sno
3 from scores
4 group by sno having count(1)
10
查询表aplus中存在id重复三次以上的记录,写出查询语句
准备数据
SQL> create table aplus(
2 id number(6)
3 );
Table created
SQL>
SQL> insert into aplus values(1);
1 row inserted
SQL> insert into aplus values(1);
1 row inserted
SQL> insert into aplus values(2);
1 row inserted
SQL> insert into aplus values(2);
1 row inserted
SQL> insert into aplus values(2);
1 row inserted
SQL> insert into aplus values(3);
1 row inserted
SQL> insert into aplus values(3);
1 row inserted
SQL> insert into aplus values(3);
1 row inserted
SQL> insert into aplus values(3);
1 row inserted
aplus表
SQL> select * from aplus;
ID
SQL> select * from aplus;
ID 1
1
2
2
2
3
3
3
3
9 rows selected
方法一
SQL> select id
2 from aplus
3 group by id
4 having count(1)>3;
ID
-------
3
11
表sales(pid,sale_date,amount)分别代表产品id,销售日期,销售量. 查询出各个产品每天的销售占当月已销售额的比例
注意当月已销售额是指本月第一天到现在的总和
准备数据
SQL> create table sales(
2 pid number(10),
3 sale_date date,
4 amount number(16)
5 );
Table created
SQL> insert into sales
values(1,to_date(20191201,'yyyy/mm/dd'),7789);
1 row inserted
SQL> insert into sales
values(2,to_date(20101201,'yyyy/mm/dd'),2589);
1 row inserted
SQL> insert into sales
values(1,to_date(20191202,'yyyy/mm/dd'),6921);
1 row inserted
SQL> insert into sales
values(2,to_date(20101202,'yyyy/mm/dd'),3501);
1 row inserted
SQL> insert into sales
values(1,to_date(20191203,'yyyy/mm/dd'),7249);
1 row inserted
SQL> insert into sales
values(2,to_date(20101203,'yyyy/mm/dd'),3511);
1 row inserted
sales表
SQL> select * from sales;
PID SALE_DATE AMOUNT
----------- ----------- -----------------
1 2019/12/1 7789
2 2010/12/1 2589
1 2019/12/2 6921
2 2010/12/2 3501
1 2019/12/3 7249
2 2010/12/3 3511
6 rows selected
方法一
SQL> select pid,sale_date,amount,amount/sum_a
2 from (select a.pid,a.sale_date,a.amount,
3 (select sum(b.amount) from sales b where a.pid=b.pid) sum_a
4 from sales a);
PID SALE_DATE AMOUNT AMOUNT/SUM_A
----------- ----------- ----------------- ------------
1 2019/12/1 7789 0.3547064984
2 2010/12/1 2589 0.2696594104
1 2019/12/2 6921 0.3151782868
2 2010/12/2 3501 0.3646495156
1 2019/12/3 7249 0.3301152147
2 2010/12/3 3511 0.3656910738
6 rows selected
oracle查询练习的更多相关文章
- Oracle 查询出来的数据取第一条
Oracle 查询出来的数据取第一条 --------------------------------------------------------------------------- 转载自:h ...
- Oracle查询和问题简记
现在做两个版本的系统,一个用的数据库是Access,另一个就是Oracle了.每个数据库支持的的查询SQL语句都有所区别,这里主要针对Access和Oracle做 记录. 首先贴出遇到问题最多的一条语 ...
- 45 个非常有用的 Oracle 查询语句
这里我们介绍的是 40+ 个非常有用的 Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询.这些是所有 Oracle 开发者都必备的技能,所以快 ...
- oracle 查询最近执行过的 SQL语句(转载)
oracle 查询最近执行过的 SQL语句 (2014-06-09 18:02:43) 转载▼ 分类: Database oracle 查询最近执行过的 SQL语句 select sql_text ...
- 【转】oracle查询用户表,函数,储存过程,
◆Oracle查询用户表空间:select * from user_all_tables ◆Oracle查询所有函数和储存过程:select * from user_source ◆Oracle查询所 ...
- ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法
ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法 语法 第一种: 通过使用Oracle语句块 --指定文档所有部门都能查看 declare cursor TABLE_DEPT and ...
- Oracle 查询今天、昨日、本周、本月和本季度的所有记录
Oracle 查询今日.昨日.本周.本月和本季度的所有记录 字段类型为date 今日 select * from 表名 where to_char(字段名,'dd')=to_char(sysdate, ...
- oracle查询单表占用空间的大小
oracle查询单表占用空间的大小 SELECT segment_name AS TABLENAME, BYTES B, BYTES KB, BYTES MB FROM user_segments w ...
- ORACLE查询当前资产状态,和另一个数据库联查,(查询重复数据中第一条),子查询作为字段查询
背景:ORACLE查询当前资产状态,包含资产信息(表1),资产维修状态(表2),资产报废状态(表3) 如下: 资产信息:
- Oracle查询表里的重复数据方法:
一.背景 一张person表,有id和name的两个字段,id是唯一的不允许重复,id相同则认为是重复的记录. 二.解决 select id from group by id having count ...
随机推荐
- 让你的sql开启氮气加速
事情的过程是:公司有一个上百行的sql 运行在MySQL数据库,速度奇慢无比,逻辑乱七八糟,我就不贴出来了,经过这次修改想总结一下如何写一个不被人骂的sql. 说一些被人诟病的问题: 一.子查询 把你 ...
- scrapy爬取京东iPhone11评论(一)
咨询行业中经常接触到文本类信息,无论是分词做词云图,还是整理编码分析用,都非常具有价值. 本文将记录使用scrapy框架爬取京东IPhone11评论的过程,由于一边学习一边实践,更新稍慢请见谅. 1. ...
- Kruskal算法求最小生成树 笔记与思路整理
整理一下前一段时间的最小生成树的算法.(其实是刚弄明白 Kruskal其实算是一种贪心算法.先将边按权值排序,每次选一条没选过的权值最小边加入树,若加入后成环就跳过. 先贴张图做个示例. (可视化均来 ...
- 一句话CF
目录 \(\bf {Round \ \#500 \ (Div. \ 1)}\) \(\bf {Round \ \#589 \ (Div. \ 2)}\) \(\bf {Avito \ Cool \ C ...
- strGame:博弈论,trie
挺有意思的一道题.初探博弈论. 最好自己思考? 我们先考虑只有1轮游戏的情况. 这题明显要在字符串上一位一位地走,所以对字符串建立起trie. 最终建立起的trie的叶节点就是必败位置了. 对于非叶节 ...
- 星空 题意转化,差分,状压DP
好题(爆搜和puts("2")一个分(雾)),不得不说思维真的强. 首先发现区间翻转很难受,考虑用差分(异或满足可逆性),注意是从0到n+1 然后就转化题意,操作改为选取距离为L的 ...
- Python实现日志文件写入或者打印--类似于Java的Log4j
开发过Java的应该都知道Log4j的重要性,尤其是在开发测试中,能够让开发和测试人员方便找的bug,Python也有和Log4j相同功能的库那就是logging库,其功能非常强大,在开发测试中很方便 ...
- 使用websocketpp进行websocket通信
websocketpp介绍 websocketpp是一个只有头文件的支持websocket协议的C++开源库,支持websocket客户端和服务器功能,网络传输模块基于boost::asio 提供 s ...
- 瞎折腾实录:构建 Armel 版本的 .NET Core 教程和资料资源
目录 首先我要说明,我失败了~ 我把我的进度和经验放出来,希望能够帮助别人完成编译工作~ 背景:最近接手一个华为某型号的嵌入式设备,需要在上面搭建 .NET Core 环境. 设备是 Armel 架构 ...
- nyoj 243-交换输出 (swap)
243-交换输出 内存限制:64MB 时间限制:3000ms 特判: No 通过数:16 提交数:39 难度:1 题目描述: 输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输 ...