Oracle總結(SQL)
阿新 • • 發佈:2019-04-01
函數 acl 向上 ons 字段 alter hello sel 邏輯
--SQL結構查詢語言 1 數據庫定義語言(DDL)用於建立、刪除和修改數據庫對象 CREATE ALTER DROP TRUNCATE 2 數據庫操縱語言(DML)用於改變數據庫表中的數據 INSERT UPDATE DELETE 3 事務控制語言(TCL)用來維護數據一致性的語言 COMMIT ROLLBACK SAVEPOINT 4 數據查詢語言(DQL)用來查詢索要查詢的數據 SELECT 5 數據庫控制語言(DCL)Data Control Language 用於執行權限的授予和收回操作 GRANT授予,用於給用戶和角色授予權限 REVOKE 用於收回用戶或角色已有的權限 CREATE USER 創建用戶 -------------------------------------------------------------------------- --創建表 CREATE TABLE TABLE_NAME( id NUMBER(4) NOT NULL, name VARCHAR2(40), gender VARCHAR2(1) DEFAULT ‘m‘ ); --查看表結構 DESC table_name; --修改表名稱 RENAME old_name TOnew_name; --增加列 ALTER TABLE TABLE_NAME ADD( hiredate DATE DEFAULT sysdate ); --刪除列 ALTER TABLE TABLE_NAME DROP (ID); --修改列 ALTER TABLE TABLE_NAME MODIFY( ); --DML --插入記錄 INSERT INTO TABLE_NAME (column1,column2 ) VALUES(value1,value2 ); --更新表中的記錄 UPDATE TABLE_NAME SET column1 = value1,column2 =value2 WHERE condition; --刪除記錄 DELETE FROM TABLE_NAME WHERE condition; TRUNCATE TABLE TABLE_NAME; --刪除全表記錄,變成空表;針對數據刪除,立即生效,無法回退, --字符串操作 CHAR 浪費空間,節省時間 VARCHAR2 浪費時間,節省空間 LONG varchar2加長版,存儲變長字符串,最多可達2GB;每個表只能有一個;不能作為主鍵;不能建立索引;不能出現在查詢條件中... CLOB 存儲定長或變長字符串,最多可達4GB 一般建議用 CLOB 替代 LONG 類型; --連接字符串 CONCAT() || SELEcT CONCAT(‘Hello‘,‘World!‘) FROM dual; SELECT ‘Hello‘ || ‘World‘ from dual; --LENGTH(CHAR) SELECT NAME,LEGTH(NAME) FROM TABLE_NAME; UPPER 將字符串轉換成大寫 LOWER 將字符串轉換成小寫 INITCAP 將字符串轉換成每個單詞首字母大寫,其余小寫 select LOWER(‘HELLO WORLD‘) FROM DUAL; --截去子串 TRIM(c2 from c1) 從c1的前後截去c2 LTRIM(C1,C2) 從c1的左邊截去c2 RTRIM(c1,c2)從c1的右邊截去c2 如果沒有c2就截去空殼 LPAD(CHAR1,N CHAR2) 左補位函數 RPAD(CHAR1,N,CHAR2) 右補位函數 SUBSTR(CHAR,START,END) 截取從start到end的字符串;start為負數則從尾部開始;如果沒end則到尾部 INSTR(CHAR1,CHAR2[n[,m]]) 返回子串char2在char1中的位置;從n位開始搜索,沒指定則從1開始;m指定子串m次出現,不指定則取值1 NUMBER(P,S) ROUND(n[,m]) 用於四舍五入,m指定小數後第m位 TRUNC(n[,m]) 用於截取 MOD(m,n) 返回m除以n的余數 CEIL(n) 向上取整 FLOOR(n)向下取整 --日期類型 DATE TIMESTAMP SELECT sysdate from dual; SELECT to_char(systimestamp,‘YYYY-MM-dd HH24:mm:ss.ff DY DAY‘) from dual ; --返回指日期的當月最後一天 SELECT LAST_DAY(sysDATE) FROM dual; --指定日期加上i個月後的日期 SELECT ADD_MONTHS(sysdate,20*12) from dual; --計算兩個日期間之間有多少個月MONTHS_BETWEEN SELECT MONTHS_BETWEEN(‘2019-12-25‘,sysdate) from dual; --NEXT_DAY 返回日期數據的下一個周幾,周日為1 SELECT NEXT_DAY(sysdate , 1) from dual; --LEAST、GREATEST 返回最小或最大值,比較的必須是同一類型 SELECT LEAST(34,555,7999,2,3344) from dual; SELECT GREATEST(34,555,7999,2,3344) from dual; --EXTRACT 從參數中提取date指定的年月日等 SELECT EXTRACT(YEAR FROM SYSDATE) FROM DUAL; SELECT EXTRACT(MONTH FROM SYSDATE) FROM DUAL; SELECT EXTRACT(DAY FROM SYSDATE) FROM DUAL; --數據庫中任何數據類型都可以取null值 --null查詢用 IS NULL --NOT NULL非空約束 desc employees select * from employees; --NVL() 若第一參數為null,則取值第二參數 SELECT employee_id,first_name,salary,salary + NVL(commission_pct,10) as "sal" from employees; --NVL2() 若第一參數為null,則取值第三參數;否則第一參數非null取值第二參數 SELECT employee_id,first_name,salary,salary + NVL2(commission_pct,10,14) as "sal2" from employees; --此處省略見 Oracle Day03(SQL) --子查詢 子查詢就是一個SQL語句(通常是SQL)中嵌套一個查詢語句,嵌套的這個語句就是子查詢語句 梓槎村也可以用於DML和DDL語句 --分頁查詢 ROWNUM --分支函數 --DECODE, 最後一個為default當前面都不滿足則執行default; SELECT NAME ,SAL( DECODE(job, ‘MANAGER‘,SAL*1.2, ‘ANALYST‘,SAL*1.1, ‘SALESMAN‘,SAL*1.5, SAL) ) FROM TABLE_NAME --CASE SELECT NAME ,SAL( CASE job WHEN ‘MANAGER‘ THEN SAL*1.2 WHEN ‘ANALYST‘ THEN SAL*1.1 WHEN ‘SALESMAN‘ THEN SAL*1.5 ELSE SAL END bonus )FROM TABLE_NAME; --排序函數 ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col2 ) 排名連續且唯一,根據col1分組,在分組裏根據col2排序 RANK() OVER ( PARTITION BY col1 ORDER BY col2) 排名可以相同有重復值,會產生不連續 DENSE_RANK() OVER(PARTITION BY col1 ORDER BY col2) 相同數據返回相同排名,且排名連續 --集合操作 UNION 並集,每個元素只有一個 UNION ALL 並集,有重復元素 INTERSECT 交集,獲取兩個結果集的交集 MINUS 差集 --高級分組函數 -- ROLLUP , CUBE , GROUPING SETS 運算符是 GROUP BY 子句的擴展, GROUP BY ROLLUP(A,B,C) --按照階梯狀進行分組 n 個參數 ,則會有 n+1 次分組 GROUP BY CUBE (A,B,C) --按照n個參數,則會有 2^n 次分組 GROUP BY GROUPING SETS((A),(B)) --可以指定分組 --視圖 分為:簡單視圖 和 復雜視圖 ;select基於多個表叫做 連接視圖 目的:1簡化復雜查詢,查詢復用;2 限制數據訪問 -- 簡單視圖:基於單表建立的,不包含任何函數運算和分組、表達式或分組函數,即簡單取出基表記錄不做任何改變 -- 對簡單視圖做的 insert、update、 delete 等操作就是就基表的操作 WITH CHECK OPTION 給視圖添加約束,只能做視圖可見的 insert、update、 delete 等操作 WITH READ ONLY 保證視圖對應的基表數據不會被非法修改 -- 復雜函數:基於單表,但包含單行函數、表達式、分組函數或GROUP BY子句等 視圖也叫做虛擬表,是一組數據的邏輯表示; 視圖對應一條 SELECT 語句,結果集被賦予一個名字 ,即叫做視圖; 視圖本身不包含任何數據,它只包含映射到基表的一個查詢語句,當基表數據發生變化,視圖數據也會隨之改變; CREATE VIEW v_TableName_ViewName AS SELECT SAL FROM TABLE_NAME; DROP VIEW VIEW_NAME; 視圖的可以向表一樣查詢結構等; --和視圖相關的數據字典 -- USER_OBJECTS 查詢所有視圖名稱 SELECT object_name FROM USER_OBJECTS WHERE object_type = ‘VIEW‘; -- USER_VIEWS 查詢指定視圖 SELECT text FROM USER_VIEWS WHERE view_name = ‘v_EMP_10‘; -- USER_UPDATE_COLUMNS SELECT column_name,insertable,updatable,deletable FROM user_updatable_columns WHERE table_name = ‘V_emp_10‘; --序列 SEQUENCE 是一種用來生成唯一數字值的數據庫對象 CREATE SEQUENCE sequence_name [START WITH i] [INCREMENT BY j] [MAXVALUE m] [NOMAXVALUE] [MINVALUE n] [NOMINVALUE] [CYCLE | NOCYCLE ] [ CACHE p | NOCACHE] sequence_name 是序列名,序列的第一個值是 i ,步進 j ;如果j是正數,表示遞增,如果是負數,表示遞減; 序列可生成的最大值是m,最小值是n; 如果沒有任何可選參數,序列的第一個值是1,步進是1; CYCLE 表示在遞增至最大值或遞減至最小值之後是否繼續生成序列號,默認值是NOCYCLE; CACHE 用來指定先預定取P個數據在緩存中,以提高序列值得生成效率,默認值是20; CREATE SEQUENCE sequence_name start with 100 increment by 10 NEXTVAL 獲取序列的下個值,不能回退 CURRVAL 獲取序列的當前值,必須限制性一個nextval才能用currval SELECT sequence_name.nextval FROM DUAL; SELECT sequence_name.currval FROM DUAL; --s刪除序列 DROP SEQUENCE sequence_name --索引 索引是一種允許直接訪問數據表中某一數據行的樹形結構,為了提高查詢效率而引入,是獨立於表的對象, 可以存放在表不同的表空間(TABLESPACE)中; 索引記錄中存有 索引關鍵字 和 指向表中數據的指針; 小數據量不需要索引; 限制表上索引的數目,索引並不是越多越好 刪除很少使用、不合理的索引; 不要在經常做DML操作的表上建立索引; 索引是數據庫自行維護和使用, --創建索引 CREATE INDEX index_name ON table(column1[,column2...]) --刪除索引 DROP INDEX index_name; --修改索引 ALTER INDEX index_name REBUILD; --約束:全稱是約束條件,也稱作完整性約束條件; 約束是在數據表上強制執行的一些數據消炎規則,當執行DML操作時必須遵循這些規則,若果不符合無法執行; 約束條件可以保證表中數據的完整性,保證數據間的商業邏輯; 非空約束 NOT NULL 簡稱 NN ,確保字段不為空值 --創建時添加約束 CREATE TABLE emp ( id number(6) NOT NULL, hiredate DATE CONSTRAINT emp_hirdate_nn NOT NULL ); --修改時添加約束 ALTER TABLE emp MODIFY (id NUMBER(6) NOT NULL); 唯一性約束 Unique 簡稱 UK,確保字段不出現重復值,null可以重復,同樣可以創建和修改表是添加; ALTER TABLE emp ADD CONSTRAINT emp Unique(name); 主鍵約束 Primary Key 簡稱 PK, NOT NULL 加上 Unique ;用法同上 外鍵約束 Foreign Key 簡稱 FK 檢查約束 Check 簡稱 CK,用來強制在字段上的每個值都要滿足Check中定義的條件 ALTER TABLE emp ADD CONSTRAINT emp_salary_check CHECK(salary >2000);
Oracle總結(SQL)