SQL語句複習【專題一】

SQL語句複習【專題一】java

--建立用戶 scott 並設置密碼爲 tiger
create user scott identified by tiger
--用戶剛剛建立沒有任何的權限,連登陸的權限都沒有
--給用戶授予權限。
--角色:一個角色是一個權限的集合。
--經常使用的角色:connect Resource。
grant connect, resource to scott
--給scott 導入4張表。
--複製scott.sql中的內容,粘貼到一個命令窗口。
--BONUS:獎金錶: ename job sal comm
select * from bonus
--DEPT:部門表 deptno dname loc
select * from dept
--EMP:員工表 empno ename job mgr hriedate sal comm deptno
select * from emp
--SALGRADE :工資登記表 grade losal hisal
select * from salgrade

測試數據庫:Oracle-XE
可視化工具:PLSQL Developer
建議:複製到notepad++進行查看效果更加
測試數據表SQL:scott.sql
sql

  1 prompt PL/SQL Developer import file
  2 prompt Created on 2017Äê12ÔÂ24ÈÕ by Administrator
  3 set feedback off
  4 set define off
  5 prompt Creating BONUS...
  6 create table BONUS
  7 (
  8   ENAME VARCHAR2(10),
  9   JOB   VARCHAR2(9),
 10   SAL   NUMBER,
 11   COMM  NUMBER
 12 )
 13 tablespace USERS
 14   pctfree 10
 15   initrans 1
 16   maxtrans 255
 17   storage
 18   (
 19     initial 64K
 20     next 1M
 21     minextents 1
 22     maxextents unlimited
 23   );
 24 
 25 prompt Creating DEPT...
 26 create table DEPT
 27 (
 28   DEPTNO NUMBER(2) not null,
 29   DNAME  VARCHAR2(14),
 30   LOC    VARCHAR2(13)
 31 )
 32 tablespace USERS
 33   pctfree 10
 34   initrans 1
 35   maxtrans 255
 36   storage
 37   (
 38     initial 64K
 39     next 1M
 40     minextents 1
 41     maxextents unlimited
 42   );
 43 alter table DEPT
 44   add constraint PK_DEPT primary key (DEPTNO)
 45   using index 
 46   tablespace USERS
 47   pctfree 10
 48   initrans 2
 49   maxtrans 255
 50   storage
 51   (
 52     initial 64K
 53     next 1M
 54     minextents 1
 55     maxextents unlimited
 56   );
 57 
 58 prompt Creating EMP...
 59 create table EMP
 60 (
 61   EMPNO    NUMBER(4) not null,
 62   ENAME    VARCHAR2(10),
 63   JOB      VARCHAR2(9),
 64   MGR      NUMBER(4),
 65   HIREDATE DATE,
 66   SAL      NUMBER(7,2),
 67   COMM     NUMBER(7,2),
 68   DEPTNO   NUMBER(2)
 69 )
 70 tablespace USERS
 71   pctfree 10
 72   initrans 1
 73   maxtrans 255
 74   storage
 75   (
 76     initial 64K
 77     next 1M
 78     minextents 1
 79     maxextents unlimited
 80   );
 81 alter table EMP
 82   add constraint PK_EMP primary key (EMPNO)
 83   using index 
 84   tablespace USERS
 85   pctfree 10
 86   initrans 2
 87   maxtrans 255
 88   storage
 89   (
 90     initial 64K
 91     next 1M
 92     minextents 1
 93     maxextents unlimited
 94   );
 95 alter table EMP
 96   add constraint FK_DEPTNO foreign key (DEPTNO)
 97   references DEPT (DEPTNO);
 98 create bitmap index INDEX_EMP_JOB on EMP (JOB)
 99   tablespace USERS
100   pctfree 10
101   initrans 2
102   maxtrans 255
103   storage
104   (
105     initial 64K
106     next 1M
107     minextents 1
108     maxextents unlimited
109   );
110 create index INDEX_EMP_SAL on EMP (SAL)
111   tablespace USERS
112   pctfree 10
113   initrans 2
114   maxtrans 255
115   storage
116   (
117     initial 64K
118     next 1M
119     minextents 1
120     maxextents unlimited
121   );
122 create index INDEX_EMP_SAL_JOB on EMP (SAL DESC, JOB)
123   tablespace USERS
124   pctfree 10
125   initrans 2
126   maxtrans 255
127   storage
128   (
129     initial 64K
130     next 1M
131     minextents 1
132     maxextents unlimited
133   );
134 
135 prompt Creating SALGRADE...
136 create table SALGRADE
137 (
138   GRADE NUMBER,
139   LOSAL NUMBER,
140   HISAL NUMBER
141 )
142 tablespace USERS
143   pctfree 10
144   initrans 1
145   maxtrans 255
146   storage
147   (
148     initial 64K
149     next 1M
150     minextents 1
151     maxextents unlimited
152   );
153 
154 prompt Disabling triggers for BONUS...
155 alter table BONUS disable all triggers;
156 prompt Disabling triggers for DEPT...
157 alter table DEPT disable all triggers;
158 prompt Disabling triggers for EMP...
159 alter table EMP disable all triggers;
160 prompt Disabling triggers for SALGRADE...
161 alter table SALGRADE disable all triggers;
162 prompt Disabling foreign key constraints for EMP...
163 alter table EMP disable constraint FK_DEPTNO;
164 prompt Deleting SALGRADE...
165 delete from SALGRADE;
166 commit;
167 prompt Deleting EMP...
168 delete from EMP;
169 commit;
170 prompt Deleting DEPT...
171 delete from DEPT;
172 commit;
173 prompt Deleting BONUS...
174 delete from BONUS;
175 commit;
176 prompt Loading BONUS...
177 prompt Table is empty
178 prompt Loading DEPT...
179 insert into DEPT (DEPTNO, DNAME, LOC)
180 values (10, 'ACCOUNTING', 'NEW YORK');
181 insert into DEPT (DEPTNO, DNAME, LOC)
182 values (20, 'RESEARCH', 'DALLAS');
183 insert into DEPT (DEPTNO, DNAME, LOC)
184 values (30, 'SALES', 'CHICAGO');
185 insert into DEPT (DEPTNO, DNAME, LOC)
186 values (40, 'OPERATIONS', 'BOSTON');
187 commit;
188 prompt 4 records loaded
189 prompt Loading EMP...
190 insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
191 values (7369, 'SMITH', 'CLERK', 7902, to_date('17-12-1980', 'dd-mm-yyyy'), 800, null, 20);
192 insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
193 values (7499, 'ALLEN', 'SALESMAN', 7698, to_date('20-02-1981', 'dd-mm-yyyy'), 1600, 300, 30);
194 insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
195 values (7521, 'WARD', 'SALESMAN', 7698, to_date('22-02-1981', 'dd-mm-yyyy'), 1250, 500, 30);
196 insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
197 values (7566, 'JONES', 'MANAGER', 7839, to_date('02-04-1981', 'dd-mm-yyyy'), 2975, null, 20);
198 insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
199 values (7654, 'MARTIN', 'SALESMAN', 7698, to_date('28-09-1981', 'dd-mm-yyyy'), 1250, 1400, 30);
200 insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
201 values (7698, 'BLAKE', 'MANAGER', 7839, to_date('01-05-1981', 'dd-mm-yyyy'), 2850, null, 30);
202 insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
203 values (7782, 'CLARK', 'MANAGER', 7839, to_date('09-06-1981', 'dd-mm-yyyy'), 2450, null, 10);
204 insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
205 values (7788, 'SCOTT', 'ANALYST', 7566, to_date('19-04-1987', 'dd-mm-yyyy'), 3000, null, 20);
206 insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
207 values (7839, 'KING', 'PRESIDENT', null, to_date('17-11-1981', 'dd-mm-yyyy'), 5000, null, 10);
208 insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
209 values (7844, 'TURNER', 'SALESMAN', 7698, to_date('08-09-1981', 'dd-mm-yyyy'), 1500, 0, 30);
210 insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
211 values (7876, 'ADAMS', 'CLERK', 7788, to_date('23-05-1987', 'dd-mm-yyyy'), 1100, null, 20);
212 insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
213 values (7900, 'JAMES', 'CLERK', 7698, to_date('03-12-1981', 'dd-mm-yyyy'), 950, null, 30);
214 insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
215 values (7902, 'FORD', 'ANALYST', 7566, to_date('03-12-1981', 'dd-mm-yyyy'), 3000, null, 20);
216 insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
217 values (7934, 'MILLER', 'CLERK', 7782, to_date('23-01-1982', 'dd-mm-yyyy'), 1300, null, 10);
218 commit;
219 prompt 14 records loaded
220 prompt Loading SALGRADE...
221 insert into SALGRADE (GRADE, LOSAL, HISAL)
222 values (1, 700, 1200);
223 insert into SALGRADE (GRADE, LOSAL, HISAL)
224 values (2, 1201, 1400);
225 insert into SALGRADE (GRADE, LOSAL, HISAL)
226 values (3, 1401, 2000);
227 insert into SALGRADE (GRADE, LOSAL, HISAL)
228 values (4, 2001, 3000);
229 insert into SALGRADE (GRADE, LOSAL, HISAL)
230 values (5, 3001, 9999);
231 commit;
232 prompt 5 records loaded
233 prompt Enabling foreign key constraints for EMP...
234 alter table EMP enable constraint FK_DEPTNO;
235 prompt Enabling triggers for BONUS...
236 alter table BONUS enable all triggers;
237 prompt Enabling triggers for DEPT...
238 alter table DEPT enable all triggers;
239 prompt Enabling triggers for EMP...
240 alter table EMP enable all triggers;
241 prompt Enabling triggers for SALGRADE...
242 alter table SALGRADE enable all triggers;
243 set feedback on
244 set define on
245 prompt Done.
scott.sql Code


------------------------------------------------- DQL 最基本的查詢語句 --------------------------------------------
數據庫

--最簡單的sql 語句【查詢全部員工的信息】
--* 通配符 表明全部的。 select 後跟的是要查詢的內容。from 後跟表的名稱。
select * from emp;ide

--部分表字段內容查詢【查詢員工的編號,名稱,工資,部門編號】
select empno, ename, sal, deptno from emp;函數

使用算術表達式【查詢員工的姓名,工做,年薪】
select ename, job, sal*12 from emp;
--把獎金加上, 任何數據和 null 運算,結果仍是 null。
select ename, job, sal*12+comm from emp;工具

查詢結果中的字段使用別名:在字段名後使用關鍵字 字段名 as "別名",做用[方便查看查詢結果]
--注意:as關鍵字能夠缺省不寫,別名中沒有特殊的字符雙引號也能夠缺省
--方式-1
select empno 員工編號 from emp;
--方式-2
select empno "員工編號",ename "員工姓名" from emp;
--方式-3
select empno as "員工編號",ename as "員工姓名",job as "工做職位" from emp;測試

使用鏈接符 || 至關於 java 中的 + 鏈接符
--編號是XXX的員工的名字爲XXXX,入職日期爲XXX
select '編號是:' || empno || '的員工的名字爲:' || ename ||',入職日期爲:'|| hiredate from emp;spa

去除重複行 distinct
--查詢全部的部門編號
select deptno from emp;
--去除重複行的編號
select distinct deptno from emp;
--去除多個字段組合的重複行
select distinct deptno, job from emp;3d

排序 order by 默認是升序排列 asc 降序 desc
--按照部門編號進行升序排序
select * from emp order by deptno asc;
--按照部門編號進行降序排序並去除部門重複
select distinct deptno from emp order by deptno desc;
--查詢員工的全部的信息,員工的部門編號升序排列,部門編號相同的,工資降序排列
select * from emp order by deptno asc ,sal desc;
--字符串排序(姓名)
select ename from emp order by ename;
排序的時候,使用字段的別名
--排序時使用算術表達式
select ename, job, sal*12 as 年薪 from emp order by sal*12;
--使用別名進行排序
select ename, job, sal*12 as 年薪 from emp order by 年薪;code

sql 中那些內容是大小寫敏感的?哪些是不敏感的。
關鍵字 大小寫不敏感
SELECT * FROM emp
表名    大小寫不敏感
select * from EMP
字段名 大小寫不敏感
select ENAME, job, MGR from emp
元組的內容,字段的內容,大小寫是敏感的。
select * from emp where ename='SMITH'
select * from emp where ename='smith'--查詢不到數據

where 子句 後跟篩選數據的條件(進行 行數據的過濾)
--查詢姓名 爲 scott的員工的信息
select * from emp where ename='SCOTT'

--查詢入職日期爲1981/4/2 的員工的信息
--1 :使用默認的日期的字符串形式 'DD-MON-RR‘
select * from emp where hiredate='2-4月-1981'

使用運算符進行篩選 =,>,>=,<,<=,<>或者!= 單個條件中
select * from emp where sal>1600 order by sal
select * from emp where sal<1600 order by sal
select * from emp where sal>=1600 order by sal
select * from emp where sal<=1600 order by sal
select * from emp where sal=1600 order by sal
select * from emp where sal!=1600 order by sal
select * from emp where sal<>1600 order by sal

--查詢工資在1000-2000之間的全部的員工的信息
--and 至關於 而且 java 中的 &&
select * from emp where sal >=1000 and sal <=2000
--between xx and xx 閉區間的
select * from emp where sal between 1000 and 2000

--查詢 員工信息 工資是 1100 或者是 1600
--or 表明或者的意思
select * from emp where sal=1100 or sal=1600

--查詢全部員工中工種爲 clerk manager analyst 的員工的信息 ename ,job deptno
select ename, job,deptno from emp where job='CLERK' or job='MANAGER' or job='ANALYST'
-- 在集合中的某一個值就能夠 in ()
select ename, job, deptno from emp where job in ('CLERK','MANAGER','ANALYST')

模糊查詢 like【% 表明 任意個字符 通配符,_ 表明一個字符】
select * from emp
--查詢名稱的第一個字符爲 A 的員工的信息
select * from emp where ename like 'A%'
--查詢名字中包含A 字符的
select * from emp where ename like '%A%'
--查詢第二個字符爲A 的員工的信息
select * from emp where ename like '_A%'
--查詢不包含A字符的員工信息
select * from emp where ename not like '%A%'
--特殊狀況 名字中包含 _ 員工的信息
select * from emp where ename like '%\_%' escape '\'

空判斷【is null   is not null】
--全部獎金爲空的員工的信息
select * from emp where comm is null
--不爲空的員工的信息
select * from emp where comm is not null

--查詢 工資在 1000--2000 之間 或者是職位是 職員 的員工的信息
--查詢職員
select * from emp where job='CLERK'
select * from emp where job='CLERK' or sal between 1000 and 2000

--工做是 clerk 或者 manager 而且 sal 大於 1500的
--鏈接條件的關鍵字的鏈接的優先級,配合小括號使用
select * from emp where (job='CLERK' or job='MANAGER') and sal > 1000

僞表 dual 也稱爲虛表
-- 存在的意義:不依賴於任何表的查詢或者是計算的工做。
-- 查詢系統日期,和當前用戶
select sysdate from dual
select user from dual
select * from dual
select 1+1 from dual
select ceil(1.5) from dual

函數分類【函數名大小寫不敏感】
1:單行函數:對於一個查詢的結果計算以後會獲得一個對應的結果。
2:多行函數:對於多個結果處理以後獲得一個結果。

單行函數:日期處理函數、字符串處理函數、數序運算的函數,轉換函數,通用函數
--將emp表中全部的員工的姓名所有小寫輸出
select ename, lower(ename) from emp
-- 查詢全部員工的名字 和入職天數
select ename,sysdate-hiredate 入職天數 from emp
select ename ,floor(sysdate- hiredate) 入職天數 from emp
-- 查詢全部員工的名字 和入職月數,要求整月輸出。 函數的嵌套使用。
select ename,floor(months_between(sysdate, hiredate)) 入職的月數 from emp
-- 查詢下週三的日期
select next_day(sysdate,'星期三') from dual
-- 查詢本月最後一天的日期
select last_day(sysdate) from dual
-- 查詢全部員工的入職的星期數,年數,使用別名顯示 按照入職時間長短 升序排列
select ename, round((sysdate-hiredate)/7) as "星期數" , round((sysdate-hiredate)/365) as 年數 from emp order by 星期數

轉換函數【to_number to_char to_date】
to_number:字符串 -->數值的轉換
to_char: 數值--->字符串 的轉換 日期 --->字符串的轉換
to_date:字符串--->日期的轉換
--數值和字符串之間的相互轉換
--java Integer.toString(int) Integer.parseInt(String)
--日期對象和字符串之間的相互轉換
--sdf String format(Date) Date parse(String)
自動轉換 
--字符串自動轉換爲數值形式
select '2' -'2' from dual
--數值向字符串的自動轉換
select 1 || 1 from dual

函數轉換
數值--->字符串 的轉換 (to_char(number, format) )
--9:表明一位數字,整數部分:若是該位沒有數字則不進行顯示,但對於小數點後面的部分仍會強制顯示
select to_char(123123.123 ,'L999,999.9999') from dual
--0:表明一位數字,若是該位沒有數字則強制顯示0 整數和小數部分
select to_char(123.123 ,'L000,000.00000') from dual

日期-->字符串(to_char(date,format))
--將全部員工的受僱日期,按照指定的格式顯式 2018-09-26 16:19:33
select hiredate, to_char(hiredate, 'YYYY-MON-DD HH24:MI:SS') from emp
--員工入職的年份
select round((sysdate-hiredate)/365) 年數 from emp
select to_char(sysdate,'YYYY')-to_char(hiredate,'YYYY') 年數 from emp

to_date : 字符串到日期對象
將日期字符串轉換爲 日期對象 和 hiredate 比較
將字符串解析爲 日期對象 解析的格式須要和 日期字符串 一致。
--查詢 XXXX時間以後入職的員工信息 1981/4/2
select * from emp where hiredate > to_date('1981/4/2','YYYY/MM/DD') order by hiredate
--查詢 指定 日期之間的入職的員工的信息 1981/4/2 1982/1/23
select * from emp where hiredate > to_date('1981/4/2','YYYY/MM/DD') and hiredate < to_date('1982/1/23','YYYY/MM/DD')
select * from emp where hiredate between to_date('1981/4/2','YYYY/MM/DD') and to_date('1982/1/23','YYYY/MM/DD')

to_number:將字符串轉換爲 數值 
select to_number('$123.123','$000.000') + 1 from dual
select to_number('¥123.123','L999.999') + 1 from dual
--select '¥123.123' + 1 from dual

通用函數:(nvl (exp1,exp2) : 若是exp1 是null 那麼返回 exp2 若是不是null 就返回自身)
--全部員工的年薪
select ename, sal*12 +comm 年薪 from emp
select ename, sal *12 + nvl(comm, 0) 年薪 from emp
--nvl2(exp1,exp2,exp3) : 參數的意義 :若是exp1 是null 就返回 exp3 ,不然返回 exp2
select ename, sal * 12 + nvl2(comm, comm, 0) 年薪 from emp

decode (value, key0,value0,key1,value 1,..... ,valuen)
參數的意思,若是 value 的值 是 key0? 整個函數返回 value0 ,若是值是key1就返回value1,以此類推,若是都沒有找到合適,最後返回 valuen。
--查詢工種並去除重複
select distinct job from emp
--將emp 表中全部的員工的名字 工做 以及工做中文顯示
select ename, job, decode(job,'CLERK','職員','SALESMAN','銷售','PRESIDENT','主席','MANAGER','經理','ANALYST','分析師') 中文職業 from emp
select ename, job, decode(job,'SALESMAN','銷售','PRESIDENT','主席','MANAGER','經理','ANALYST','分析師','職員') 中文職業 from emp

------------------------------------------------- 一波小練習 -------------------------------------------

 1 --1:查詢每月倒數第三天入職的員工的信息
 2 select * from emp where hiredate=last_day(hiredate)-2
 3 
 4 --2:找出早於35年前入職的員工的信息
 5 select * from emp where (sysdate-hiredate)/365 > 35
 6 select * from emp where to_char(sysdate,'YYYY')-to_char(hiredate,'YYYY') > 35
 7 
 8 --3:將全部的員工的名稱所有小寫輸出
 9 select ename, lower(ename) from emp
10 
11 --4:顯示不帶有字符E的員工的姓名
12 select ename from emp where ename not like '%E%'
13 
14 --5:顯示名字長度爲5的員工的名字
15 select ename from emp where length(ename)=5
16 
17 --6:顯示全部員工的名字的前3個字符
18 select ename, substr(ename,1,3) from emp
19 
20 --7:顯示全部員工的姓名把 A 換成 a 顯示
21 select ename, replace(ename,'A','a') from emp
22 
23 --8:顯示全部的員工的信息,按照姓名排序
24 select * from emp order by ename
25 
26 --9:顯示員工的姓名,加入公司的月份,年份,按照月份排序,若是月份相同,則按照年份排序
27 select ename, to_char(hiredate,'MM') 月份, to_char(hiredate,'YYYY') 年份 from emp order by 月份,年份
28 
29 --10:顯示全部員工的姓名,受僱日期,按照受僱日期的長短,將服務最長時間的人排在前面。升序
30 select  ename, hiredate from emp order by hiredate
31 
32 --11:顯示全部員工的姓名,工做,薪金,按照工做的降序排序,工做相同,按照工資升序排。
33 select ename,job,sal from emp order by job desc, sal asc
34 
35 --12:找出全部在二月份入職的員工信息
36 select * from emp where to_char(hiredate,'MM')=2
37 
38 --13:將全部的員工加入公司的天數顯示。
39 select ename, floor(sysdate-hiredate) 入職天數 from emp
40 
41 --14:將「¥123」顯示爲數值
42 select to_number('¥123','L000') from dual
SQL小練習
相關文章
相關標籤/搜索