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.
------------------------------------------------- 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