1. 程式人生 > >資料庫學習總結一

資料庫學習總結一

資料庫:

DB資料庫:DateBase
DBMS資料庫管理軟體:DateBase Management System
關係型資料庫:描述兩個元素間的關聯或對應關係
產品化:Oracle(Oracle商用版權收費) DB2(IBM)  Sybase 
SQLServer(微軟,執行在WindowsNT伺服器上) 
MySQL(開源免費,多用於中小型網站)
SQL LITE(多用於嵌入式裝置)
oracle中註釋格式:--
表:1個關係資料庫由多個表組成
結構化查詢語言:SQL(Structured Query Language)
SQL是執行資料操作、檢索、及維護所使用的標準語言
SQL分為:
(常用)DDL資料庫定義語言 建立和刪除資料庫物件
資料庫物件通常包含表、檢視、索引、序列
CREATE
ALTER
DROP
TRUNCATE
(常用)DML資料操縱語言用於增刪改 操作會影響資料庫中的資料
INSERT 增
UPDATE 改
DELETE 刪
TCL事務控制語言維護資料一致性的語句
COMMIT 提交,確認已經進行的資料改變
ROLLBACK 回滾,取消已經進行的資料改變
SAVEPOINT 儲存點
(常用)DQL資料查詢語言查資料
SELECT
DCL資料控制語言 執行許可權的授予和回收操作
GRANT:授予
PEVOKE
CREATE USER:建立使用者
遠端登入資料庫伺服器

命令列工具:Oracle自帶的SQl*PLUS
telnet IP 遠端連線目標機
SELECT*FROM user_tables;
圖形介面工具:SQL Developer
資料庫資料型別
oracle中數字型別:
NUMBER(P,S)表示數字型別 P:數字總位數 S:小數點後邊的位數
整數:NUMBER(p)
固定長度的字元型別
1.CHAR(N) 表示字串 N:佔用的位元組數 不是字元數(傾向性能)
ename CHAR(20); 表示ename列中最多可儲存20個位元組的字串 弊端:容易造成空間浪費
2.VARCHAR2是oracle資料庫中獨有的型別,其他資料庫是VARCHAR
VARCHAR2(N),N表示最多可佔用的位元組數,最大長度為4000位元組(傾向空間)
DATE定義日期
長度是7個位元組 預設格式:DD-MON-RR 如:11-APR-71
hiredate DATE; 表示在hiredate列存的是DATE型別資料
RR\SYS0-4950-99SYS當前系統時間
0-49本世紀下世紀
50-99上世紀本世紀
建立表:
CREATE TABLE[schema.]table_name(column_name datatype[DEFAULT expr][,....]);
//
如:建立表employee
CREATE TABLE employee(
id NUMBER(4),
name VARCHAR2(20),
gender CHAR(1),
birth DATE,
salary NUMBER(6,2),
job VARCHAR2(30),
deptno NUMBER(2)
);
查看錶結構:DESC table_name(可以看到表中列的名字,對應的型別,長度等)
刪除一個表: DROP TABLE table_name
資料庫中字串用單引號,單引號內嚴格區分大小寫 
DEFAULT關鍵字:用於為給定的列(欄位)設定預設值 //預設值在欄位後邊設定,若寫 NOT NULL 表示必須給值
資料庫中的所有資料型別預設值為null,為空
修改表名:RENAME old_name TO new_name;
增加列(在表的最後一列):ALTER TABLE table_name ADD(column_name datatype[DEFAULT expr][,....]);
//方括號表示可寫可不寫
如:ALTER TABLE employee ADD(hiredate DATE DEFAULT sysdate); //增加入職時間列,預設值為當前系統時間
刪除列(刪除某一列): ALTER TABLE table_name DROP(列名);
修改現有列:ALTER TABLE table_name MODIFY(列名 CARCHAR2(40) DEFAULT 'cleak')
修改表字段時的注意事項:
1.儘量不修改欄位型別
2.欄位長度儘量不要減少
3.修改後的欄位 只對以後的資料產生影響
建立一個表emp_copy,將emp表的查詢內容複製到emp_copy
CREATE TABLE emp_copy
AS SELECT * FROM emp
DML:
插入資料:INSERT INTO table_name(列名1,列名2,列名3);
//若某列為NOT NULL ,執行INSERT時沒有指定該列,則會丟擲異常
//不給列名,則預設全列按序插入。
 VALUES(1,'碧瑤’,8000)
查詢表資料:
SELECT * FROM table_name;查詢所有表內容
SELECT id,name,age FROM table_name;查詢選擇的表內容
事務控制:提交資料語句:COMMIT//注意:資料只要沒提交,就一直在記憶體中,不會真正進入資料庫
事務控制:回退:ROLLBACK //回退到上一次提交後的狀態
插入日期:
預設日期格式:'DD-MON-RR'
插入日期時使用函式:TO_DATE(('2016-10-17',YYYY-MM-DD')
更改資料:
UPDATE table_name SET 列名1=value,列名2=value,... 
WHERE 列名='str';  //選擇需要修改的部分。若不寫WHERE則是全表修改
刪除資料:
1.事務控制,可以回退
DELETE FROM table_name
WHERE name='tom';//若不指定where,則是全表刪除
2.直接刪除,效率高
刪除全部資料:DELETE FROM table_name/TRUNCATE TABLE table_name;
字串
字串表示:
CHAR(10 CHAR),20個位元組
VARCHAR2(10)等價於CARCHAR2(10 BYTE),指定單位字元:VARCHAR2(10 CHAR),20個位元組
每個英文字元佔用一個位元組,每個中文字元按編碼不同,佔用2-4個位元組
ZHS16GBK:2個位元組
UTF-8:2-4個位元組
CHAR長度預設1個位元組,VARCHAR2必須指定長度,無預設
LONG 表示長字串,最多達到2GB字串資料
CLOB 儲存定長或變成字串,最多達到4GB字串資料
字串函式:
連線操作:CONCAT或|| (相當於Java中的“+”)
如:CONCAT(char1,char2)/char1 || char2
DUAL:虛表,用來測試表達式結果
如:SELECT 'hello'||'word'
FROM DUAL;
LENGTH(char) :字串長度
如SELECT LENGTH(name)
FROM table_name;
UPPER(char)、LOWER(char)、INITCAP(char)  字串大寫/字串小寫/單詞首字母大寫
TRIM(c2 FROM c1) 從c1的前後截去c2 
注意:
1. c2只能為單一字元
2. 如果只寫c1,就去出c1左右空格,TRIM經常用於去掉字串前後的空格  
LTRIM(c1,c2) 去除c1左邊的所有c2     LTRIM(c1) 去除c1左邊的空格
RTRIM(c1,c2) 去除c1右邊的所有c2     RTRIM(c1) 去除c1右邊的空格
LPAD(char1,n,char2)顯示n個字元,若char1的長度小於n,則在左邊補充n-char1.length個char2.
RPAD(char1,n,char2)顯示n個字元,若char1的長度小於n,則在右邊補充n-char2.length個char2.
SUBSTR(str,n1,n2) 擷取字串,str字串,n1:從第幾位開始,n2:擷取的字元位數,若n2不寫,則擷取到末尾
Oracle計數索引從1開始
INSTR(char1,char2) 返回char2在char1中第一次出現的位置索引
INSTR(char1,char2,n1,n2) 返回char2在char1從第n1個字元開始找第n2次出現的位置索引
若超出索引,則返回0
NUMBER(P)表示整數
(P,S) p最大數字長度 S:小數點右邊最大數字長度
ROUND(m,n)用於四捨五入 
m: 要四捨五入的資料
n:取正數則四捨五入到小數點後第n位 ROUND(45.678,,2) = 45.68
n:取0則四捨五入到整數位  ROUND(45.678,,0) = 46
n:取負數則四捨五入到小數點前n位  ROUND(45.678,,-1) = 50 ROUND(45.678,,-2) = 0 ROUND(55.678,,-2) = 100
n:預設,預設值為0
TRUNC(m,n)用於擷取小數點後n位的數字
TRUNC(45.678,2) = 45.67
TRUNC(45.678,0) = 45
TRUNC(45.678,-1) = 40
MOD(m,n)返回m除以n後的餘數
n為0則返回m
CEL(n)、FLOOR(n) 返回這個數的最大整數/最小整數
CEIL(45.678) = 46 / FLOOR(45.678) = 45
日期操作
DATE 7位元組
SYSTIMESTAMP 可以精確到ns(納秒)7-11位元組
SYSDATE 返回當前系統時間 預設格式DD-MON-RR
TO_DATE(char,fmt,nlsparams) 日期轉換
YY 2位數字的年份YYYY 4位數字表示的年份
MM 2位數字的月份DAY 周幾的全拼
HH24 24小時制HH12 12小時制
MI 顯示分鐘SS 顯示秒
TO_CHAR將其他型別資料轉換成字元型別,將日期型別資料date按照fmt格式輸出字串
TO_CHAR(sysdate,'yyyy-mm-dd hh:mi:ss');帶-格式
TO_CHAR(sysdate,'yyyy"年"mm"月"dd"日" hh:mi:ss'); 帶漢字年月日格式,要使用""包括
日期減法操作,差為相差的天數sysdate-hirddate
LAST_DAY(date) 返回日期date所在月的最後一天
如: LAST_DAY(sysdate) / LAST_DAY('09年-2月-3日')
ADD_MONTHS(date,i)計算第i月之後的當天
如果i是小數,則會被擷取整數後再做運算
如果i是負數,則獲得的是減去i個月後的日期值
如:計算員工入職20週年紀念日
SELECT name
ADD_MONTHS(hirdate,20*12) as "20週年"
FROM emp;
MONTH_BETWEEN(date1,date2) 計算date1和date2之間間隔了多少個月
實際運算date1-date2,如果date2比date1晚,會取得負值
FROM DUAL;
SELECT MONTHS_BETWEEN(sysdate,TO_DATE('2012-10-10','YYYY-MM-DD'))
FROM DUAL;
NEXT_DAY(date,char) 返回離date日期最近的下一個周幾
char中文環境:直接輸入星期幾
英文環境:1-7分別表示星期日、一、.....六。
LEAST、GREATEST 稱作比較函式,可以有多個引數,返回結果是引數列表中最大或最小的值
LEAST/GREATEST(expr1,expr2,...)
引數型別必須一致,比較之前,引數列表中第二個以後的引數會被隱含的轉換成為
第一個引數的資料型別,如果可以比較則繼續,不能則報錯
如:LEAST(sysdate,'02-4月-15')
EXTRACT(date FROM datetime) 從引數datetime中提取date指定的資料,如提取年、月、日
SELECT EXTRACT(HOUR FROM TIMESTAMP'2008-10-10 10:10:10')
FROM DUAL;
資料庫中NULL含義:
即空值
插入NULL值,多用於已設定預設值,插入資料時,若要為空,則可以插入NULL,防止報錯
判斷是否為NULL值:
Java中 if(str==null){};
資料庫中 str IS NULL/ str IS NOT NULL str為空/非空
NULL和任何數字計算,結果為NULLNULL和任何字串拼接,為當前字串
NVL(expr1,expr2) 將NULL替換為給定值
如果expr1為NULL,則返回expr2的實際值
NVL2(expr1,expr2,expr3) 若expr1為NULL返回expr3,若expr1不是NULL返回expr2.
SQL基礎查詢
SELECT <*,column,...> FROM table; *代表查全列
使用別名: SELECT 欄位名 as 別名  (若別名想取小寫,或者想取空格用""引上)
使用場景:若SELECT 中的欄位是一個表示式,可讀性差,就可以使用別名來改善
如:SELECT
TO_CHAR(hiredate,'yyyy-mm-dd') hiredate
FROM emp;
WHERE 操作限制查詢結果
如:查詢部門10下的員工資訊查詢職員表中職位是 SALESMAN 的職員
SELECT * FROM empSELECT name,sal,job FROM emp
WHERE deptno = 10;WHERE job = SALESMAN
使用 >,<,>=,<=,<>不等於,=
查詢職員表中薪水低於2000元的職員資訊
SELECT name,sal FROM emp
WHERE sal<2000;
使用AND,OR關鍵字
查詢職員表中薪水低於2000元的CLERK職員資訊
SELECT name,sal,job FROM emp
WHERE sal<2000 AND job = 'CLERK';
若AND、OR同時使用,AND優先順序大於OR  提高 優先順序可以加()
如: 薪水大於2000的CLERK職員 或者 SALESMAN職員
sal<2000 AND job = 'CLERK' OR job = 'SALESMAN'
CLERK職員或者SALESMAN中 薪水超過小於2000元的
sal<2000 AND (job = 'CLERK' OR job = 'SALESMAN')
LIKE模糊查詢(區分大小寫)
%:0到多個字元
_: 表示單個字元
如:查名字第二個字母為o的員工
SELECT name,job FROM emp
WHERE name LIKE '_o%';
IN/NOT IN  去除符合/不符合列表範圍中的資料
如:SELECT name,job FROM emp
WHERE job IN/NOT IN('MANAGER','SALESMAN',‘CLERK’);
BETWEEN...AND..
查詢薪水在2000-3000之間的員工
SELECT name,sal FROM emp
WHERE sal BETWEEN 2000 AND 3000;
ANY/ALL 比較操作
>ANY 大於最小<ANY 小於最大
>ALL 大於最大<ALL 小於最小
如:SELECT name,sal FROM emp  大於3500的工資即可
WHERE sal > ANY(3500,4000,4500);
IN/NOT IN:用於等值或不等值比較
ANY/ALL:用於範圍比較
查詢條件中使用表示式和函式:
SELECT name,sal,job FROM newname
WHERE name = UPPER('rose')/sal*12 > 100000
DISTINCT 去掉重複行
SELECT  DISTINCT job FROM newname
排序:ORDER BY   (必須寫在SELECT語句最後)
如:1.按薪水排序
SELECT * FROM newname
ORDER BY salary DESC   (此處加上DESC表示降序)
2.按薪水升序、部門降序排列 (左邊的優先順序高於右邊,即salary相等時,deptno大的排前)
SELECT name,job FROM newname
ORDER BY salary ,deptno DESC  
分組函式/多行函式/聚合函式: 多行資料參與運算返回同一行結果
MAX()  MIN()
如:查詢薪水最高和最低:
SELECT MAX(salary) max_salary,MIN(salary) min_salary FROM emp;
//後邊加別名是為了增強可讀性
AVG()SUM()平均和總和
聚合函式是忽略NULL值即空值的,所以在計算AVG時有問題的 用:SELECT AVG(NVL(salary,0)) FROM emp
COUNT  統計記錄條數,即:計數
如:統計編號為4的部門有多少員工統計有多少員工
常用:SELECT COUNT(*) FROM empSELECT COUNT(name) FROM emp
WHERE deptno=20; 
GROUNP BY 分組
如:SELECT//根據部門查詢
deptno,MAX(salary),MIN(salary),AVG(salary),SUM(salary)
//此處不能出現其他像id,name,gender等欄位,因為是按deptno分組的
FROM newname
GROUP BY deptno; //此處還可以追加 job,gender等欄位
HAVING 對分組的進一步限制 也就是二次過濾
如:檢視平均工資超過1800的部門,以及平均工資
SELECT
deptno,AVG(sarlary)
FROM newname
GROUP BY deptno
HAVING AVG(salary)>3300;
WHERE和HAVING區別:
WHERE  是用於第一次檢索資料時過濾的 寫在GROUP BY 前
HAVING 是用於在檢索後,進行第二次過濾的,可以使用組函式
  不能獨立存在,寫在GROUP BY後,ORDER BY前
順序:SELECT-FROM-WHERE-GROUP BY-HAVING-ORDER BY
查詢語句執行順序:
1.from子句:執行順序為從後往前,從右往左
資料量較小的表儘量放在後面
2.where子句:執行順序為自下而上、從右往左
將能過濾掉最大數量記錄的條件寫在where子句的最右
3.group by 執行順序為從左往右分組
最好在group by前使用where將不需要的記錄在group by之前過濾掉
4.having子句:消耗資源
儘量避免使用,having會在檢索出所有記錄之後才對結果進行過濾,需要排序等操作
5.select子句:少用*號,儘量取欄位名稱
Oracle在解析過程中,查詢資料欄位將*號一次轉換成所有列名,消耗時間
6.order by子句:執行順序為從左往右排序,消耗資源
關聯查詢
關聯概念
n張表查詢至少需要n-1個連線條件    笛卡爾積:table1*table2的所有記錄
SELECT emp.name,dept.dname  等價:SELECT emp.name,dept.dname
FROM emp,deptFROM emp JOIN dept 
WHERE emp.deptno=dept.deptnoON(emp.deptno=dept.deptno)
自然連線://使用場景:兩張表中應當只有一列名字相同才可以使用自然連線
SELECT emp.name,dept.dname
FROM emp  
NATURAL JOIN dept
外連線  應用場景:如:在檢視dept部門表示,因為在進行與emp員工資訊表連線查詢是,有些部門不存在任何員工,
 導致查詢結果該記錄被忽略。這是若需要檢視所有部門時,就要使用外連線。
SELECT emp.name,dept.dname
FROM emp,RIGHT/LEFT/FULL OUTER JOIN dept   右表為主(顯示右表所有)/左表為主(顯示左表所有)/兩邊都補齊(顯示兩邊所有)
ON(emp.deptno=dept.deptno)
自連線:在一張表內實現了主鍵和外來鍵連線
如:一張表內的員工上下級關係  z.leader:員工對應的領導編號/f.id:所有領導的id
SELECT z.name||'領導是'||f.name
FROM emp z,emp f
WHERE z.leader=f.id
子查詢:當前查詢需要建立在另一個查詢的結果基礎之上
子查詢建立在WHERE子句中 (先執行小括號裡的)
單行單列子查詢,多行單列子查詢通常用於WHERE子句中
單行單列子查詢
> < >= <= = <> 這些都只能使用單行單列子查詢
SELECT name
FROM emp
WHERE deptno = (SELECT deptno//這裡只能返回單行
FROM emp)
多行單列子查詢
如:查詢和tom一個部門的員工:  查詢誰的工資低於平均工資
SELECT name  SELECT name
FROM emp  FROM emp
WHERE deptno = (SELECT deptno  WHERE salary <(SELECT AVG(salary)
FROM emp FROM emp)
WHREE name='tom')
 AND name<>'tom'
多行多列子查詢通常用於FROM子句中
多行多列子查詢
如:查詢誰的工資大於salesman最大工資
SELECT name,salary
FROM emp
WHERE salary>ALL(SELECT salary
 FROM emp
 WHERE job='salesman')
EXISTS 查詢判斷
查詢出資料返回true,反之false
例1:列出那些有員工的部門資訊
SELECT deptno,dname FROM dept
WHERE EXISTS(SELECT * FROM emp
WHERE dept.deptno=emp.deptno);
例2:最低工資比3號部門最低工資高的部門
SELECT deptno,MIN(salary) FROM emp
GROUP BY deptno
HAVING MIN(salary)>(SELECT MIN(salary)//此處不能使用WHERE MIN(salary) 因為WHERE用於第一次查詢
  FROM emp  而 MIN(salary)不能上來就獲得。
  WHERE deptno=3)  WHERE子句中不能使用聚合函式
例3:查詢比自己部門平均工資高的那些員工
方式一:子查詢在WHERE
SELECT deptno,name,salary
FROM emp e1
WHERE e1.salary>(SELECT AVG(salary)
FROM emp e2
WHERE e1.deptno = e2.deptno)
方式二: 子查詢在FROM
SELECT name,deptno,salary
FROM emp e,(SELECT deptno,AVG(salary) avg_sal
FROM emp 
GROUP BY deptno) a
WHERE e.deptno = a.deptno
AND e.salary > a.avg_sal
//在from子句中出現了子查詢,那麼意味著要將子查詢的結果當做一張表去看待,
從中再次查詢想要的結果。那麼就應當注意:
子查詢的SELECT語句中,出現了非欄位名的欄位(通常是表示式或函式),那麼一定要給他們加上別名。
子查詢在SELECT:
SELECT name,salary,(SELECT dname 
FROM dept d 
WHERE d.deptno = e.deptno)
FROM emp e
分頁查詢(此處為Oracle分頁查詢)
ROWNUM 行號
SELECT ROWNUM,id,name,gender
FROM emp
WHERE ROWNUM>3;//此處錯誤
//ROWNUM不能再第一次查詢時作為where條件。ROWNUM有資料了才有值,where裡出現:有值才有資料
分頁查詢
1.排序總體過程:
SELECT deptno,name,salarySELECT *
FROM empFROM (
ORDER BY deptnoSELECT ROWNUM rn,e.*
2.編號FROM (
SELECT ROWNUM rn,e.* SELECT deptno,name,salary 
FROM () e FROM emp
3.取範圍 ORDER BY deptno
SELECT * ) e
FROM ()  )
WHERE rn BETWEEN 1 AND 5WHERE rn BETWEEN 1 AND 5
分頁的起始和結束 page:頁數,pagesize: 每頁的行數
(page-1)*pagesize+1 start
page*pagesizeend
DECODE類似於Java中的switch case
如,分別給指定員工計算薪水
SELECT name,job,salary,
DECODE(job,
  'manager',salary*1.2,
  'boss',salary*1.3,
  'clerk',salary*1.1,
  salary
  ),bonus
FROM emp
DECODE 中 CASE...WHEN...THEN...語句(和上邊等價)
SELECT name,job,salary,
CASE job WHEN 'manager' THEN salary*1.2
    WHEN 'boss' THEN salary*1.3
    WHEN 'clerk' THEN salary*1.1
    ELSE salary END
    newsalary
FROM emp
利用DECODE自定義排序
SELECT * FROM emp
ORDER BY DECODE(name,
'henada',1,
'kakaxi',2,
'tom',3,
'boss',4,
5)
利用DECODE自定義分組
如:把3部門分一組,其他部門分另一組,並分別求出兩組工資總和
SELECT DECODE(deptno,3,'組1','組2'),SUM(salary)
FROM emp
GROUP BY DECODE(deptno,
3,'組1',
'組2')
ROW_NUMBER 分組後將各組按某一個屬性排序
1.SELECT name,salary,deptno,ROW_NUMBER() OVER(PARTITION BY deptno ORDER BY salary DESC) as rank
FROM emp
2.RANK():生成組內不連續且不唯一的編號
3.DENSE_RANK()生成組內連續但不唯一的編號
SELECT name,salary,deptno,RANK() OVER(PARTITION BY deptno ORDER BY salary DESC) as rank
FROM emp
集合操作
並集:UNION/UNION ALL   既滿足x,又滿足y(UNION ALL中間交集出現兩次,大於UNION中間交集出現一次)
SELECT name,job,salary FROM emp1
WHERE job='namager'
UNION
SELECT name,job,sal FROM emp2
WHERE salary>=2500;
交集:INTERSECT
SELECT name,job,salary FROM emp1
WHERE job='namager'
INTERSECT
SELECT name,job,sal FROM emp2
WHERE salary>=2500;
差集:MINUS  (我有你沒有的)
SELECT name,job,salary FROM emp1
WHERE job='namager'
MINUS
SELECT name,job,sal FROM emp2
WHERE salary>=2500;
ROLLUP 遞減分組查詢
如:按年、月、日排序後,查詢每天、每月、每年銷售額,以及總銷售額
SELECT year_id,month_id,day_id,SUM(sales_value)
FROM sales_table
GROUP BY ROLLUP(year_id,month_id,day_id)
ORDER BY year_id,month_id,day_id
CUBE 組合分組 比較全面
SELECT year_id,month_id,day_id,SUM(sales_value)
FROM sales_table
GROUP BY CUBE(year_id,month_id,day_id) //此處3個屬性,規律:2的3次方
ORDER BY year_id,month_id,day_id  //則組合出8個分組:ymd,ym,yd,md,y,m,d,整體
GROUPING SETS根據自己需求自己定義分組 比較靈活
SELECT year_id,month_id,day_id,SUM(sales_value)
FROM sales_table
GROUP BY GROUPING SETS((year_id,month_id,day_id),(year_id,month_id))//查年-月-日、和年-月的分組
ORDER BY year_id,month_id,day_id
檢視
什麼是檢視:本質:只包含對映到基表的一個查詢語句
檢視目的:簡化複雜查詢,隱藏一些資料
建立檢視:CREATE VIEW view_name AS subquery(子查詢語句);
試圖建立後,可以像操作表一樣操作檢視,主要是查詢sbuquery是select查詢語句
對應的表稱作基表
簡單檢視:沒有以下這些
複雜檢視:包含單行函式、表示式、分組函式或group by子句
連線試圖:select語句是基於多個表
授權建立檢視:
管理員通過DCL語句:GRANT CREAT VIEW TO lurenjia;
建立簡單檢視:
如:建立一個檢視顯示部門3中的員工
CREATE VIEW v_emp_3
AS SELECT deptno,name,salary
FROM emp
WHERE deptno=3;
WITH CHECK OPTION
查詢檢視結構:DESC view_name;
檢視檢視:SELECT * FROM view_name
修改檢視內容後名字替換:如果有這個名字,就替換,不存在就替換
CREATE OR REPLACE VIEW v_emp_3
AS SELECT deptno,name,gender
FROM emp
WHERE deptno=3;
儘量避免使用DML操作檢視,幾乎不成功,因為檢視可能只是表的一部分對映資料
刪除檢視時只能刪除現有視圖裡能查到的記錄
DML操作一般只能應用於簡單檢視,影響到基表資料
複雜檢視不允許DML操作
DML操作不能違反基表的約束條件
建立具有CHECK OPTION約束的檢視
最後加上 WITH CHECK OPTION 
目的:插入和修改資料時資料必須得能顯示到檢視才行
建立具有READ ONLY約束的檢視
最後加上  WITH READ ONLY
目的:限制對檢視進行DML操作
查詢USER_VIEWS獲取相關資訊
USER_OBJECTS:查詢所有建立的資料庫物件
USER_VIEWS:查詢所有建立的檢視物件
USER_UPDATE_COLUMNS:查詢哪些列可以插入、修改或刪除
在資料字典USER_OBJECTS中查詢所有檢視名稱
SELECT object_name FR  OM user_objects
WHERE object_type = 'VIEW';//查詢所有表名稱:'TABLE'
建立複雜檢視
CREATE VIEW v_emp_salary
AS
SELECT d.deptno,avg(e.salary) avg_salary,sum(e.salary) sum_salary,
  max(e.salary) max_salary, min(e.salary) min_salary
FROM emp e JOIN dept d
ON e.deptno = d.deptno
GROUP BY d.deptno;
刪除檢視:
刪除檢視不會影響表的資料
如:DROP VIEW view_name;
序列:
序列(SEQUENCE):用來生成唯一數字值的資料庫物件
目的:用來生成主鍵值
1.UUID
2.SELECT sys_guid() FROM DUAL:生成一個32位的字串序列值
若使用此,則此列資料型別用 char 
(Java中UUID36位使用:String uuid = UUID.randomUUID().toString();
若也要統一到32位,則去掉4個-, uuid.replaceALL("-","");)
建立序列:
CREATE SEQUENCE sequence_name
START WITH i INCREMENT BY j//i:起始數字 j:步進
MAXVALUE m | NOMAXVALUE//設定最大值
MINVALUE n | NOMINVALUE//設定最小值
CYCLE | NOCYCLE   //是否迴圈 預設:NOCYCLE
CACHE p | NOCACHE /是否快取 預設快取20個數據
序列中有兩個偽列
NEXTVAL:獲取序列的下個值
CURRVAL:獲取序列的當前值
CREATE SEQUENCE emp_seq
START WITH 100 
INCREMENT BY 10;
SELECT emp_seq.NEXTVAL FROM DUAL
SELECT emp_seq.CURRVAL FROM DUAL
將序列值作為主鍵插入表
INSERT INTO emp (id,name,salary,deptno)
VALUES(emp_seq.NEXTVAL,'ice',4700,7)
刪除序列:DROP SEQUENCE emp_seq
索引:
索引是為了提高查詢效率的一種機制
索引記錄中存有索引關鍵字和指向表中資料的指標(地址)
建立索引:
//注意:一般索引加到表中經常查詢用到的列(column)
CREATE INDEX index_name   //index_name:索引名稱
ON table(column);//table:表名 column:列名
如:CREATE INDEX idx_emp_name ON emp(name);
建立複合索引(多列索引):
如:CREATE INDEX idx_emp_job_salary ON emp(job,salary);
建立基於函式的索引:
CREATE INDEX idx_emp_upper_name ON emp((UPPER(name));
修改索引(重建索引): 相當於重新整理,一般用於資料頻繁操作,需要定期重建索引
ALTER INDEX idx_emp_name REBUILD;
刪除索引:
DROP INDEX index_name;
索引注意:
1.為經常出現在WHERE子句中的列建立索引
2.建索引列的順序和ORDER BY中順序一致
3.為經常作為表連線條件的列上建立索引
4.不要經常在DML操作的表上建立索引
5.不要在小表上建立索引
6.刪除很少被使用的、不合理的索引
約束:
約束(COMSTRAINT)的全稱是約束條件,資料表上強制執行的資料校驗規則
約束條件:
1.非空約束 NOT NULL 簡稱 NN
(1)只能應用於列級約束,宣告列同時給約束
CREATE TABLE employees(
eid NUMBER(6),
name VARCHAR2(30) NOT NULL,
salary NUMBER(7,2),
hiredate DATE
 CONSTRAINT employees_hiredate_nn NOT NULL
 );
(2)修改表時,定義新增非空約束
如:ALTER TABLE employees
MODIFY(eid NUMBER(6) NOT NULL);
(3)修改表時,取消非空約束
如:ALTER TABLE employees
MODIFY(eid NUMBER(6) NULL);
2.唯一性約束 UNIQUE 簡稱 UK
(1)用於保證欄位或者欄位的組合不出現重複值,但允許是NULL值
可以在建表時建立,也可以建表後建立
CREATE TABLE employees(
eid NUMBER(6),
name VARCHAR2(30) UNIQUE, //列級約束
email VARCHAR2(50),
salary NUMBER(7,2),
hiredate DATE,
CONSTRAINT employees_email_uk UNIQUE(email)--表級約束
);
(2)建表之後增加唯一性約束條件
ALTER TABLE employees
ADD CONSTRAINT employees_name_uk UNIQUE(name);
3.主鍵約束 PRIMARY KEY 簡稱 PK
一個表上只能建立一個主鍵 非空且唯一
逐漸選取原則:
1.主鍵一般是對系統無意義的資料
2.永遠不要更新主鍵
3.主鍵不應包含動態變化的資料,如時間戳
4.主鍵應自動生成,儘量建立在單列上
如:CREATE TABLE employees2(
eid NUMBER(6) PRIMARY KEY,
name VARCHAR2(30),
email VARXHAR2(50),
salary NUMBER(7,2),
hiredate DATE
);
(2)建表之後增加主鍵約束條件
ALTER TABLE employees3
ADD CONSTRAINT employees3_eid_pk PRIMARY KEY(eid);
4.外來鍵約束 FOREIGN KEY 簡稱 FK
一般是表級約束,儲存另一張表主鍵值
如:先建表,在建表後建立外來鍵約束條件
dept表:主表或父表
emp表:從表或子表
CREATE TABLE employees4(
eid NUMBER(6) ,
name VARCHAR2(30),
deptno NUMBER(6,2),
salary NUMBER(7,2)
);
ALTER TABLE employees4
ADD CONSTRAINT employees4_deptno_fk 
FOREIGN KEY (deptno) REFERENCES dept(deptno);
簡化開發,維護資料時不用考慮外來鍵約束
5.檢查約束 CHECK 簡稱CK
1.一般是表級約束
2.新增檢查約束,新增後,插入資料時不能違反約束 
如:員工薪水必須大於2000元,小於10000
ALTER TABLE employees4
ADD CONSTRAINT employees4_salary_check
CHECK(salary>2000 AND salary<10000);
3.刪除約束:
ALTER TABLE employees4
DROP CONSTRAINT employees4_salary_check
檢視emp表的約束的名字、約束的型別和約束條件
SELECT constraint_name,constraint_type,serch_condition
FROM user_constraints
WHERE table_name = 'emp';

SELECT * FROM ALL_TABLES;系統裡有許可權的表
SELECT * FROM DBA_TABLES; 系統表
SELECT * FROM USER_TABLES; 當前使用者下的表
<結束>


CREATE TABLE account(
 id NUMBER(9) NOT NULL,
 remmber_id NUMBER(9),
 login_name VARCHAR(30) NOT NULL,
 login_passwd VARCHAR2(8) NOT NULL,
 status CHAR(1) NOT NULL,
 create_date DATE DEFAULT SYSDATE,
 pause_date DATE,
 close_date DATE,
 real_name VARCHAR2(20) NOT NULL,
 idcard_no CHAR(18) NOT NULL,
 birthdate DATE,
 gender CHAR(1) NOT NULL,
 occupation VARCHAR2(50),
 telephone VARCHAR2(15) NOT NULL,
 email VARCHAR2(50),
 mailaddress VARCHAR2(50),
 zipcode CHAR(6),
 qq VARCHAR2(15),
 last_login_time DATE,
 last_login_ip VARCHAR2(15)
)
RENAME account TO t_account;
ALTER TABLE t_account ADD(bak VARCHA2(50));
ALTER TABLE t_account MODIFY(bak VARCHAR2(40));
ALTER TABLE t_account DROP(bak);
SELECT * FROM t_account;
INSERT INTO t_account(id,login_name,login_passwd,create_date,
 real_name,idcard_no,telephone)
 VALUES(1,'shiyl',256528,TO_DATE('2008-01-28','YY-MM-DD'),
'shiyuanli','410323199925254410','15456548565');
UPDATE t_account
SET login_passwd='801206'
WHERE id=1;
DELETE FROM t_account
WHERE id=1;
MySQL安裝配置:
安裝完後配置在bin目錄下找到MySQLinstanceconfig.exe檔案開始配置
選擇標準配置
dos命令進入本地資料庫:mysql -uroot -p -P3306 -h127.0.0.1