CMD——SQLPLUS----賬號 soctt 密碼 tiger,輸入完成後進入SQL數據庫,如圖顯示即連接成功。
連接成功後 ,我們首先設置一下基本界面,
--設置 每列顯示的字符數
set LINES 1000;
set pages 100;
--清屏
host cls
---------------------SQL語句中包含什麼信息
DQL
數據庫查詢語言
SELECT
DML
數據庫操作語言
INSERT DELETE UPDATE
DDL
數據庫定義語言
CREATE ALTER
DCL
數據庫控制語言
GRANT
今天我們主要學習的就是DQL,數據庫查詢語言。
默認情況下,Orale數據庫中有4張表我們需要關注分別是
--查詢表
SELECT TABLE_NAME FROM USER_TABLES;
DEPT
EMP
SALGRADE
BONUS
--查詢表對應的列
輸入DESC DEPT;
DEPTNO
DNAME
LOC
輸入DESC EMP;
EMPNO
ENAME
JOB
MGR
HIREDATE
SAL
COMM
DEPTNO
輸入DESC SALGRADE;
GRADE
LOSAL
HISAL
/*
DQL語言之列的查詢
*/
SELECT 列名 FROM 表名 WHERE 條件
--簡單的查詢列
SELECT ENAME FROM EMP;(查找EMP表中的ENAME列)
SELECT ENAME,SAL,JOB FROM EMP;(查找EMP表中 ENAME,SAL,JOB三列)
SELECT * FROM EMP;(查找EMP表中所有列)
*通配符:優點簡便,缺點效率低
--設置別名的三種方式
1、SELECT ENAME "員工姓名",SAL "薪資" FROM EMP;
2、SELECT ENAME AS "員工姓名",SAL AS "薪資" FROM EMP;
3、SELECT ENAME 員工姓名,SAL "薪資" FROM EMP;
推薦第三種方式,具體效果見下圖。
--去掉重復的列
SELECT DISTINCT JOB FROM EMP;
/*
DQL語言之條件查詢
*/
有時候我們需要根據一定的條件對數據庫中的數據進行查詢,下面就簡單的介紹一下DQL中的條件查詢。
在SQL中,查詢語句多用WHERE關鍵字
--等值查詢
SELECT ENAME,SAL FROM EMP WHERE SAL = 3000;
SELECT ENAME,SAL FROM EMP WHERE ENAME = 'SMITH';
SELECT ENAME,SAL FROM EMP WHERE JOB = 'SALESMAN'
--非等值查詢
SELECT ENAME,SAL FROM EMP WHERE SAL > 3000;
SELECT ENAME,SAL FROM EMP WHERE SAL < 3000;
SELECT ENAME,SAL FROM EMP WHERE SAL <= 3000;
SELECT ENAME,SAL FROM EMP WHERE SAL >= 3000;
SELECT ENAME,SAL FROM EMP WHERE SAL != 3000;
SELECT ENAME,SAL FROM EMP WHERE SAL <> 3000;
SELECT ENAME,SAL FROM EMP WHERE JOB <> 'SALESMAN';
<>符的意思也為不等號,其他符號意思同JAVA。
--區間
SELECT ENAME,SAL FROM EMP WHERE SAL BETWEEN 800 AND 1600;
--空值判斷 null
SELECT ENAME,COMM FROM EMP WHERE COMM IS NULL;
SELECT ENAME,COMM FROM EMP WHERE COMM IS NOT NULL;
--從集合中選取所需要的
SELECT ENAME,SAL FROM EMP WHERE ENAME IN('SMITH','SCOTT','ABCD');
SELECT ENAME,SAL FROM EMP WHERE ENAME NOT IN('SMITH','SCOTT','ABCD');
SELECT ENAME FROM EMP WHERE JOB IN('SALESMAN','CLERK');
--模糊查詢
--%代表了任意字符的任意次數
SELECT ENAME FROM EMP WHERE ENAME LIKE 'C%';(開頭為C的數據)
SELECT ENAME FROM EMP WHERE ENAME LIKE '%S';(結尾為S的數據)
SELECT ENAME FROM EMP WHERE ENAME LIKE 'S%';(開頭為S的數據)
SELECT ENAME FROM EMP WHERE ENAME LIKE '%S%';(數據中任意位置包含S的數據)
--_代表了任意字符的一次
SELECT ENAME FROM EMP WHERE ENAME LIKE '_A%';
SELECT ENAME FROM EMP WHERE ENAME LIKE '__A%';
SELECT ENAME FROM EMP WHERE ENAME LIKE '%A__';
--轉義字符
SELECT ENAME FROM EMP WHERE ENAME LIKE '%\%%' ESCAPE '\';
--排序
--ASC(默認)升序desc降序
SELECT * FROM EMP ORDER BY SAL;
SELECT * FROM EMP ORDER BY SAL ASC;
SELECTX * FROM EMP ORDER BY SAL DESC;
SELECT * FROM EMP ORDER BY HIREDATE;
SELECT * FROM EMP ORDER BY ENAME;
SELECT * FROM EMP ORDER BY JOB;
SELECT * FROM EMP ORDER BY JOB,EMPNO;
SELECT * FROM EMP ORDER BY DEPTNO,JOB DESC,EMPNO;
SELECT * FROM EMP WHERE ENAME LIKE '%A%' ORDER BY SAL;
--函數,類似於java中的方法
SELECT ENAME || '的年薪為' || SAL*12 FROM EMP;
SELECT ENAME,(SAL+COMM)*12 FROM EMP;
SELECT * FROM EMP ORDER BY COMM;
COMM=NULL?0:COMM;
--NVL (expr1, expr2)
--若expr1為NULL,返回expr2;expr1不為NULL,返回expr1。
--單行函數
-- 進去一個出來一個
/*
DQL語言之單行函數--數字
(JAVA) ABS CEIL FLOOR ROUND SQRT POW MOD
*/
SELECT SAL/1000,CEIL(SAL/1000) 向上取整,FLOOR(SAL/1000) 向下取整 FROM EMP;
SELECT SAL/1000,ROUND(SAL/1000) 四捨五入 FROM EMP;
SELECT SAL/1000,TRUNC(SAL/1000),TRUNC(SAL/1000,1),TRUNC(SAL/10,-2) FROM EMP;
SELECT MOD(SAL,8000) FROM EMP;
/*
DQL語言之單行函數--字符串
(JAVA) TRIM,REPLACE,SPLIT,SUBSTRING,TOUPPERCASE,TOLOWERCASE,CONCAT,INDEXOF,LIX,CHARAT
*/
SELECT CONCAT(CONCAT('員工的姓名為:',ENAME),'--AAAA') FROM EMP;
SELECT ENAME,UPPER(ENAME),LOWER(ENAME),INITCAP(ENAME) FROM EMP;
SELECT LTRIM(' A B '),RTRIM(' A B '),TRIM(' A B ') FROM EMP;
SELECT ENAME ,LPAD(ENAME,10,'#'),RPAD(ENAME,10,'&') FROM EMP;
SELECT ENAME,INSTR(ENAME,'A') FROM EMP;
SELECT ENAME,LENGTH(ENAME) FROM EMP;
/*
DQL語言之單行函數--日期
(Java)
*/
SELECT SYSDATE FROM DUAL;
SELECT SYSDATE + 13 FROM DUAL;
SELECT ADD_MONTHS(SYSDATE,12) FROM DUAL;
SELECT SYSDATE-HIREDATE FROM EMP;
SELECT MONTHS_BETWEEN(SYSDATE,HIREDATE) FROM EMP;
SELECT LAST_DAY(HIREDATE) FROM EMP;
SELECT NEXT_DAY(SYSDATE,'星期二') FROM DUAL;
/*
DQL語言之單行函數--轉換函數
*/
--將日期轉成字符串
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') FROM DUAL;
SELECT TO_CHAR(SYSDATE,'MON') FROM DUAL;
SELECT TO_CHAR(SYSDATE,'DY') FROM DUAL;
--將數字轉成字符串
SELECT TO_CHAR(1234.5678,'99999.99999') FROM DUAL;
SELECT TO_CHAR(1234.5678,'00000.00000') FROM DUAL;
SELECT TO_CHAR(1234.5678,'00.00') FROM DUAL;
SELECT TO_CHAR(1234.5678,'99.99') FROM DUAL;
SELECT TO_CHAR(1234.5678,'0000.00') FROM DUAL;
SELECT TO_CHAR(1234.5678,'9999.99') FROM DUAL;
SELECT TO_CHAR(1234.5678,'$00000.00000') FROM DUAL;
SELECT TO_CHAR(1234.5678,'L00000.00000') FROM DUAL;
SELECT TO_CHAR(1234567890,'$000,000,000,000.00') FROM DUAL;
--相反的
SELECT TO_DATE('2012-11-11','YYYY-MM-DD') FROM DUAL;
SELECT TO_NUMBER('123.45600','9999.99999') FROM DUAL;
SELECT TO_NUMBER('123.45600','0000.99999') FROM DUAL;
/*
DQL語言之單行函數--其他函數
*/
--多行(組)函數
-- 無論進去多少個,都出來一個
SELECT MAX(SAL),MIN(SAL),AVG(SAL) FROM EMP;
SELECT COUNT(SAL),SUM(SAL) FROM EMP;
SELECT MAX(ENAME),MIN(ENAME) FROM EMP;
--AVG和sum只能計算純數字
SELECT AVG(ENAME),SUM(ENAME) FROM EMP;
--空值的處理
SELECT MIN(COMM),MAX(COMM) FROM EMP;
SELECT COUNT(COMM) FROM EMP;
SELECT SUM(COMM) FROM EMP;
SELECT AVG(COMM) FROM EMP;
部分練習:
--1.找出各月倒數第3天受雇的所有員工.
SELECT ENAME,HIREDATE FROM EMP WHERE HIREDATE=LAST_DAY(HIREDATE)-2;
--2.找出早於12年前受雇的員工.
SELECT ENAME,HIREDATE FROM EMP WHERE MONTHS_BETWEEN(SYSDATE,HIREDATE)/12>13;
--3.以首字母大寫的方式顯示所有員工的姓名.
SELECT INITCAP(ENAME) FROM EMP;
--4.顯示正好為5個字符的員工的姓名.
SELECT ENAME FROM EMP WHERE LENGTH(ENAME)=5;
--5.顯示不帶有"R"的員工的姓名
SELECT ENAME FROM EMP WHERE ENAME NOT LIKE '%R%';
--6.顯示所有員工姓名的前三個字符.
SELECT SUBSTR(ENAME,1,3)FROM EMP;
--7.顯示所有員工的姓名,用a替換所有"A"
SELECT REPLACE(ENAME,'A','a')ENAME FROM EMP;
--8.顯示滿10年服務年限的員工的姓名和受雇日期.:
SELECT ENAME,HIREDATE FROM EMP WHERE MONTHS_BETWEEN(SYSDATE,HIREDATE)/12>10;
--9.顯示員工的詳細資料,按姓名排序.
SELECT * FROM EMP ORD;
--10.顯示員工的姓名和受雇日期,根據其服務年限,將最老的員工排在最前面.
SELECT ENAME,HIREDATE FROM EMP ORDER BY HIREDATE ASC;
--11.顯示所有員工的姓名、工作和薪金,按工作的降序排序,若工作相同則按薪金排序.
SELECT ENAME,JOB,SAL FROM EMP ORDER BY JOB DESC,SAL ASC;
--12.顯示所有員工的姓名、加入公司的年份和月份,按受雇日期所在月排序,若月份相同則將最早年份的員工排在最前面.
SELECT ENAME,TO_CHAR(HIREDATE,'MM-YYYY') FROM EMP ORDER BY TO_CHAR(HIREDATE,'MM')DESC,TO_CHAR(HIREDATE,'YYYY')ASC;
--14.找出在(任何年份的)2月受聘的所有員工。
SELECT ENAME,HIREDATE FROM EMP WHERE TO_CHAR(HIREDATE,'mm')=2;
--15.對於每個員工,顯示其加入公司的天數.
SELECT ENAME,ROUND(SYSDATE-HIREDATE)Day FROM EMP;
--16.顯示姓名字段的任何位置包含"A"的所有員工的姓名.
SELECT ENAME FROM EMP WHERE ENAME LIKE '%A%';