Oracle 經典面試題

来源:https://www.cnblogs.com/gaojinshun/archive/2019/04/27/10732812.html
-Advertisement-
Play Games

第一題 代碼生成表格如: 根據以上代碼生成的表寫出一條查詢語句,查詢結果如下: 第二題 第三題 第四題(這道題難度相對較高) ...


第一題

create table test(
   id number(10) primary key,
   type number(10) ,
   t_id number(10),
   value varchar2(6)
);

insert into test values(100,1,1,'張三');
insert into test values(200,2,1,'');
insert into test values(300,3,1,'50');

insert into test values(101,1,2,'劉二');
insert into test values(201,2,2,'');
insert into test values(301,3,2,'30');

insert into test values(102,1,3,'劉三');
insert into test values(202,2,3,'');
insert into test values(302,3,3,'10');

select * from test;

  代碼生成表格如:

  

 

 

 

根據以上代碼生成的表寫出一條查詢語句,查詢結果如下:

姓名 性別 年齡
張三 50
劉二 30
劉三 10

 

 

 

 

 

 

 

 

/*
根據表格可以分析出type列中1代表姓名、2代表性別、3代表年齡,而t_id中id一樣的為同一個人的屬性
查詢結果中列依次為姓名、性別、年齡,而type列決定姓名、性別、年齡
*/


/*使用分組,先對t_id進行分組,然後用decode函數過濾數據,例:decode(type, 1, value) type=1就顯示為value
由於分組後select後面的列欄位只能是分組的欄位或者組函數,所有使用max()。
同一個人的type沒有重覆數值所以 decode(type, 1, value)返回的值只有一個,最大值也就是這個值
*/
select max(decode(type, 1, value)) "姓名",
       max(decode(type, 2, value)) "性別",
       max(decode(type, 3, value)) "年齡"
  from test
 group by t_id;


/*使用連表,通過where過濾生成3張type分別等於1(姓名)、2(性別)、3(年齡)的3張虛擬表 如:
再通過where 連接條件 三張表t_id相等的為同一個人或者說同一條記錄(行)
*/
select t1.value "姓名",t2.value "性別",t3.value "年齡" from 
(select value,t_id from test where type=1) t1,
(select value,t_id from test where type=2) t2,
(select value,t_id from test where type=3) t3
where t1.t_id=t2.t_id and t1.t_id=t3.t_id;

 

第二題

/*

2.一道SQL語句面試題,關於group by
表內容:
2005-05-09 勝
2005-05-09 勝
2005-05-09 負
2005-05-09 負
2005-05-10 勝
2005-05-10 負
2005-05-10 負

如果要生成下列結果, 該如何寫sql語句?

          勝 負
2005-05-09 2 2
2005-05-10 1 2
------------------------------------------
create table tmp(rq varchar2(10),shengfu varchar2(5));

insert into tmp values('2005-05-09','勝');
insert into tmp values('2005-05-09','勝');
insert into tmp values('2005-05-09','負');
insert into tmp values('2005-05-09','負');
insert into tmp values('2005-05-10','勝');
insert into tmp values('2005-05-10','負');
insert into tmp values('2005-05-10','負');

select * from tmp;
*/

--使用分組
--按日期分組,用conut函數計算次數
select rq "日期",
       count(decode(shengfu, '', 1)) "勝",
       count(decode(shengfu, '', 1)) "負"
  from tmp
 group by rq
 order by rq;

--使用連表
--這道題本身就需要分組,不建議使用連表做
--以下使用的是SQL1999的連表方式,語法不一樣效果與第一題使用的SQL1992的一樣
select t1.rq,t1.勝, t2.負 from
(select count(decode(shengfu, '', 1)) "勝", rq from tmp group by rq) t1
join
(select count(decode(shengfu, '', 1)) "負", rq from tmp group by rq) t2
on t1.rq=t2.rq;

 

第三題

/*3.生成題目所需的表
create table STUDENT_SCORE ( name VARCHAR2(20), subject VARCHAR2(20), score NUMBER(4,1) ); insert into student_score (NAME, SUBJECT, SCORE) values ('張三', '語文', 78.0); insert into student_score (NAME, SUBJECT, SCORE) values ('張三', '數學', 88.0); insert into student_score (NAME, SUBJECT, SCORE) values ('張三', '英語', 98.0); insert into student_score (NAME, SUBJECT, SCORE) values ('李四', '語文', 89.0); insert into student_score (NAME, SUBJECT, SCORE) values ('李四', '數學', 76.0); insert into student_score (NAME, SUBJECT, SCORE) values ('李四', '英語', 90.0); insert into student_score (NAME, SUBJECT, SCORE) values ('王五', '語文', 99.0); insert into student_score (NAME, SUBJECT, SCORE) values ('王五', '數學', 66.0); insert into student_score (NAME, SUBJECT, SCORE) values ('王五', '英語', 91.0); 3.1得到類似下麵的結果 姓名 語文 數學 英語 王五 89 56 89 李四 xx xx xx select * from STUDENT_SCORE; 3.2有一張表,裡面有3個欄位:語文,數學,英語。其中有3條記錄分別表示語文70分,數學80分,英語58分, 請用一條sql語句查詢出這三條記錄並按以下條件顯示出來(並寫出您的思路): 大於或等於80表示優秀,大於或等於60表示及格,小於60分表示不及格。 顯示格式: 語文 數學 英語 及格 優秀 不及格 ------------------------------------------ */ --3.1 --使用分組 select name "姓名", max(decode(subject, '語文' ,score)) "語文", max(decode(subject, '數學' ,score)) "數學", max(decode(subject, '英語' ,score)) 英語 from STUDENT_SCORE group by name; --使用連表 select t1.name 姓名, t1.score 語文, t2.score 數學, t3.score 英語 from (select name,score from STUDENT_SCORE where subject='語文') t1 join (select name,score from STUDENT_SCORE where subject='數學') t2 on t1.name=t2.name join (select name,score from STUDENT_SCORE where subject='英語') t3 on t1.name=t3.name; --3.2 --在3.1的基礎上使用 case when then esle end select t.姓名, (case when t.語文>=80 then '優秀' when t.語文>=60 then '及格' else '不及格' end) 語文, (case when t.數學>=80 then '優秀' when t.數學>=60 then '及格' else '不及格' end) 數學, (case when t.英語>=80 then '優秀' when t.英語>=60 then '及格' else '不及格' end) 英語 from (select t1.name 姓名, t1.score 語文, t2.score 數學, t3.score 英語 from (select name,score from STUDENT_SCORE where subject='語文') t1 join (select name,score from STUDENT_SCORE where subject='數學') t2 on t1.name=t2.name join (select name,score from STUDENT_SCORE where subject='英語') t3 on t1.name=t3.name ) t;

 

第四題(這道題難度相對較高)

/*4.請用一個sql語句得出結果
從table1,table2中取出如table3所列格式數據,註意提供的數據及結果不准確,
只是作為一個格式向大家請教。
 

table1

月份mon 部門dep 業績yj
-------------------------------
一月份      01      10
一月份      02      10
一月份      03      5
二月份      02      8
二月份      04      9
三月份      03      8

table2

部門dep      部門名稱dname
--------------------------------
      01      國內業務一部
      02      國內業務二部
      03      國內業務三部
      04      國際業務部

table3 (result)

部門dep 一月份      二月份      三月份
--------------------------------------
      01      10        null      null
      02      10         8        null
      03      null       5        8
      04      null      null      9

------------------------------------------

create table yj01(
       month varchar2(10),
       deptno number(10),
       yj number(10)
)

insert into yj01(month,deptno,yj) values('一月份',01,10);
insert into yj01(month,deptno,yj) values('二月份',02,10);
insert into yj01(month,deptno,yj) values('二月份',03,5);
insert into yj01(month,deptno,yj) values('三月份',02,8);
insert into yj01(month,deptno,yj) values('三月份',04,9);
insert into yj01(month,deptno,yj) values('三月份',03,8);

create table yjdept(
       deptno number(10),
       dname varchar2(20)
)

insert into yjdept(deptno,dname) values(01,'國內業務一部');
insert into yjdept(deptno,dname) values(02,'國內業務二部');
insert into yjdept(deptno,dname) values(03,'國內業務三部');
insert into yjdept(deptno,dname) values(04,'國際業務部');
*/
select * from yj01;
select * from yjdept;
--使用分組
select deptno,
max(decode(month,'一月份',yj)) 一月份, 
max(decode(month,'二月份',yj)) 二月份, 
max(decode(month,'三月份',yj)) 三月份 
from yj01 group by deptno
order by deptno;


--這道題給出了兩張表,而用分組做,使用yj01表就能做出來了,所以這道題考察的應該是連表的知識
/*這兩張表中有的月份有的部門業績是空的,而用前幾道題的做法,不匹配條件的值會被過濾掉,
例如month=一月份的只有1部門,形成的表裡deptno只有1和二月份、三月份形成的表中的deptno無法匹配
而yjdept表中包含了所有部門編號deptno,這時就可以用到外連接的特性
(在滿足一張表的內容都顯示的基礎上,連接另外一張表,如果連接匹配則正常顯示,連接不匹配,另外一張表補null)
*/
select t1.deptno, t1.yj 一月份, t2.yj 二月份, t3.yj 三月份
from
(select y2.deptno,y1.yj from
(select yj, deptno from yj01  where month='一月份') y1 right join yjdept y2 on y1.deptno=y2.deptno)t1
join
(select y2.deptno,y1.yj from
(select yj, deptno from yj01  where month='二月份') y1 right join yjdept y2 on y1.deptno=y2.deptno)t2
on t1.deptno=t2.deptno
join
(select y2.deptno,y1.yj from
(select yj, deptno from yj01  where month='三月份') y1 right join yjdept y2 on y1.deptno=y2.deptno)t3
on t1.deptno=t3.deptno
order by t1.deptno;

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • STM32每個IO口具有7個寄存器來控制,每個IO口都可以自由進行編程式控制制,我們編程實際上控制的是通過控制那7個寄存器來控制我們的IO口,我們可以通過編程式控制制IO口,把IO口配置成如下八種模式: 1、輸入浮空2、輸入上拉3、輸入下拉4、模擬輸入5、開漏輸出6、推輓輸出7、推輓式復用功能8、開漏復用功 ...
  • 1. mysqlbinlog: [ERROR] unknown variable 'default-character-set=utf8mb4' 當我們在my.cnf中添加default-character-set=utf8mb4選項,那麼在mysqlbinlog查看binlog時就會報錯。 解決方 ...
  • 閱讀目錄 一、Hive內部表和外部表 1、Hive的create創建表的時候,選擇的創建方式: - create table - create external table 2、特點: ● 在導入數據到外部表,數據並沒有移動到自己的數據倉庫目錄下,也就是說外部表中的數據並不是由它自己來管理的!而表則 ...
  • Student: Course: SC: 1.資料庫的定義、刪除 1.1資料庫的定義(創建) 1 CREATE DATABASE student; 1.2資料庫的刪除 1 DROP DATABASE student; 2.表的定義、修改與刪除 2.1表的定義 建表語句: 1 CREATE TABLE ...
  • 原理: MySQL主從複製涉及到三個線程,一個運行在主節點(log dump thread),其餘兩個(I/O thread, SQL thread)運行在從節點,如下圖所示: l 主節點 binary log dump 線程 當從節點連接主節點時,主節點會創建一個log dump 線程,用於發送b ...
  • 首先百度搜索阿裡雲 如果是學生可以學生認證 然後註冊賬號->個人認證->學生認證 然後你會發現 伺服器一年只要114,114你買不了上當,買不了吃虧,買下麵的ECS伺服器,系統可以選擇window也可以選擇linux,編者用的centos7。 當然輕量級的應用伺服器也是可以的,這些輕量級伺服器會預裝 ...
  • Mysql子查詢 概念分析: 根據相關性分: (1)不相關子查詢:一條Sql語句中含有多條SELECT語句,先執行子查詢,再執行外查詢,子查詢可對立運行 關鍵字:(1)先子查詢,再外查詢 (2)可以對立運行,即可以單獨運行子查詢,對外查詢不幹擾 (2)相關子查詢:子查詢不能獨立運行,並且先運行外查詢 ...
  • 初學者都會接觸到三種表:emp、dept、salgrade表,進行練習各種語句操作再合適不過 但是,網上大多數的操作語句都是用oracle進行操作的,小編在學習mysql的時候,參考網上的書寫遇到了不少問題 都是由於oracle語句和mysql語句的不相容的引起的。 寫多行sql語句的時候或者嵌套查 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...