第一篇:黑馬程序員c語言教程:視圖 序列 索引概念
視圖 序列 索引 視圖的概念
--創建視圖 是一個邏輯概念,本身沒有數據,還是來源于表
--視圖的優點 簡化查詢 創建視圖
create view empincomeview as select e.empno, e.ename, e.sal, e.sal*12 annalsal, sal*12+nvl(comm, 0)income, d.dname from emp e, dept d where e.deptno = d.deptno;
--查詢員工編號 名稱 工資 年薪 年收入 部門名稱信息
* 第 1 行出現錯誤: ORA-01031: 權限不足--需要有create view權限
用戶管理中 權限管理 需要管理員登錄進行授權
C:>sqlplus /as sysdba
SQL> grant create view to scott;創建視圖的權限給scott用戶 操作視圖
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
-----------------------------------------------
DEPT TABLE
TEST2 TABLE
STUDENT TABLE
EMPINCOME TABLE
EMPINCOMEVIEW VIEW select * from empincomeview;
--視圖的優點
簡化復雜查詢(封裝 復雜sql語言)限制數據訪問 銀行系統視圖呈現,而且只讀視圖, 通過存儲過程和存儲函數來做
通過視圖修改表中的數據,不建議,有很多限制
提供數據的相互獨立
同樣的數據,可以有不同的顯示方式
但視圖不能提高性能視圖的幾個注意點
--視圖 with check option
create view view1
as
select * from emp where deptno=10
with check option;
insert into view1 values(***,***,...., 10);
insert into view1 values(***,***,...., 20);
--通過視圖只能看到10號部門的員工信息,不能插入20號部門員工
--視圖with read only;
create or replace view empincomeview2
as
select e.empno, e.ename, e.sal, e.sal*12 annalsal, sal*12+nvl(comm, 0)income, d.dname
from emp e, dept d
where e.deptno = d.deptno
with read only;
--修改視圖 視圖只能替換,不能修改
--區分復雜視圖和簡單視圖 沒有太多實際意義,關鍵是求解問題--視圖操作的限制
結論:一般不通過視圖做insert/update/delete操作
視圖的目的:就是簡化查詢的....====================--創建序列
create sequence myseq;序列基本概念 放在內存中速度快
auto_increment
[ 1 , 2, 3, 4......20 ]
▲
tableA 序列的應用
--創建表
create table tableA
(tid number,tname varchar2(40));
--從序列中取nextval,產生tableA的主鍵值
insert into tableA values(myseq1.nextval, 'aa');
序列的兩個屬性 NEXTVAL CURRVAL nextval應在currval之前被指定
select myseq.currval from dual;
SQL> select myseq.currval from dual;
select myseq.currval from dual
*
第 1 行出現錯誤:
ORA-08002: 序列 MYSEQ.CURRVAL 尚未在此會話中定義
select myseq.nextval from dual
select myseq.currval from dual 刪除序列
--drop sequence myseq;序列需要注意的問題
多個表共用一個序列,造成序列不連續
回滾會造成,造成序列不連續
系統異常,內存序列丟失,造成序列不連續
================== 有關索引小專題 0 索引原始知識
索引和表 是 單獨存放
索引對dba和開發人員,使用起來是透明的,只要創建索引 索引基本原理 圖示 10號 20號部門
表記錄
索引表
算法
--------▲
▲
b+樹--------★
▲
--------▲
▲
--------`(*∩_∩*)′
▲
--------▲
★
--------★
★
--------▲
`(*∩_∩*)′
--------`(*∩_∩*)′
`(*∩_∩*)′建立索引
create index myindex on emp(deptno);create index myindex2 on emp(deptno, job);索引說明
主鍵本身就是索引
唯一約束也是自動索引
=========
同義詞
create synonym em for emp;
管理給scott用戶查詢權限
ALTER USER “HR” ACCOUNT UNLOCK GRANT SELECT ON “HR”.“EMPLOYEES” TO “SCOTT”
select * from hr.employees;SQL> select count(*)from hr.employees;
為hr.employees創建一個別名
create synonym hremp for hr.employees;* 第 1 行出現錯誤: ORA-01031: 權限不足
---dba管理員分配權限
grant create synonym to scott;GRANT CREATE ANY SYNONYM TO “SCOTT” select count(*)from hremp;
圖像界面熟悉 PK 命令行工具
第二篇:黑馬程序員c語言教程:Oracle概念(推薦)
七、在執行SQL語句時綁定變量
1.接收和定義變量的SQL*PLUS命令 ACCEPT DEFINE UNDEFINE & 2.綁定變量SQL語句的例子(1)SQL> select id, last_name, salary from s_emp where dept_id = &department_number;Enter value for department_number: 10 old 1: select id, last_name, salary from s_emp where dept_id=&department_number;new 1: select id, last_name, salary from s_emp where dept_id= 10 SQL> SET VERIFY OFF | ON;可以關閉和打開提示確認信息old 1和new 1的顯示.3.綁定變量SQL語句的例子(2)SQL> select id, last_name, salary from s_emp where title = '&job_title';Enter value for job_title: Stock Clerk 11
J2EE @ zxw SQL> select id, last_name, salary from s_emp where hiredate >to_date('&start_hire_date','YYYY-MM-DD');Enter value for start_hire_date : 2001-01-01 把綁定字符串和日期類型變量時,變量外面要加單引號 也可綁定變量來查詢不同的字段名 輸入變量值的時候不要加;等其它符號 4.ACCEPT的語法和例子
SQL> ACCEPT variable [datatype] [FORMAT] [PROMPT text] [HIDE] 說明: variable 指變量名 datatype 指變量類型,如number,char等 format 指變量顯示格
式 prompt text 可自定義彈出提示符的內容text hide 隱藏用戶的輸入符號 使用ACCEPT的例子:
ACCEPT p_dname PROMPT 'Provide the department name: ' ACCEPT p_salary NUMBER PROMPT 'Salary amount: ' ACCEPT pswd CHAR PROMPT 'Password: ' HIDE ACCEPT low_date date format 'YYYY-MM-DD' PROMPT“Enter the low date range('YYYY-MM-DD'):” 4.DEFINE的語法和例子
SQL> DEFINE variable = value 說明: variable 指變量名 value 指變量值
定義好了變良值后, 執行綁定變量的SQL語句時不再提示輸入變量
使用DEFINE的例子:
SQL> DEFINE dname = sales SQL> DEFINE dname DEFINE dname = “sales”(CHAR)SQL> select name from dept where lower(name)='&dname';NAME-------------------------sales sales SQL> UNDEFINE dname SQL> DEFINE dname Symbol dname is UNDEFINED 5.SQL*PLUS里傳遞參數到保存好的*.sql文件里 SQL> @ /路徑名/文件名 參數名1[,參數名2, ?.] SQL> start /路徑名/文件名 參數名1[,參數名2, ?.] 注意事項: 一次最多只能獲取9個&變量, 變量名稱只能是從&1,&2到&9 變量名后不要加特殊的結束符號
如果在SQL*PLUS里要把&符號保存在ORACLE數據庫里,要修改sql*plus環境變量define SQL> set define off;
八、概述數據模型和數據庫設計 1.系統開發的階段: Strategy and Analysis Design Build and Document Transition Production 12
J2EE @ zxw 2.數據模型
Model of system in client's mind Entity model of client's model Table model of entity model Tables on disk 3.實體關系模型(ERM)概念
ERM(entity relationship modeling)實體 存有特定信息的目標和事件 例如: 客戶,訂單等 屬性 描述實體的屬性 例如: 姓名,電話號碼等 關系 兩個實體間的關系 例如:訂單和產品等 實體關系模型圖表里的約定
Dashed line(虛線)可選參數 “may be”
Solid line(實線)必選參數 “must be”
Crow's foot(多線)程度參數 “one or more”
Single line(單線)程度參數 “one and only one” 4.實體關系模型例子
每個訂單都必須有一個或幾個客戶
每個客戶可能是一個或幾個訂單的申請者 5.實體關系的類型
1:1 一對一 例如: 的士和司機 M:1 多對一 例如: 乘客和飛機 1:M 一對多 例如: 員工和技能 6.校正實體關系的原則
屬性是單一值的, 不會有重復
屬性必須依存于實體, 要有唯一標記
沒有非唯一屬性依賴于另一個非唯一的屬性 7.定義結構時的注意事項 減少數據冗余
減少完整性約束產生的問題 確認省略的實體,關系和屬性 8.完整性約束的要求
Primary key 主關鍵字 唯一非NULL Foreign key 外鍵 依賴于另一個Primary key,可能為NULL Column 字段名 符合定義的類型和長度
Constraint 約束條件 用戶自定義的約束條件,要符合工作流要求 例如: 一個銷售人員的提成不能超過它的基本工資
Candidate key 候選主關鍵字 多個字段名可組成候選主關鍵字, 其組合是唯一和非NULL的
9.把實體關系圖映射到關系數據庫對象的方法 把簡單實體映射到數據庫里的表
把屬性映射到數據庫里的表的字段, 標明類型和注釋 把唯一標記映射到數據庫里的唯一關鍵字 把實體間的關系映射到數據庫里的外鍵 13
J2EE @ zxw 其它的考慮: 設計索引,使查詢更快
建立視圖,使信息有不同的呈現面, 減少復雜的SQL語句 計劃存儲空間的分配 重新定義完整性約束條件
10.實體關系圖里符號的含義 PK 唯一關鍵字的字段 FK 外鍵的字段
FK1,FK2 同一個表的兩個不同的外鍵
FK1,FK1 兩個字段共同組成一個外鍵 NN 非null字段 U 唯一字段
U1,U1 兩個字段共同組成一個唯一字段
九、創建表
1.ORACLE常用的字段類型 ORACLE常用的字段類型有
VARCHAR2(size)可變長度的字符串, 必須規定長度 CHAR(size)固定長度的字符串, 不規定長度默認值為1
NUMBER(p,s)數字型p是位數總長度, s是小數的長度, 可存負數 最長38位.不夠位時會四舍五入.DATE 日期和時間類型
LOB 超長字符, 最大可達4G CLOB 超長文本字符串 BLOB 超長二進制字符串
BFILE 超長二進制字符串, 保存在數據庫外的文件里是只讀的.數字字段類型位數及其四舍五入的結果 原始數值1234567.89 數字字段類型位數 存儲的值 Number 1234567.89 Number 12345678 Number 錯
Number(9,1)1234567.9 Number(9,3)錯 Number(7,2)錯
Number(5,-2)1234600 Number(5,-4)1230000 Number(*,1)1234567.9 2.創建表時給字段加默認值 和約束條件 創建表時可以給字段加上默認值
例如 : 日期字段 DEFAULT SYSDATE 這樣每次插入和修改時, 不用程序操作這個字段都能得到動作的時間 14
J2EE @ zxw 創建表時可以給字段加上約束條件 例如: 非空 NOT NULL 不允許重復 UNIQUE 關鍵字 PRIMARY KEY 按條件檢查 CHECK(條件)外鍵 REFERENCES 表名(字段名)3.創建表的例子
CREATE TABLE DEPT(EPTNO NUMBER(2)CONSTRAINT PK_DEPT PRIMARY KEY, DNAME VARCHAR2(14), LOC VARCHAR2(13));CREATE TABLE region(ID number(2)NOT NULL PRIMARY KEY, postcode number default '0' NOT NULL, areaname varchar2(30)default ' ' NOT NULL);4.創建表時的命名規則和注意事項
表名和字段名的命名規則:必須以字母開頭,可以含符號A-Z,a-z,0-9,_,$,# 大小寫不區分
不用SQL里的保留字, 一定要用時可用雙引號把字符串括起來. 用和實體或屬性相關的英文符號長度有一定的限制 注意事項: 建表時可以用中文的字段名, 但最好還是用英文的字段名
創建表時要把較小的不為空的字段放在前面, 可能為空的字段放在后面 建表時如果有唯一關鍵字或者唯一的約束條件,建表時自動建了索引 一個表的最多字段個數也是有限制的,254個.5.約束名的命名規則和語法
約束名的命名規則約束名如果在建表的時候沒有指明,系統命名規則是SYS_Cn(n是數字)約束名字符串的命名規則同于表和字段名的命名規則 6.使用約束時的注意事項
約束里不能用系統函數,如SYSDATE和別的表的字段比較 可以用本表內字段的比較
想在事務處理后, 做約束的檢查
SQL> alter session set constraints deferred.7.由實體關系圖到創建表的例子 s_dept 前提條件:已有region表且含唯一關鍵字的字段id SQL> CREATE TABLE s_dept(id NUMBER(7)CONSTRAINT s_dept_id_pk PRIMARY KEY, name VARCHAR2(25)CONSTRAINT s_dept_name_nn NOT NULL, region_id NUMBER(7)CONSTRAINT s_dept_region_id_fk REFERENCES region(id), CONSTRAINT s_dept_name_region_id_uk UNIQUE(name, region_id));8.較復雜的創建表例子 15
J2EE @ zxw SQL> CREATE TABLE s_emp(id NUMBER(7)CONSTRAINT s_emp_id_pk PRIMARY KEY, last_name VARCHAR2(25)CONSTRAINT s_emp_last_name_nn NOT NULL,first_name VARCHAR2(25), userid VARCHAR2 CONSTRAINT s_emp_userid_nn NOT NULL CONSTRAINT s_emp_userid_uk UNIQUE, start_date DATE DEFAULT SYSDATE, comments VARCHAR2(25), manager_id NUMBER(7), title VARCHAR2(25), dept_id NUMBER(7)CONSTRAINT s_emp_dept_id_fk REFERENCES s_dept(id), salary NUMBER(11,2), commission_pct NUMBER(4,2)CONSTRAINT s_emp_commission_pct_ck CHECK(commission_pct IN(10,12.5,15,17.5,20)));
第三篇:黑馬程序員c語言教程:Oracle概念
一、選擇行
1.簡單的SELECT 語句
SELECT 字段名1 [AS] '字段名1 解釋' FROM table;2.處理NULL NVL函數可把NULL轉換成其它類型的符號
編程技巧: NVL函數在多條件模糊查詢的時候比較有用 NVL函數可返回多種數據類型: 返回日期 NVL(start_date,'2002-02-01')返回字符串 NVL(title,'no title')返回數字 NVL(salary,1000)3.使用SQL*PLUS(1)
SQL> desc table;顯示表結構
SQL> select * from tab;查看用戶下所有的表
SQL> set pause on;可以使大量結果集在用戶按“Enter”(回車)后翻頁
SQL> set pagesize 100;設定SQL語句返回結果集一頁的行數100, 默認值是14 SQL> set linesize 100;設定SQL語句返回結果集一行的寬度100, 默認值是80 4.SQL*PLUS里規定字段的顯示格式 規定數字的顯示格式
SQL>column 字段名 format 99999999999;SQL>column 字段名 format 999,999,999,999;SQL>column 字段名 format a數字 [word_wrapped];規定long字符的顯示寬度 SQL>set long 200;規定字段名的顯示內容
SQL> column 字段名 heading '字段名顯示內容';SQL> set heading off;查詢時不顯示字段名稱 規定字段的對齊方向
SQL> column 字段名 justify [left | right | center];清除字段的格式
SQL> column 字段名 clear;5.SQL*PLUS里規定字段的顯示格式例子
SQL> column last_name heading 'Employee|Name' format a15;SQL> column salary justify right format $99,999.99;SQL> column start_date format a10 null 'Not Hired';說明:如果start_date為null, 顯示字符串'Not Hired' 6.判斷題(T/F)(1).SQL command are always held in sql buffer.[T](2).SQL*PLUS command assit with query data.[T] 5
J2EE @ zxw SQL*PLUS命令只控制SELECT結果集的顯示格式及控制文件.只有SQL命令能訪問數據庫.二、限制選擇行
1.按指定的規則排序
SELECT expr FROM table [ORDER BY {column, expr} [ASC | DESC] ];默認的排序是ASC升序(由小到大)還可以ORDER BY 字段名的位置[1]| [2] ASC| DESC;2.用WHERE限制選擇行(1)比較操作符 = ><>= <=!= <> ^= 與NULL比較不能用上面的比較操作符 ANY SOME ALL SQL操作符 BETWEEN ? AND? IN LIKE IS NULL NOT BETWEEN ? AND? NOT IN NOT LIKE IS NOT NULL 邏輯操作符 AND OR NOT 3.用WHERE限制選擇行(2)比較順序(可以用括號改變它們的順序)(1).= <>>= <= in like is null between(2).and(3).Or 4.LIKE操作
% 零到任意多個字符 _ 一個字符
例如: 字段名 like 'M%' 字段名 like '%m%' 字段名 like 'job_' 如果要找含下劃線的字符, 要加反斜線 例如:字段名 like '%X/_Y%' escape '/' 5.日期字段的比較 舉例: 日期字段 between to_date('2001-12-12','YYYY-MM-DD')and to_date('2002-02-01','YYYY-MM-DD')日期字段> to_date('2001-12-12','YYYY-MM-DD')and日期字段<= to_date('2002-02-01','YYYY-MM-DD');6.不能用到索引的比較操作符 IS NULL IS NOT NULL LIKE '%m%'
三、單行函數 1.數字函數
ABS 取絕對值 POWER 乘方 LN 10為底數取0 SQRT平方根 EXP e的n次乘方 LOG(m,n)m為底數n取0 數學運算函數:ACOS ATAN ATAN2 COS COSH SIGN SIN SINH TAN TANH CEIL 大于或等于取整數 FLOOR 小于或等于取整數 MOD 取余數
ROUND(n,m)按m的位數取四舍五入值如果round(日期): 中午12以后將是明天的日期.round(sysdate,'Y')是年的第一天
TRUNC(n,m)按m的位數取小數點后的數值如果trunc(日期), 確省的是去掉時間
J2EE @ zxw 2.字符函數
CHR 按數據庫的字符集由數字返回字符
CONCAT(c1,c2)把兩個字符c1,c2組合成一個字符, 和 || 相同 REPLACE(c,s,r)把字符c里出現s的字符替換成r, 返回新字符
SUBSTR(c,m,n)m大于0,字符c從前面m處開始取n位字符,m等于0和1一樣, m小與0,字符c從后面m處開始取n位字符
TRANSLATE(c,f1,t1)字符c按f1到t1的規則轉換成新的字符串 INITCAP 字符首字母大寫,其它字符小寫 LOWER 字符全部小寫 UPPER 字符全部大寫
LTRIM(c1,c2)去掉字符c1左邊出現的字符c2 RTRIM(c1,c2)TRIM(c1,c2)去掉字符c1左右兩邊的字符c2 LPAD(c1,n,c2)字符c1按制定的位數n顯示不足的位數用c2字符串替換左邊的空位 RPAD(c1,n,c2)3.日期函數
ADD_MONTHS(d,n)日期值加n月
LAST_DAY 返回當月的最后一天的日期
MONTHS_BETWEEN(d1,d2)兩個日期值間的月份,d1 DUAL是SYS用戶下一個空表,它只有一個字段dummy 4.轉換函數(1)TO_CHAR(date,'日期顯示格式')TO_CHAR(number)用于顯示或報表的格式對齊 TO_DATE(char,'日期顯示格式')TO_LOB 把long字段轉換成lob字段 TO_NUMBER(char)用于計算或者比較大小 4.轉換函數(2)to_date里日期顯示格式 YYYY 年 YEAR YYY YY Y Q 季度 MM 月 MONTH MON W 星期(week of month)WW, IW(week of year)(說明:周計是按ISO標準,從1月1日的星期數到后面七天為一周,不一定是從周一到周日)DD 日 DAY DY HH24 小時 HH12 HH MI 分鐘 SS 秒 如果想固定日期的顯示格式可以在數據庫的參數文件initorasid.ora里新寫一行參數 NLS_DATE_FORMAT=yyyy-mm-dd hh24:mi:ss可以在UNIX環境變量或者NT的注冊表里的設置 NLS_DATE_FORMAT=yyyy-mm-dd 7 J2EE @ zxw hh24:mi:ss 4.轉換函數(3)如果想固定日期的顯示格式可以用alter session命令改變 SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';它的作用順序如下: initialization parameter Environment variable ALTER SESSION command 4.轉換函數(4)to_char(number)里數字顯示格式 9 數字位 0 數字前面補0 to_char(-1200,'00000.00').小數點的位置 , 標記位置的逗號 用在數字顯示格式的左邊 L 根據數據庫字符集加貨幣符號 to_char(-1200,'L9999.99')B 把數字0顯示為空格,用在數字顯示格式的右邊 MI 右邊的負數標記 to_char(-1200,'9999.99MI')PR 括起來的負數 to_char(-1200,'9999.99PR')EEEE 用指數方式表示 to_char(-1200,'9999.99EEEE')5.輸入字符,返回數字的函數 instr(c1,c2)字符c2出現在c1的位置, 不出現, 返回0, 常用于模糊查詢 length 按數據庫的字符集,算出字符c的長度,跟數據庫的字符集有關, 一個漢字長度為1 6.有邏輯比較的函數NVL(EXPR1, EXPR2)函數 解釋: IF EXPR1=NULL RETURN EXPR2 ELSE RETURN EXPR1 DECODE(AA0V10R10V20R2....)函數 解釋: IF AA=V1 THEN RETURN R1 IF AA=V2 THEN RETURN R2..? ELSE RETURN NULL 舉例: decode(id,1,'dept sale',2,'dept tech') MySQL數據庫中的索引 在數據庫操作中,經常需要查找特定的數據,例如:當執行“select * from student where id = 10000”語句時,MySQL數據庫必須從第一條記錄開始遍歷,直到找到id為10000的數據。這樣的效率非常低。為此,MySQL允許建立索引來加快數據表的查詢和排序。 索引的概念 數據庫的索引好比字典的目錄,是對數據庫表中一列或者多了的值進行排序后的一種結構,其作用就是提高表中的數據查詢速度。MySQL中的索引分為很多種,具體如下。 1.普通索引 普通索引是由key或index定義個索引,它是MySQL中的基本索引類型,可以創建在任何數據類型中。其值是否唯一和非空有字段本身的約束條件所決定。例如,在student表的id字段上建立一個普通索引,查詢記錄時,就可以根據該索引查詢,從而提高效率。 2.唯一性索引 唯一性索引是指由unique定義個索引,該索引所在字段的值必須是唯一的。例如,在grade表的stu_id字段上建立唯一性索引,那么stu_id字段的值就必須是唯一的。 3.全文索引 全文索引是由fulltext定義的索引,它只能創建在char、varchar或text類型的字段上。并且現在只有MyISAM存儲引擎支持全文索引。 4.單列索引 單列索引指的是在表中單個字段上創建索引,它可以是普通索引、唯一索引或者全文索引,只有保證該索引只對應表中一個字段即可。 5.多列索引 多列索引是指在表的多個字段上創建索引,只有在查詢條件中使用了這些字段中的第一個字段時,該索引才會被使用。如,在student表的id、name和score字段上創建一個多列索引,那么只有查詢條件中使用了id字段時,該索引才會被使用。 相較于單列索引,當我們頻繁的需要同時檢索表中多列時,多列索引的效率會高很多。6.空間索引 空間索引是由spatial定義的索引,它只能創建在空間數據類型的字段上。MySQL中的空間數據類型有4種:geometry、point、linestring和polygon。需要注意的是,創建空間索引的字段,必須將其聲明為NOT NULL,并且空間索引只能在存儲引擎為MyISAM的表中創建。 需要注意的是,雖然索引可以提高數據的查詢效率,但索引會占用一定的存儲空間。并且創建和維護索引所消耗的時間,是隨著數據量的增加而增加的。因此,使用索引時,應綜合考慮其優缺點,不能肆意創建。 創建索引 要想使用索引提高數據表的訪問速度,首先要創建一個索引。創建索引的方式大致可分為三種。 創建表的同時創建索引 創建表的時候可以直接創建索引,這種方式最簡單、方便,其基本語法格式如下所示: create table 表名(字段名數據類型 [完整性約束條件],字段名數據類型 [完整性約束條件], ??); 字段名數據類型 [unique|fulltext|spatial] index|key [別名](字段名1 [(長度)])[asc|desc] 關于上述語法相關解釋具體如下: 1)unique:可選參數,表示唯一索引。2)fulltext:可選參數,表示全文索引。3)spatial:可選參數,表示空間索引 4)index和key:用來表示字段的索引,二者選一即可。5)別名:可選參數,表示穿件的索引名稱。6)字段名1:指定索引對應字段的名稱。7)長度:可選參數,用于表示索引的長度。 8)asc和desc:可選參數。asc表升序,desc表降序排列。 MySQL中的6種索引類型,如下: 1)創建普通索引 【例】在t1表中id字段上創建索引,SQL語句如下: create table t1(id int, name varchar(20), score float,);index(id)可使用explain語句查看索引是否被使用,SQL語句如下: explain select * from t1 where id = 1;2)創建唯一性索引 【例】創建一個表名為t2的表,在表中的id字段上建立索引名為unique_id的唯一性索引,并按升序排列,SQL語句如下: create table t2(id int not null,);name varchar(20)not null, score float, unique index unique_id(id asc)這樣,便在id字段上建立了一個名為unique_id的唯一性索引。3)創建全文索引 【例】創建一個表名為t3的表,在表中的name字段上建立索引名為fulltext_name的全文索引,SQL語句如下: create table t3(id int not null,name varchar(20)not null, score float, fulltextindex fulltext_name(name))engine=MyISAM;這樣,即可在name字段上建立一個名為fulltext_name的全文索引。 需要注意的是,由于目前只有MyISAM存儲引擎支持全文索引,默認的InnoDB存儲引擎不支持全文索引。因此,在建立全文索引時,一定要注意表存儲引擎的類型,對于經常需要索引的字符串、文字數據等信息,可以考慮存儲到MyISAM存儲引擎的表中。 4)創建單列索引 【例】創建一個表名為t4的表,在表中的name字段上建立索引名為single_name的單列索引,SQL語句如下: create table t4(id int not null,);name varchar(20)not null, score float, index single_name(name(20))這樣,即可在name字段上建立一個名稱為single_name的單列索引,并且索引的長度為20。 5)創建多列索引 【例】創建一個表名為 t5的表,在表中的id和name字段上建立索引名為multi的多列索引,SQL語句如下: create table t5(id int not null,);name varchar(20)not null, score float, indexnulti(id, name(20))這樣,即可在id和name字段上建立一個名為multi的多列索引。 需要注意的是,在多列索引中,只有查詢條件中使用了這些字段中的第一個字段時多列索引才會被使用。 為了驗證這個說法是否正確,將id字段作為查詢條件,通過explain語句查可看索引的使用情況,SQL語句如下: explain select * from t5 where id = 1;但是,如果只使用name字段作為查詢條件,multi索引不會被使用。6)創建空間索引 【例】創建一個表名為t6的表,在空間類型為geometry的字段上創建空間索引,SQL語句如下: create table t6(id int,space geometry not null, spatial index sp(space))engine=MyISAM;這樣,即可在t6表中的space字段上建立名稱為sp的空間索引了。 需要注意的是,創建空間索引時,所在字段的值不能為空值,并且表的存儲引擎為MyISAM。 使用 create index 語句在已經存在的表上創建索引 若想在一個已經存在的表上創建索引,可以使用 create index語句,其創建索引的具體語法格式如下所示: create [unique|fulltext|spatial] index 索引名 on表名(字段名 [(長度)] [asc|desc]);在上述語法格式中,unique、fulltext和spatial都是可選參數,分別用于表示唯一性索引、全文索引和空間索引;index用于指明字段為索引。 為了更好的展示如何使用create index語句在已經存在的表上創建索引,接下來創建一個book表,該表中沒有建立任何索引,創建book表的SQL語句如下: create table book(bookid int not null, bookname varchar(255)not null, authors varchar(255)not null, info varchar(255)null, comment varchar(255)null, publicyear year not null);創建好數據表book后,通過具體案例演示如何使用create index語句在已經存在的數據表中創建索引,具體如下: 1)創建普通索引 【例】在book表中的bookid字段上建立一個名稱為index_id的普通索引,SQL語句如下: create index index_id on book(bookid);這樣,即可在book表中,為bookid字段建立一個名稱為index_id的普通索引。2)創建唯一性索引 【例】在book表中的bookid字段上建立一個名稱為uniqueidx的唯一性索引,SQL語句如下: create unique index uniqueidx on book(bookid);這樣,即可在book表中,為bookid字段建立一個名稱為uniqueidx的唯一性索引。3)創建單列索引 【例】在book表中的comment字段上建立一個名稱為singleidx的單列索引,SQL語句如下所示: create indexsingleidx on book(comment);這樣,即可在book表中,為comment字段建立一個名稱為singleidx的單列索引。4)創建多列索引 【例】在book表中的authors字段和info字段上建立一個名稱為mulitidx的多列索引,SQL語句如下所示: create index mulitidxon book(authors(20), info(20));這樣,即可在book表中,為authors和info字段建立一個名稱為mulitidx的多列索引。5)創建全文索引 【例】刪除表book,重新創建表book,在book表中的info字段上建立全文索引。首先刪除book表。SQL語句如下所示: drop table book;然后重新創建表book,SQL語句如下所示: create table book(bookid int not null, bookname varchar(255)not null, authors varchar(255)not null, info varchar(255)null, comment varchar(255)null, publicyear year not null)engine=MyISAM;接下來使用create index 語句在book表的info字段上創建名稱為fulltextidx的全文索引,SQL語句如下所示: create fulltext indexfulltextidx on book(info);這樣,即可在book表中,為info字段建立一個名稱為fulltextidx的全文索引。6)創建空間索引 【例】創建表t7,在表中的g字段上創建名稱為spatialidx的空間索引。首先創建數據表t7,SQL語句如下所示: create table t7(g geometry not null)engine=MyISAM;使用create index 語句在t7表的g字段上,創建名稱為spatialidx的空間索引,SQL語句如下所示: create spatial index spatialidx on t7(g);這樣,即可在t7表中,為g字段建立一個名稱為spatialidx的空間索引。 使用alter table語句在已經存在的表上創建索引 在已經存在的表中創建索引,除了可以使用create index語句外,還可以使用alter table語句來完成。其語法格式: alter table 表名 add [unique|fulltext|spatial] index 索引名(字段名 [(長度)] [asc|desc])在上述語法格式中,unique、fulltext和spatial都是可選參數,分別用于表示唯一性索引、全文索引和空間索引;add表示向表中添加字段。 接下來,同樣以book表為例,對不同類型的索引進行說明,為了使book表不包含任 何索引,首先刪除book表,SQL語句如下: drop table book;然后重新建立book表,SQL語句如下: create table book(bookid int not null, bookname varchar(255)not null, authors varchar(255)not null, info varchar(255)null, comment varchar(255)null, publicyear year not null);創建好數據表book后,就可以使用alter table語句在已存在的數據表中創建索引了,具體如下: 1)創建普通索引 【例】在表中的bookid字段上創建名稱為index_id的普通索引,SQL語句如下: alter table book add index index_id(bookid);這樣,即可在book表中,為bookid字段建立一個名稱為index_id的普通索引。2)創建唯一性索引 【例】在book表中的bookid字段上建立一個名稱為uniqueidx的唯一性索引,SQL語句如下: alter table book add unique uniqueidx(bookid);這樣,即可在book表中,為bookid字段建立一個名稱為uniqueidx的唯一性索引。3)創建單列索引 【例】在book表中的comment字段上建立一個名稱為singleidx的單列索引,SQL語句如下所示: alter table book add indexsingleidx(comment(50));這樣,即可在book表中,為comment字段建立一個名稱為singleidx的單列索引。4)創建多列索引 【例】在book表中的authors字段和info字段上建立一個名稱為mulitidx的多列索引,SQL語句如下所示: alter table book add indexmultidx(authors(20), info(50));這樣,即可在book表中,為authors和info字段建立一個名稱為mulitidx的多列索引。 5)創建全文索引 【例】刪除表book,重新創建表book,在book表中的info字段上建立全文索引。首先刪除book表。SQL語句如下所示: drop table book;然后重新創建表book,SQL語句如下所示: create table book(bookid int not null, bookname varchar(255)not null, authors varchar(255)not null, info varchar(255)null, comment varchar(255)null, publicyear year not null)engine=MyISAM;接下來使用alter table語句在book表的info字段上創建名稱為fulltextidx的全文索引,SQL語句如下所示: alter table book add fulltext indexfulltextidx(info);這樣,即可在book表中,為info字段建立一個名稱為fulltextidx的全文索引。6)創建空間索引 【例】創建表t8,在表中的space字段上創建名稱為spatialidx的空間索引。首先創建數據表t8,SQL語句如下所示: create table t8(space geometry not null)engine=MyISAM;使用alter table語句在t8表的space字段上,創建名稱為spatialidx的空間索引,SQL語句如下所示: alter table t8 add spatial index spatialidx(space);這樣,即可在t8表中,為space字段建立一個名稱為spatialidx的空間索引。 刪除索引 由于索引會占用一定的磁盤空間,因此,為了避免影響數據庫性能,應該及時刪除不再使用的索引。刪除索引的方法有兩種,如下: 使用alter table刪除索引 使用alter table刪除索引的基本語法格式如下所示: alter table 表名 drop index 索引名 【例】刪除表book中名稱為fulltextidx的全文索引 alter table book drop index fulltextidx;上述SQL語句執行后,可以使用show create table語句查看表結構,來確認索引是否已經成功被刪除。 show create talbe book;使用dropindex刪除索引 使用dropindex刪除索引的基本語法格式如下所示: drop index 索引名 on表名;【例】刪除表t8中名稱為spatialidx的空間索引,SQL語句如下: drop index spatialidx on t8 使用show create table 語句查看表結構 show create table t8 發現,t8表中名稱為spatialidx的索引被成功刪除了。 四、從多個表里選取數據記錄 1.數據表間的連接 簡單的連接語法: SELECT 字段名1, 字段名2, …… FROM 表名1, [表名2, ……] WHERE 表名1.字段名 = 表名2.字段名 [ AND ……];SELECT 字段名1, 字段名2, …… FROM 表名1, [表名2, ……] WHERE 表名1.字段名 = 表名2.字段名(+)[ AND ……];有(+)號的字段位置自動補空值 連接的分類: 等于的連接 = 不等于的連接!= BETWEEN … AND … IN 注意IN和OR不能一起用 8 J2EE @ zxw 外連接 有一個字段名(+), 沒有滿足的條件補空值 自連接 同一個表自己跟自己連接 例如找重復記錄 2.數據表間的連接例子 刪除table_name表里字段名email重復的記錄: SQL>delete from table_name t1 where t1.rowid >(select min(rowid)from table_name t2 where t1.email = t2.email group by email having count(email)> 1);找到手機用戶的服務區域: SQL> select a.handphoneno,nvl(c.name,'null'),a.totalscore from topscore a,chargeoperator cc,chargeoperatorinfo c where substr(a.handphoneno,1,7)=cc.hpnohead(+)and cc.chargetype=c.chargetype(+)order by a.totalscore desc;3.數據表間的連接技巧 連接N個表, 需要N-1個連接操作 被連接的表最好建一個單字符的別名, 字段名前加上這個單字符的別名 BETWEEN..AND..比用 >= AND <= 要好 連接操作的字段名上最好要有索引 連接操作的字段最好用整數數字類型 有外連接時, 不能用OR或IN的比較操作 4.如何分析和執行SQL語句 寫多表連接SQL語句時要知道它的分析執行計劃的情況.Sys用戶下運行@/ORACLE_HOME/sqlplus/admin/plustrce.sql 產生plustrace角色 Sys用戶下把此角色賦予一般用戶 SQL> grant plustrace to &username;一般用戶下運行@/ORACLE_HOME/rdbms/admin/utlxplan.sql 產生plan_table SQL> set time on;說明:打開時間顯示 SQL> set autotrace on;說明:打開自動分析統計,并顯示SQL語句的運行結果 SQL> set autotrace traceonly;說明:打開自動分析統計,不顯示SQL語句的運行結果 接下來你就運行測試SQL語句,看到其分析統計結果了。一般來講,我們的SQL語句應該避免大表的全表掃描。SQL> set autotrace off;說明:關閉自動分析統計 五、集合函數 經常和group by一起使用 1.集合函數列表 AVG(DISTINCT | ALL | N)取平均值 COUNT(DISTINCT | ALL | N | expr | *)統計數量 MAX(DISTINCT | ALL | N)取最大值 MIN(DISTINCT | ALL | N)取最小值 SUM(DISTINCT | ALL | N)取合計值 9 J2EE @ zxw STDDEV(DISTINCT | ALL | N)取偏差值,如果組里選擇的內容都相同,結果為0 VARIANCE(DISTINCT | ALL | N)取平方偏差值 2.使用集合函數的語法 SELECT column, group_function FROM table WHERE condition GROUP BY group_by_expression HAVING group_condition ORDER BY column;3.使用count時的注意事項 SELECT COUNT(*)FROM table;SELECT COUNT(常量)FROM table;都是統計表中記錄數量,如果沒有PK后者要好一些 SELECT COUNT(all 字段名)FROM table;SELECT COUNT(字段名)FROM table;不會統計為NULL的字段的數量 SUM,AVG時都會忽略為NULL的字段 4.用group by時的限制條件 SELECT字段名不能隨意, 要包含在GROUP BY的字段里 GROUP BY后ORDER BY時不能用位置符號和別名 限制GROUP BY的顯示結果, 用HAVING條件 5.例子 SQL> select title,sum(salary)payroll from s_emp where title like 'VP%' group by title having sum(salary)>5000 order by sum(salary)desc;找出某表里字段重復的記錄數, 并顯示 SQL> select(duplicate field names)from table_name group by(list out fields)having count(*)>1;6.判斷題(T/F)(1)Group functions include nulls in calculations [F](2)Using the having clause to exclude rows from a group calculation [F] 解釋: Group function 都是忽略NULL值的 如果您要計算NULL值, 用NVL函數 Where語句在Group By前把結果集排除在外Having語句在Group By后把結果集排除在外 六、子查詢 1.查詢語句可以嵌套 例如: SELECT …… FROM(SELECT …… FROM表名1, [表名2, ……] WHERE 條件)WHERE 條件2;2.何處可用子查詢? 當查詢條件是不確定的條件時 DML(insert, update,delete)語句里也可用子查詢 HAVING里也可用子查詢 3.兩個查詢語句的結果可以做集合操作 例如: 并集UNION(去掉重復記錄)并集UNION ALL(不去掉重復記錄)10 J2EE @ zxw 差集MINUS, 交集INTERSECT 4.子查詢的注意事項 先執行括號里面的SQL語句,一層層到外面 內部查詢只執行一次 如果里層的結果集返回多個,不能用= ><>= <=等比較符要用IN.5.子查詢的例子(1)SQL> select title,avg(salary)from s_emp group by title Having avg(salary)=(select min(avg(salary))from s_emp group by title);找到最低平均工資的職位名稱和工資 5.子查詢的例子(2)子查詢可以用父查詢里的表名 這條SQL語句是對的: SQL>select cty_name from city where st_code in(select st_code from state where st_name='TENNESSEE' and city.cnt_code=state.cnt_code);說明:父查詢調用子查詢只執行一次. 6.取出結果集的80 到100的SQL語句 ORACLE處理每個結果集只有一個ROWNUM字段標明它的邏輯位置, 并且只能 用ROWNUM<100, 不能用ROWNUM>80。 以下是經過分析后較好的兩種ORACLE取得結果集80到100間的SQL語句(ID是唯一關鍵字的字段名)語句寫法: SQL>select * from((select rownum as numrow, c.* from(select [field_name,...] from table_name where 條件1 order by 條件2)c)where numrow > 80 and numrow <= 100)order by 條件3;第四篇:黑馬程序員C語言教程:mysql中的索引
第五篇:黑馬程序員c語言教程:Oracle概念