Oracle初級——續續篇

来源:http://www.cnblogs.com/shandouji1121/archive/2017/12/07/8001611.html
-Advertisement-
Play Games

逝者如斯夫,不捨晝夜 所有的SQL都經過測試,可粘貼,可複製,有問題請各位大神指出...... 後續,會有視圖和索引,以及存儲過程的文章,客官們不要著急,耐心等待......... ...


 逝者如斯夫,不捨晝夜

所有的SQL都經過測試,可粘貼,可複製,有問題請各位大神指出......

  1   2 --約束
  3 
  4 與表一起使用
  5   6 約束不合理的數據,使其不能進入表中?
  7 
  8 insert into stu values ('13','李小龍','一班','該學生成天練武,不愛學習','不知道念什麼中學');
  9 
 10 約束的類型
 11 
 12 約束的種類(重要)?
 13 1、主鍵約束?
 14 表中能夠體現一行記錄的唯一標識,這樣的列就是主鍵?
 15 特性:?
 16 一張表中只能有一個主鍵約束?
 17 主鍵約束可能作用在不止一個列上(聯合主鍵)
 18 
 19 主鍵約束列中的值不能重覆?
 20 主鍵約束列中的值不允許出現nul
 21 
 22 如何創建主鍵?
 23 關鍵字?primary?key?
 24 創建表的時候直接創建主鍵?
 25 直接在列上指定主鍵
 26 
 27 
 28 create table haha(
 29              hahaid number primary key,
 30              hahaname varchar2(16),
 31              hahadate date
 32 );
 33 
 34 select * from haha ;
 35 --–註意:不能指定聯合主鍵
 36 建表語句後在指定主鍵
 37 
 38 drop table haha;
 39 create table haha(
 40        hahaid number,
 41        hahaname varchar2(16),
 42        hahadate date,
 43 constraint pk_haha_id primary key(hahaid)
 44 );
 45 --做聯合主鍵
 46 
 47 create table haha(
 48        hahaid number,
 49        hahaname varchar2(16),
 50        hahadate date,
 51 constraint pk_haha_id primary key(hahaid,hahaname)
 52 );
 53 
 54 創建表之後追加主鍵
 55 
 56 主鍵創建的規範:?
 57 一般來說,做為主鍵的列,應該沒有任何的實際意義。?
 58 一個列做為主鍵後,不應該有任何其他的意義。
 59 
 60 
 61 
 62 
 63 外鍵約束?
 64 關鍵字:foreign?key?
 65 一個表的某一個列關聯另一個表的主鍵或者唯一鍵,?
 66 這個列就是一個外鍵?emp中deptno?
 67 創建一個外鍵
 68 
 69 create table haha(
 70        hid number,
 71        hname varchar2(32),
 72        deptno number,
 73        constraint fk_haha_deptno foreign key(deptno)
 74 references dept(deptno)
 75 );
 76 --追加主鍵
 77 
 78 create table haha(
 79        hid number,
 80     hname varchar2(32),
 81       deptno number
 82 );
 83 alter table haha
 84 add constraint fk_haha_deptno foreign key(deptno)
 85 references dept(deptno);
 86 
 87 --3 唯一約束
 88 表中的某一個類,其錄入的值不能互相重覆
 89 
 90 --unique
 91 alter table haha
 92 add constraint un_haha_hname unique(hname);
 93 
 94 
 95 主鍵約束和唯一約束的區別(重要)?
 96 1)一張表中只能有一個主鍵,可以有多個唯一約束
 97 
 98 
 99 create table xixi(
100 xxid number,
101 xname1 varchar2(16),
102 xname2 varchar2(16),
103 xname3 varchar2(16),
104 constraint pk_xx_id primary key(xxid),
105 constraint un_xx_x1 unique(xname1),
106 constraint un_xx_x2 unique(xname2)
107 );
108 
109 2)主鍵的值必須是非空,唯一約束可以為空且可以不止一個為空?
110 3)主鍵創建的索引是聚集索引,?
111 唯一約束創建索引是非聚集索引(可以不提)
112 
113 --4、檢查性約束?
114 –關鍵字:check
115 
116 alter table xixi
117 add(salary number);
118 alter table xixi
119 add constraint ck_xixi_sal check(salary > 0
120 and salary < 2000);
121 create table xixi(
122 xxid number,
123 xname1 varchar2(16),
124 xname2 varchar2(16),
125 xname3 varchar2(16),
126 salary number,
127 constraint pk_xx_id primary key(xxid),
128 constraint un_xx_x1 unique(xname1),
129 constraint un_xx_x2 unique(xname2),
130 constraint ck_xixi_sal check(salary > 0
131 and salary < 2000)
132 );
133 
1345、非空約束?
135 –只能在列上定義,不能利用constraint關鍵字聲明?
136not?null
137 
138 create table xixi(
139 xxid number,
140 xname1 varchar2(16),
141 xname2 varchar2(16) not null,
142 xname3 varchar2(16) not null,
143 salary number,
144 constraint pk_xx_id primary key(xxid),
145 constraint un_xx_x1 unique(xname1),
146 constraint un_xx_x2 unique(xname2),
147 constraint ck_xixi_sal check(salary > 0
148 and salary < 2000)
149 );
150 
151 
152 一個列上可以作用多個約束
153 啟用和禁用約束?
154 預設的情況是約束啟用狀態?
155 禁用約束
156 
157 alter table xixi disable constraint ck_xixi_sal;
158 
159 alter table xixi enable constraint ck_xixi_sal;
160 
161 –啟用約束時,表中存在違反約束條件的數據時,約束無法啟用
162 
163 
164 --rownum 
165 偽劣
166 
167 select rownum , e.* from emp e ;
168 
169 
170 查詢工資前三的人
171 
172 select rownum, e.* from emp e where rownum <= 3 order by sal desc;
173 
174 錯誤?
175 查詢排在第3到第5的人?根據月薪
176 1)rownum表示的是排序之前的序號?
177 2)rownum在where中可以進行篩選,但是只能用<?<=?,?
178 其他的得不到結果
179 排前三
180 
181 select rownum,t1.* from (select * from emp order by sal desc)t1 where rownum <=3;
182 
183 
184 --–查詢排在第3到第5的人?根據月薪
185 
186 
187 select rownum,t1.* from (select * from emp order by sal desc)t1 where rownum <=5 minus select rownum,t1.*from 
188 (select * from emp order by sal desc)t1 where rownum <=2;
189 
190 --分頁顯示
191 select t2.* from (select rownum as haha, t1.*
192 from (select * from emp order by sal desc) t1--排序
193 ) t2--將rownum變成一個實際的列
194 where haha between 3 and 5;
195 
196 --rownum是oracle下的偽列?MySQL:limit ,SQL  server  top
197 
198 
199 
200 
201 子查詢:
202 
203 什麼是子查詢:
204 
205 單行單列子查詢
206 在一個查詢中嵌套的查詢被稱為子查詢
207 
208 -- 問題一:
209 
210 查詢和scott同一個部門的其他員工
211 
212 select *from emp where deptno = (select deptno from emp where ename = 'SCOTT') and ename <> 'SCOTT';
213 
214 單行多列子查詢(瞭解)
215 查詢與scott同部門,同經理的其他員工
216 
217 select * from emp e1 where (e1.deptno, e1.mgr) = (select e2.deptno, e2.mgr from emp e2 where e2.ename = 'SCOTT')
218 and e1.ename <> 'SCOTT';
219 
220 
221 多行子查詢(多行單列子查詢)
222 多行多列基本看不到
223 當子查詢結果返回的不止一條記錄,外部查詢不能使用=,而是
224 使用in進行條件關聯
225 練習:查詢scott或ADAMS同一個部門的員工信息
226 註意:在多行子查詢下 = 效率高還是in效率
227 當確定子查詢結果只有一條時,外部使用=,效率高
228 當無法確定子查詢結果的條目數,外部推薦使用in,
229 為了保證正確
230 犧牲了效率保證了正確率
231 --查詢與scott獎金數不同的人
232 
233 select * from emp where comm not in (select comm from emp where ename = 'SCOTT' or ename = 'ALLEN');
234 
235 
236 重點
237 not in
238 如果not in中的值出現null,則不會查詢出任何結果
239 確保子查詢結果中一定沒有null
240 
241 
242 select * from emp
243 where comm not in (select nvl(comm, 0) from emp
244 where ename = 'SCOTT'
245 or ename = 'ALLEN');
246 
247 
248 –子查詢可以使用再哪些語句中(嵌套子查詢)
249 1where(重要)
250 查詢比scott月薪高的人
251 
252 select * from emp
253 where sal > (select sal from emp where ename = 'SCOTT');
254 
255 --查詢與scott不在同一個部門的人
256 
257 select * from emp
258 where deptno <> (select deptno from emp where ename = 'SCOTT');
259 
260 from 重要
261 
262 select * from emp e,(select deptno,dname from dept) d
263 where e.deptno = d.deptno;
264 
265 
266 多表連接
267 
268 select * from emp, dept;
269 
270 笛卡爾積 
271 兩個集合“相乘”(結合),等於兩個集合中的每個元素互相組成 
272 一個新的元素。
273 
274 --1等值連接
275 
276 select * from emp, dept
277 where emp.deptno = dept.deptno;
278 
279 
280 --2、不等值連接 
281 不使用等號進行表的連接 <= >= 也是不等值連接 
282 查詢員工的姓名,月薪和工資級別 
283 姓名和月薪(EMP) 工資級別(salgrade)
284 
285 select e.ename, e.sal, s.grade
286 from emp e, salgrade s
287 where e.sal >= s.losal and e.sal <= s.hisal;
288 
289 --3、外連接 
290 查詢員工姓名和其所在部門的名稱,包括沒部門的員工
291 
292 select * from emp e, dept d
293 where e.deptno = d.deptno or e.deptno is null;
294 
295 
296 此方法不行,因為所有的null都出來
297 外連接(左外連接/右外連接) 
298 簡稱左連接 右連接
299 查詢員工姓名和其所在部門的名稱,包括沒部門的員工 
300 左連接 oracle 下的連接
301 
302 
303 select * from emp e, dept d
304 where e.deptno = d.deptno(+);
305 
306 
307 右連接 
308 查詢沒有員工的部門
309 
310 select * from emp e, dept d
311 where e.deptno(+)= d.deptno
312 
313 
314 多表外連接 
315 練習:查詢員工的姓名(empolyees),部門名稱(departments), 
316 工作城市(locations),沒部門的員工也要顯示出來 
317 (+)在多表連接中的傳遞
318 
319 select * from employees e,departments d, locations l
320 where e.department_id = d.department_id(+)
321 and d.location_id = l.location_id(+);
322 
323 
324 --4、自連接(難點) 
325 通常用於模擬層次關係的數據(行政體系,組織結構) 
326 查詢員工姓名e1.ename和其負責人的名字e2.ename
327 
328 
329 select e1.ename as 員工姓名 , e2.ename as 負責人姓名
330 from emp e1, emp e2
331 where e1.mgr = e2.empno ;
332 
333 
334 --SQL99標準 (重點)
335 joinon(…)
336 表A join 表B on(連接條件) where 篩選條件
337 
338 
339 等值連接 
340 查詢員工姓名和其部門的名稱
341 
342 select e.ename, d.dname
343 from emp e join dept d on(e.deptno = d.deptno);
344 
345 --查詢月薪高於1000的員工姓名和其部門的名稱
346 
347 select e.ename, d.dname
348 from emp e join dept d on(e.deptno = d.deptno)
349 where e.sal > 1000;
350 
351 
352 不等值連接 
353 查詢員工的姓名,月薪和工資級別 
354 姓名和月薪(EMP) 工資級別(salgrade)
355 
356 
357 select e.ename, e.sal, s.grade
358 from emp e join salgrade s
359 on(e.sal between s.losal and s.hisal);
360 
361 
362 自連接 
363 查詢員工姓名和其經理的姓名
364 
365 select e1.ename, e2.ename
366 from emp e1 join emp e2 on(e1.mgr = e2.empno );
367 
368 
369 
370 外連接 
371 左連接(常用) 
372 hr環境下,查詢員工的姓名,部門名稱,包含沒有部門的員工
373 
374 select e.first_name, d.department_name
375 from employees e left join departments d
376 on(e.department_id = d.department_id);
377 
378 右連接(意義不大,少用)
379 
380 select e.first_name, d.department_name
381 from employees e right join departments d
382 on(e.department_id = d.department_id);
383 
384 全連接
385 
386 select *
387 from employees e, departments d
388 where e.department_id(+) = d.department_id(+);
389 
390 --錯誤的語句,oracle做不了全連接
391 SQL99標準寫法
392 
393 select *
394 from employees e full join departments d
395 on(e.department_id = d.department_id);
396 
397 
398 
399 --集合
400 
401 union與union all關鍵字 
402 union 去掉重覆的記錄 
403 union 預設按照第一列進行排序
404 
405 select ename, sal from emp where sal > 1000
406 union select ename, sal from emp where sal < 1500;
407 
408 union all
409 不排序任何列,包含重覆的記錄
410 
411 select ename, sal from emp where sal > 1000
412 union  all select ename, sal from emp where sal < 1500;
413 
414 交集 intersect 取交集
415 
416 select ename, sal from emp where sal > 1000 intersect select ename, sal from emp where sal < 1500;
417 
418 相減
419 
420 select ename, sal from emp where sal > 1000
421 minus select ename, sal from emp where sal > 1500;
422 
423 
424 交並集的操作重要條件:(重要) 
425 組成集合的多個SQL語句,其查詢結果必須類型一致, 
426 而且應該意義相同,這些SQL語句應該有相同的結構
427 類型是一致,但是沒有意義
428 
429 
430 select ename, sal from emp where deptno = 10
431 union select ename, comm from emp
432 where deptno = 10;
433 
434 類型不一致的,語法錯誤
435 
436 select ename, sal from emp where deptno = 10
437 union select ename, hiredate from emp where deptno = 10;
438 
439 --不相同的結構,語法錯誤
440 select ename, sal
441 from emp where deptno = 10
442 union select ename, sal, comm from emp where deptno = 10;

後續,會有視圖和索引,以及存儲過程的文章,客官們不要著急,耐心等待.........


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

-Advertisement-
Play Games
更多相關文章
  • 話不多說,直接上代碼 分割線 [root@ip-172-31-9-121 ec2-user]# yum install mysql [root@ip-172-31-9-121 ec2-user]# yum install mysql-server tips:如果出現以下代碼,就需要下載mysql-s ...
  • 對於android調用JS代碼的方法有2種: 1. 通過WebView的loadUrl() 2. 通過WebView的evaluateJavascript() 對於JS調用Android代碼的方法有3種: 1. 通過WebView的addJavascriptInterface()進行對象映射 2. ...
  • 要使用Linux先要瞭解什麼是Linux,這篇隨筆簡單介紹一個Linux的起源與現狀。(挖坑填) ...
  • 第一次進入博客園 2017年12月7日 之前使用dos視窗時都輸入的是簡短的指令,今天突然感覺小框看著不舒服,就找了一下度娘,在這裡感謝萬能的百度,一鞠躬. 1.win+r打開dos命令視窗 2.cmd+ENTER 3.quit退出wmic模式 退出dos命令視窗時需要重新進行上述操作! ...
  • 1、下載需要的echo模塊https://github.com/openresty/echo-nginx-module/tags# wget https://github.com/openresty/echo-nginx-module/archive/v0.60.tar.gz# tar zxvf v ...
  • 本節學習目的 1)分析printk()函數 2)使用printk()調試驅動 1.在驅動調試中,使用printk(),是最簡單,最方便的辦法 當uboot的命令行里的“console=tty1”時,表示printk()輸出在開發板的LCD屏上 當uboot的命令行里的“console=ttySA0, ...
  • --Oracle中的複合查詢 複合查詢:包含集合運算(操作)的查詢 常見的集合操作有: union: 兩個查詢的並集(無重覆行、按第一個查詢的第一列升序排序) union all:兩個查詢的並集(有重覆行) intersect:兩個查詢的交集(無重覆行、按第一個查詢的第一列升序排序) minus: ... ...
  • --null的原理 --oracle一直將null和空字元串’’同等對待 --1.null的運算 --算術表達式和null 運算總為null,實際上所有的操作符除了||連接操作符外,只要有一個操作符為null,則結果為null。 --------------------------------nul... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...