日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Oracle + SQL 学习笔记

發布時間:2024/1/18 数据库 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle + SQL 学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本筆記以orcal數據庫為例,其它數據庫略有不同.


一、寫子句順序
? ? Select [ALL | DISTINCT] ?column_name [, column_name]...
? ? From ?{table_name | view_name}
? ? ? ? ? ? ? [, {table_name | view_name}]...
? ? [Where ?search_conditions]
? ? [Group By ?column_name [, column_name]
? ? ? [Having ?search_condition]]
? ? [Order By ?{column_name | select_list_number} [ASC | DESC]
? ? ? ? [, ?{column_name | select_list_number} [ASC | DESC]]... ]; ? ?--最后


二、常用SQL:
? 1.建表前檢查語句:
? ? MySQL的: drop table if exists 表名;
? ? SQL Server的: IF EXISTS (SELECT name FROM sysobjects ?WHERE name = '表名' AND type = 'U') DROP TABLE 表名;
? ? Oracle的: create or replace table 表名 ...; -- 直接寫建表語句


? 2.建表語句: create table 表名(memid int , points numeric(10,1) default 0,
? ? ? ? primary key (`memid`, `courseid`),
? ? ? ? FOREIGN KEY (`memid`) REFERENCES 表名2 (`memid`) on delete cascade on update cascade ,
? ? ? ? CHECK ( points>=0 and points<=100 ) );
? 3.復制表: CREATE TABLE 新表名 AS SELECT * ?FROM 舊表名; -- 僅復制數據,沒復制表結構(自增主鍵等不會復制)
? ? ? ? ? ? CREATE TABLE 新表名 like 舊表名; -- 使用舊表創建新表,復制表結構(數據不會復制)
? 4.插入語句: INSERT INTO 表名(id,name,price,vend_name) VALUES(11,'TV',222,'US'),(22,'ss',12.22,'kk');
? ? ? ? ? ? ? INSERT INTO 表名(id,name,price,vend_name) SELECT id,name,price,vend FROM 表名2;
? 5.更新語句: UPDATE 表名 SET column_name = expression, prod_name = 'NEWCOMPUTER' [WHERE];
? ? ? ? ? ? ? UPDATE 表1, 表2 SET 表2.column_name = expression, 表1.prod_name = 'NEWCOMPUTER' [WHERE];
? 6.刪除語句: DELETE FROM 表名 WHERE search_conditions;


? 7.清空表格: TRUNCATE TABLE 表名;
? 8.修改表結構
? ? 修改字段: ALTER TABLE 表名 Modify col_name varchar(100);
? ? 添加字段: ALTER TABLE 表名 Add col_name varchar(100) default NULL COMMENT '匯款帳號或者匯款人' after col_name0;
? ? 減少字段: Alter Table 表名 Drop (column [,column]…);
? ? 添加約束: Alter TABLE 表名 Add FOREIGN KEY(column1) REFERENCES 表名2(column2); -- 添加非空約束時,要用Modify語句
? ? 刪除約束: ALTER TABLE 表名 Drop FOREIGN KEY 表名_ibfk_1;
? ? ? ? ? ? ? Alter Table 表名 Drop CONSTRAINT column;
? ? 添加主鍵: Alter table 表名 add primary key(col);
? ? 刪除主鍵: Alter table 表名 drop primary key(col);
? ? 唯一約束: ALTER [IGNORE] TABLE 表名 ADD UNIQUE INDEX (column [,column]…); -- IGNORE:刪除重復; 沒這個則重復時報錯
? 9.創建索引: create [unique] index 索引名 on 表名(column [,column]…);
? ? 刪除索引: drop index 索引名;
? 10.創建視圖:create view 視圖名 as select statement;
? ? ?刪除視圖:drop view 視圖名;




三、注意事項:
? ? 大小寫不敏感,即不區分大小寫。提倡關鍵字大寫,便于閱讀和調試。
? ? SQL語句是由簡單的英語單詞構成;這些英語單詞稱為關鍵字/保留字,不做它用。SQL由多個關鍵字構成。
? ? SQL語句由子句構成,有些子句是必須的,有些是可選的。
? ? 在處理SQL語句時,其中所有的空格都被忽略(空格只用來分開單詞,連續多個空格當一個用)。
? ? SQL語句可以在一行上寫出,建議多行寫出,便于閱讀和調試。
? ? 多條SQL語句必須以分號分隔。多數DBMS不需要在單條SQL語句后加分號,但特定的DBMS可能必須在單條SQL語句后加分號。
? ? SQL語句的最后一句以 “;”號結束。不同的數據庫會有不同的結束符號。(go也會作結束符)
? ? {} 大括號包起來的單字或詞組,表示至少從中選一個。
? ? [] 中括號包起來的部分,表示可選可不選的。
? ? () 小括號,表示一定要輸入的。與大括號、中括號不同。
? ? | 表示最多只能從選項中選取一個。
? ? , 表示可按需選擇多個選項,并且這些選項之間必須以逗號隔開。
? ? ... 表示可以重復地使用同樣的語法部分。
? ? ! ?在SQL環境下執行Unix命令。


四、兼顧各數據庫的 SQL 語句
? ? 1.自增列:
? ? ? ?Oracle: ? ? 建立 Sequence?
? ? ? ?MySQL: ? ? ?create table test_t(id int primary key AUTO_INCREMENT, name varchar(80)); -- AUTO_INCREMENT 是自增關鍵字
? ? ? ?SQL Server: create table test_t(id int primary key identity(1,1), name varchar(80)); -- identity(1,1) 是自增函數
? ? ? ?access: ? ?create table test_t(id Integer primary key Counter(1,1), name varchar(80));


? ? ? ?通用的: 使用表自身的自增列的最大值+1,如:
? ? ? ?insert into test_t(id, name) values((select nvl(max(id),0)+1 from test_t),'holer'); ?-- 這里 id 是表的自增列


? ? ?2.偽列(序號):
? ? ? ?SELECT (SELECT Count(表名.aa) AS AutoNum FROM xlh WHERE (表名.aa <= 表名_tem.aa)) AS 序號, 表名.aa?
? ? ? ?FROM 表名 AS 表名_tem INNER JOIN 表名 ON 表名_tem.aa=表名.aa ORDER BY 表名.aa;


Rownum:緯列。內存里排序的前N個。
? ? 在where語句中,可以用=1,和<=N 或 <N;但不能用=N 或 >N。
? ? 因為這是內存讀取,沒有1就丟棄再新建1。只能從1開始。需要從中間開始時,需二重子rownum語句需取別名。
經典應用: Top-n Analysis ?(求前N名或最后N名)
? ? ? ? ? Select [查詢列表], Rownum
? ? ? ? ? From (Select ?[查詢列表(要對應)]
? ? ? ? ? ? ? ? ? ?From 表
? ? ? ? ? ? ? ? ? ?Order by ?Top-N_字段)
? ? ? ? ? Where Rownum <= N ? -- 不寫這行則全部顯示并排名。
SQL server的用法:
? ? ? ? ? Select ?top N 查詢列表
? ? ? ? ? ? ? ? ? From 表
? ? ? ? ? ? ? ? ? Order by ?Top-N_字段


分頁顯示:
? ? --取工資第5~10名的員工(二重子rownum語句,取別名)
? ? select * From (
? ? select id,last_name,salary,Rownum rn
? ? ? ? ? ?From (Select id,last_name,salary
? ? ? ? ? ? ? ? ? ? ?from s_emp
? ? ? ? ? ? ? ? ? ? ?order by salary desc)
? ? where rownum <= 10)
? ? where rn between 5 and 10;






三、常用簡單語句:
? ? clear screen:清屏
? ? edit:編輯剛才的一句。
? ? desc/describe:(列出所有列名稱)
? ? ? ? 用法: DESCRIBE [schema.]object[@db_link]
? ? dual:亞表(虛表),臨時用。如:desc dual;/from dual;
? ? rollback:回溯,回溯到上次操作前的狀態,把這次事務操作作廢,只有一次(DDL和DCL語句會自動提交,不能回溯)。
? ? ? ? 可以用commit語句提交,這樣就回溯不回了。
? ? set pause on\off :設置分屏(設置不分屏)
? ? set pause "please put an enter key" 且 set pause on:設置帶有提示的分屏
? ? oerr ora 904 :查看錯誤
? ? set head off :去掉表頭
? ? set feed off :去掉表尾
? ? 保存在oracle數據庫中的所有操作細節:
? ? ? ? spool oracleday01.txt :開始記錄
? ? ? ? spool off :開始保存細節
? ? ?SQL server的變量:
? ? ? ? 申明變量: declare @i int ?設變量值: set @i=0
? ? ? ? DECLARE @sql NVARCHAR(4000) ?SET @sql = 'SELECT MEMID, NAME'
? ? ? ? SET @sql = @sql + ', ISNULL(STR(AVG(S.POINTS)), ''0'') AS ''平均成績'' '
? ? ? ? SET @sql = @sql + ' FROM TB_MEMBER '
? ? ? ? PRINT @sql
? ? ? ? EXEC(@sql)
? ? update 表名 set 字段名=@i,@i=@i+1 ?--遞增效果
? ? 另一遞增效果:identity(1,1) --前參數是從多少開始,后參數是增量




四、SELECT語句:選擇操作、投影操作。
select:從一個或多個表中檢索一個或多個數據列。包含信息:想選擇什么表,從什么地方選擇。必須要有From子句。(最常用)
? ? ? ? 當從多張表里查詢的時候,會產生笛卡爾積;可用條件過濾它。
? ? ? ? 當兩個表有相同字段時必須加前綴,列名前需加表名和“.”,如“s_emp.id”。
? ? 1、用法:SELECT ?columns,prod2,prod3<列> ?FROM Table1,table2<表名> ?分號結束
? ? ? ?如: select id from s_emp;
? ? ? ? ? ?select last_name,name from s_emp,s_dept where s_emp.dept_id=s_dept.id;--列表每人所在部門
? ? ? ? ? ?SELECT * ?FROM Products; ? ?--檢索所有列。
? ? ? ? ? ?數據太多時,最好別使用上句,會使DBMS降低檢索和應用程序的性能。(*通配符)
? ? 2、對數據類型的列(字段)可進行運算(如加減乘除)。
? ? 3、對列起別名:有直接起別名,加AS起別名,用雙引號起別名等三種方法
? ? ? ?(單引號,引起字符串;雙引號,引起別名。起別名有符號,或者區分大小寫時,必須用雙引號)
? ? ? ? 多表查詢時,可給表起別名。(給列起別名,列<空格>列別名;給表起別名,表<空格>表別名;)。
? ? ? ? 如:Select first_name EMPLOYEES, 12*(salary+100) AS MONEY, manager_id "ID1" From s_emp E;
? ? 4、字段的拼接,可用雙豎線(雙豎線只能用于select語句里)。不同的DBMS可能使用不同的操作符;拼接的字段同樣可以起別名。
? ? ? ? 如:Select ?first_name ||' '|| last_name || ', '|| title "Employees" From s_emp;


排他鎖:Select id,salary ?From s_emp where id=1 ?For Update;
? ?可以阻止他人并發的修改,直到你解鎖。
? ?如果已有鎖則自動退出:Select id,salary From s_emp where id=1 For Update NoWait;
? ?FOR UPDATE :可以再加 OF 精確到某格。如: ? ... For Update ?OF salary ...
? ?注意要解鎖。


五、ORDER BY 子句,排序
Order by:按某排序列表(默認升序 asc, 由低到高; 可加 desc,改成降序由高到低)
? ? 檢索返回數據的順序沒有特殊意義,為了明確地排序用 SELECT 語句檢索出的數據,可使用 ORDER BY 子句。
? ? ORDER BY 子句取一個或多個列的名字。
? ? 對空值,按無窮大處理(升序中,空值排最后;降序中排最前)。
? ? 1、用法:Select prod_id,prod_price,prod_name From Products ?Order By ?prod_price,prod_name;
? ? ? (從左到右執行排序,先排price)
? ? ? ?ORDER BY子句中使用的列將是為顯示所選擇的列,但是實際上并不一定要這樣,用非檢索的列排序數據是完全合法的。
? ? ? ?為了按多個列排序,列名之間用逗號分開。
? ? 2、支持按相對列位置進行排序。位置從1開始。
? ? ? ?輸入 SELECT prod_id,prod_price,prod_name
? ? ? ?FROM ?Products
? ? ? ?ORDER BY 2,3 ? ?--(2指price,3指name)
? ? 3、升序、降序。默認是升序(asc,從小到大排序),想降序時用desc。
? ? ? ?如:SELECT prod_id,prod_price,prod_name FROM ?Products ORDER BY prod_price DESC;
? ? ? 注意:DESC 關鍵字只應用到直接位于其前面的列名。如果想在多個列上進行排序,必須對每個列指定DESC關鍵字。
? ? ? ? ?升序是默認的,可不寫,但降序必須寫。




六、WHERE子句,選擇、過濾
? ? 其后只能跟邏輯語句,返回值只有ture或false
? ? 如: select last_name,salary from s_emp where salary=1000;--找出工資1000的人


WHERE子句操作符:
? ? 1、邏輯比較運算符
? ? ? ? = ? ? ? ?等于
? ? ? ? != ? ? ? 不等于,還有(<> ?^= ? 這兩個同樣表示不等于)
? ? ? ? > ? ? ? ? 大于
? ? ? ? >= ? ? ? ?大于等于
? ? ? ? < ? ? ? ? 小于
? ? ? ? <= ? ? ? ?小于等于




? ? 2、SQL 比較運算符


? ? between…and… ? ?:在兩者之間。(BETWEEN 小值 AND 大值)
? ? NOT ?between ... ?and ... :指定不包含的范圍。
? ? ? ? 如:select last_name,salary from s_emp where salary between 1000 and 1500;
? ? ? ? ? --工資1000到1500的人,包括1000和1500。


? ? in(列表):在列表里面的。 ?in的括號里可包含次查詢,即select子句
? ? ? ? 如:select last_name,dept_id from s_emp where dept_id in(41,42);第41、42部門的人


? ? like ? ?: 包含某內容的。模糊查詢
? ? ? ? 可以利用通配符創建比較特定數據的搜索模式,通配符只能用于文本,非文本數據類型不能使用通配符。
? ? ? ? 通配符在搜索模式中任意位置使用,并且可以使用多個通配符。
? ? ? ? 通配符%表示任何字符出現任意次數;還能代表搜索模式中給定位置的0個或多個字符。下劃線匹配單個任意字符。
? ? ? ? 如:select table_name from user_tables where table_name like 'S\_%' escape'\';
? ? ? ? ' ?找出“S_“開頭的,由于下劃線有任意字符的含義,故需另外定義轉移符。
? ? ? ? ? ?但習慣用“\”,為方便其它程序員閱讀和檢測,一般不改用其它的。
? ? ? ? like 'M%':M開頭的 ? ? ? ?like '_a%':第二個字符是a的 ? ?like '%a%'所有含a的
? ? ? ? ? ? (“_”表示一個任意字符;“%”表示任意多個任意字符。)
? ? ? ? 如果將值與串類型的進行比較,則需要限定引號;用來與數值列進行比較時,不用引號。


? ? is null:是空。(NULL表示不包含值。與空格、0是不同的。)
? ? ? ? 如:SELECT prod_name,prod_price FROM Products WHERE prod_price IS NULL;




七、高級檢索(邏輯運算符):
? ? 通常我們需要根據多個條件檢索數據。可以使用AND或OR、NOT等連接相關的條件
? ? 計算次序可以通過圓括號()來明確地分組。不要過分依賴默認計算次序,使用圓括號()沒有壞處,它能消除二義性。


? ? and:條件與
? ? ? ?如 SELECT prod_id,prod_price,prod_name FROM Products WHERE prod_price<4 AND vend_id=‘DELL’
? ? or:條件或 ? ?(注: and 的優先級比 or 更高,改變優先級可用括號)
? ? ? ?如 SELECT prod_id,prod_price,prod_name FROM Products WHERE prod_price<4 OR vend_id=‘DELL’
? ? not:條件非。否定它之后所跟的任何條件
? ? ? ? 否定的SQL 比較運算符: NOT BETWEEN; NOT IN; NOT LIKE; IS NOT NULL:
? ? ? ? ?(注意,按英語習慣用 is not,而不是 not is)
? ? ? ? NOT 與 IN 在一起使用時,NOT 是找出與條件列表不匹配的行。
? ? ? ? IN 列表里有 NULL 時不處理,不影響結果;用 NOT IN 時,有 NULL 則出錯,必須排除空值再運算。
? ? in :選擇列表的條件
? ? ? ? 使用IN操作符的優點: 在長的選項清單時,語法直觀; 計算的次序容易管理;
? ? ? ? 比 OR 操作符清單執行更快;最大優點是可以包含其它 SELECT 語句,使用能夠動態地建立 WHERE 子句。
? ? ?如 SELECT prod_id,prod_price,prod_name FROM Products WHERE vend_id IN(‘DELL’,’RBER’,’TTSR’);
? ? ?SELECT au_name FROM authors WHERE au_id NOT IN (SELECT au_id FROM titleauthors WHERE royaltyshare < .50); ? ?#找出版稅不小于50%的作者.




八、單行函數:
? ? 函數一般在數據上執行,它給數據的轉換和處理提供了方便。不同的DBMS提供的函數不同。
? ? 函數可能會帶來系統的不可移植性(可移植性:所編寫的代碼可以在多個系統上運行)。
? ? 加入注釋是一個使用函數的好習慣。
? ? 大多數SQL實現支持以下類型的函數: 文本處理, 算術運算, 日期和時間, 數值處理。


Null:空值
? ? 空值當成無窮大處理,所有空值參與的運算皆為空。
? ? 空值與空值并不相等,因為空值不能直接運算。
? ? 如:prod_price="" ? ? 這種寫法是錯的(不要受到corejava的影響)
? ? prod_price=NULL ? ? ?這種寫法是錯的(不要受到corejava的影響)
? ? prod_price IS NULL ? 這種寫法才是對的


NVL:處理空值,把空值轉化為指定值。可轉化為日期、字符、數值等三種(注意:轉化時,兩參數必須要同類型)
? ? 在SQL server 里用"ISNULL(需轉的數據,轉成什么)"函數代替。
? ? 遇到數值要把空轉換成字符串的,需先把數值轉成字符串類型。
? ? 如:NVL(date, '01-JAN-95') ? ?NVL(title,'NO Title Yet') ? ? ? ?NVL(salary,0)
? ? 錯誤寫法:
? ? ?Select last_name,title,salary*commission_pct/100 COMM From s_emp;--沒提成的人沒法顯示工資
? ? 正確寫法:
? ? ?Select last_name,title,salary*NVL(commission_pct,0)/100 COMM From s_emp;--把提成是空值的轉化為0
注意:在oracle中的 NVL ,在 SQL server 中用 ISNULL。格式相同。


DISTINCT:過濾重復
? ? 把重復的行過濾掉;多個字段組合時,只排除組合重復的。
? ? DISTINCT必須使用列名前,不能使用計算或者表達式。
? ? 所有的聚合函數都可以使用。如果指定列名,則DISTINCT只能用于COUNT(列名),DISTINCT不能用于COUNT(*)。
? ? 如:Select ?Distinct ?name ?From ?s_dept;
? ? ? ? ? ? Select Distinct dept_id,title ?From s_emp;
? ? 注意:Distinct 配合字段使用時,無法在字段列表里指定非唯一的單元或運算值。配合聚合函數使用時,需把 distinct 放到聚合函數的括號中,而僅對此函數有效。


文本處理:
TRIM()/LTRIM()/RTIRM():去空格。只能去掉頭和尾的空格,中間的不理。
? ? ?trim(' ? heo Are ?fdou ? ') ?--> ?heo Are ?fdou
? ? ?輸入:select trim(' ? heo Are ?fdou ? ') ?from dual; -->:heo Are ?fdou
LOWER:轉小寫
? ? lower('SQL Course') --> sql course
UPPER:轉大寫
? ? upper(' ? ?SQL Course') --->SQL COURSE
INITCAP:首字母轉大寫,其余轉小寫
? ? initcap('SQL Course') --> Sql Course


CONCAT:合成。雙豎線只能在select語句里面用,這個可用于任何語句。
? ? Concat('Good','String') --> GoodString
SUBSTR:截取。
? ? Substr('String', 1 ,3) ?--> Str
? ? ? ? 第一個數字“1”,表示從第幾個開始截取;若要從倒數第幾個開始,用負數,如“-2”表示倒數第2個。
? ? ? ? 上式中第2個數字“3”表示截取多少個。
LENGTH:統計長度。
? ? Length('String') --> 6
NVL:轉換空值,上面已有.


日期和時間處理:
? ? Oracle日期格式:DD-MMM-YYYY ? ? ? ?(D代表日期date,M代表月month,Y代表年year)
? ? 如:SELECT prod_name ? ? ? ? ? ? ?(DAY表示完整的星期幾,DY顯示星期的前三個字母)
? ? ? ? FROM Products
? ? ? ? WHERE prod_time BETWEEN
? ? ? ? ? ? to_date(’01-JAN-2008’)
? ? ? ? AND to_date(’31-DEC-2008’);
? ? 日期可以進行加減,默認單位是1天。日期與日期可以相減,得出天數;日期與日期但不能相加。
sysdate ? -> ?系統的當天
Months_Between('01-Sep-95','11-Jan-94') ?--> 19.774194 ? ?相差多少個月,Between里面也可以填函數。
Add_months('11-Jan-94',6) ? ? ? ? ? ? ? ?--> ?11-Jul-94 ? 增加多少個月
Next_day('01-Sep-95','Friday') ? --> '08-Sep-95' ? ?下一個星期五。其中的'Friday'可用6替代,因為星期日=1
Last_day('01-Sep-95') ? ? ? ? ? ?--> ?'30-Sep-95' ? 這個月的最后一天




數值處理:可以運用于代數,三角,幾何
ROUND:四舍五入
? ? Round(45.925,2) ?-> 45.93 ? ? ? ?Round(45.925,0) ?-> 46 ? ? ? ?Round(45.925,-1) ?-> 50
? ? 逗號前一個數是要處理的數據源,后一個參數表示保留多少位小數。
? ? 后一參數是負數時,表示舍去小數點前的幾位,例3是舍去個位及其后的。不寫后一參數時,默認不保留小數。
TRUNC:舍去末位。直接舍去,不會進位。
? ? Trung(45.925,2) ?-> 45.92 ? ? ? Trung(45.925,2) ?-> 45.92 ? ? ? Trung(45.925,2) ?-> 45.92
日期的舍取:




常用的數值處理函數有:
? ? ABS() ? ?絕對值 ? ? ? ?ABS(-5741.5854) --> 5741.5854
? ? PI() ? ? 圓周率 ? ? ? ?注意:oracle中不支持 PI()函數;MYSql 支持PI()函數。
? ? SIN() ? ?正統值 ? ? ? ? ? ? Oracle還支持COS()、ASIN()、ACOS()函數
? ? SQRT() ? 平方根




? 轉化:
TO_CHAR(number,'fmt'):把數值轉換成字符串
? ? 顯示數字的命令
? ? 9:正常顯示數字;
? ? 0:顯示包括0的數值形式,空位強制補0;
? ? $:以美元符號顯示貨幣;
? ? L:按當前環境顯示相關的貨幣符號;
? ? . 和,:在固定位置出現“.”點 和“,”逗號;不夠位時,四舍五入。
? ?例題:SQL> select 'Order'||To_char(id)||
? 2 ?'was filled for a total of'
? 3 ?||To_char(total,'fm$9,999,999')
? 4 ?from s_ord
? 5 ?where ship_date ='21-SEP-92';


TO_NUMBER(char):把字符轉換成數字




九、鏈接


內鏈接:嚴格匹配兩表的記錄。


外鏈接分左鏈接和右鏈接:
? ? 會使用一方表中的所有記錄去和另一格表中的記錄按條件匹配,空值也會匹配,這個表中的所有記錄都會顯示,
? ? 數據庫會模擬出記錄去和那些不匹配的記錄匹配。


左鏈接 ?加號在右面
? ? 如:有 TABLE1 ? TABLE2
? ? ? ? 1的一條記錄在2里面沒有匹配上,那么1里面的記錄保留
? ? ? ? 2的一條記錄在1里面沒有匹配上 ,那么2丟棄


右鏈接 正好相反
? ? --例題:哪些人是領導。
? ? select distinct b.id,b.last_name manager
? ? from s_emp a,s_emp b
? ? where a.manager_id=b.id(+);
左右順序有區別,這是另外新建一個表,要顯示的是第二個表格的內容。
+放在沒有匹配行的表一側,令表格能完整顯示出來。


標準寫法:內連接用INNER,左連接用LEFT,右連接用RIGHT。
? ? select distinct b.id,b.last_name manager
? ? from s_emp a LEFT join s_emp b
? ? ON a.manager_id=b.id;




JOIN: 連結數據庫
? ?以一個 select 命令取得及運用多個數據表里的數據。
? ?語法: SELECT ?select_list ? FROM ?table_1, ?table_2 ?[, table_3]...
? ? ? ? ? ? ? ? WHERE ?[table_1 . ]column ?join_operator ?[table_2 . ] column
? ?如:找出身兼編輯和作者的人 ? ?SELECT ?ed_name ? FROM ?editors, ?authors ?WHERE ed_id = au_id ;
? ?符號:
? ? ? ? ? ?*= ? ? ? ?把第一個數據表里的所有數據列都含括到查訊結果內
? ? ? ? ? ?=* ? ? ? ?把第二個數據表里的所有數據列都含括到查詢結果內




十、組函數:
? ? 分組允許將數據分為多個邏輯組,以便能對每個組進行聚集計算。
Group: 分組
Group by:分組。(默認按升序對所分的組排序;想要降序要用 order by)可以包括任意數目的列。
? ? 如果嵌入了分組,數據將在最后規定的分組上進行匯總。
? ? GROUP BY 子句中列出的每個列都必須是檢索列或有效的表達式,但不能是聚集函數。
? ? *如果在 SELECT 中使用表達式,則必須在 GROUP BY 子句中指定相同的表達式,不能使用別名。
? ? 除聚合計算語句外, SELECT 語句中的每個列都必須在 GROUP BY 子句中給出。
? ? 如果分組列中具有 NULL 值,則 NULL 將作為一個分組返回。如果列中有多行 NULL , 它們將分為一組。


Having: 過濾。分組之后,不能再用 where , 要用 having 選擇過濾。 Having 不能單獨存在,必須跟在 group by 后面。
? ? WHERE 在數據分組前進行過濾, HAVING 在數據分組后過濾。
? ? 可以在SQL中同時使用 WHERE 和 HAVING , 先執行 WHERE , 再執行 HAVING 。




? 聚合函數:
AVG: ?平均值 ? ?(忽略值為NULL的行,但不能用 AVG(*))
COUNT:計數 ? ?(Count(列)不計算空值;但 COUNT(*)表示統計表中所有行數,包含空值)
MAX: 最大值 ? ?(忽略值為 NULL 的行。但有些DBMS還允許返回文本列中的最大值,
? ? ? ? ? ? ? ?在作用于文本數據時,如果數據按照相應的列排序,則 MAX()返回最后一行。)
MIN: 最小值 ? ?(忽略值為 NULL 的行。不能用 MIN(*)。一般是找出數值或者日期值的最小值。
? ? ? ? ? ? ? ?但有些DBMS還允許返回文本列中的最小值,這時返回文本最前一行)
SUM: 求和 ? ? ?(忽略值為 NULL 的值。SUM 不能作用于字符串類型,而 MAX(),MIN()函數能。也不能 SUM(*))
? ? ? ? ? ?當AVG(*) 與 SUM(*)/COUNT(*) 不相等時,是NULL在作怪。




子查詢:查詢語句的嵌套
? ? 可以用于任意select 語句里面,但子查詢不能出現 order by。
? ? 子查詢總是從內向外處理。作為子查詢的SELECT 語句只能查詢單個列,企圖檢索多個列,將會錯誤。
? ? 如:找出工資最低的人select min(last_name),min(salary) from s_emp;
? ? ? ?或者用子查詢select last_name,salary from s_emp where salary=(select min(salary) from s_emp);


E-R圖:屬性: E(Entity) -R(Relationship)
? ? ? ? * (Mandatory marked 強制的) ? 強制的非空屬性
? ? ? ? o (Optional marked 可選的) ? ?可選屬性(可以有值也可以沒有)
? ? ? ? #* (Primary marked ) ? ? ? ? 表示此屬性唯一且非空


約束:針對表中的字段進行定義的。
PK: primary key (主鍵約束,PK=UK+NN)保證實體的完整性,保證記錄的唯一
? ? 主鍵約束,唯一且非空,并且每一個表中只能有一個主鍵,有兩個字段聯合作為主鍵,
? ? 只有兩個字段放在一起唯一標識記錄,叫做聯合主鍵(Composite Primary Key)。
FK: foreign key (外建約束)保證引用的完整性,外鍵約束,外鍵的取值是受另外一張表中的主鍵或唯一值的約束,不能夠取其它值,
? ? 只能夠引用主鍵會唯一鍵的值,被引用的表,叫做parent table(父表),引用方的表叫做child table(子表);
? ? child table(子表),要想創建子表,就要先創建父表,后創建子表,記錄的插入也是如此,先父表后子表,
? ? 刪除記錄,要先刪除子表記錄,后刪除父表記錄,
? ? 要修改記錄,如果要修改父表的記錄要保證沒有被子表引用。要刪表時,要先刪子表,后刪除父表。
U: UNIQUE key(唯一鍵 UK),值為唯一,不能重復。
? ? 在有唯一性約束的列,可以有多個空值,因為空值不相等。
NN: NOT NULL ,不能為空。
DEFAULT : 制定默認值,當使用者沒輸入時自動補上。
? ? ? ? ? 如:create table tb_score(memid int , courseid int, points numeric(10,1) default 0);
CHECK: ?指定特定字段里能輸入的數據。限定數據范圍的方法之一。
? ? ? ? ? 如:create table tb_test(memid int, sex varchar(5), points numeric(10,1),
? ? ? ? ? ? ? CHECK ( points>=0 and points<=100 and sex in ('man', 'women') ) );
REFERENCES: ?該字段的數據值必須存在于被參考的主鍵表格里,否則拒絕輸入。


? ? 數量關系: ?一對一關系
? ? ? ? ? ? ? 多對一關系
? ? ? ? ? ? ? 一對多關系
? ? ? ? ? ? ? 多對多關系


? ? 創建用戶組表:
? ? ? ? create table t_group ( id int not null, name varchar(30), primary key (id) ); ?#只為下面舉例用。


? ? 外鍵約束方式:
? ? 1.級聯(cascade)方式
? ? ? create table t_user ( userid int not null, name varchar(30), groupid int,
? ? ? ? ? ? ?primary key (userid), ?/*定義這表的主鍵 */
? ? ? ? ? ? ?foreign key (groupid) references t_group(id) on delete cascade on update cascade
? ? ? ? ? ? ?/* 上句:定義外鍵,groupid 是 t_group表的 id 字段的外鍵。而且這邊groupid的值對應那邊的id。
? ? ? ? ? ? ? 當t_group表的 id 字段被刪除或修改,這里相應的 groupid 跟著被刪除或修改。級聯刪除、級聯修改。
? ? ? ? ? ? ? 插入時,如果是t_group表的id字段沒有的值,無法插入。參照完整性約束不符。
? ? ? ? ? ? ? 比如 insert into t_user values (3, 'dai', 3); 如果t_group表的id沒有一個是3的,則插入不成功。 */
? ? ? );
? ? ? -- 建完表后的修改寫法(效果同上):
? ? ? ALTER TABLE t_user add FOREIGN KEY(userid) REFERENCES t_group(id) on delete cascade on update cascade;
? ? ? -- 刪除外鍵(key 后面的名稱得看具體情況)
? ? ? ALTER TABLE t_user drop FOREIGN KEY t_user_ibfk_1;


? ? 2.置空(set null)方式
? ? ? create table t_user ( userid int not null primary key, name varchar(30), groupid int,
? ? ? ? ? ? ?foreign key (groupid) references t_group(id) on delete set null on update set null
? ? ? ? ? ? ?/* 插入時,同上。如果是t_group表的id字段沒有的值,無法插入。參照完整性約束不符。
? ? ? ? ? ? ? 當t_group表的 id 字段被刪除或修改,這里相應的 groupid 被設為 null 。 */
? ? ? );


? ? 3.禁止(no action / restrict)方式
? ? ? create table t_user ( id int not null primary key, name varchar(30), groupid int,
? ? ? ? ? ? ?foreign key (groupid) references t_group(id) on delete no action on update no action
? ? ? ? ? ? ?/* 插入時,還是同上。如果參照完整性約束不符則無法插入。
? ? ? ? ? ? ? 當t_group表的 id 字段被刪除或修改,參照這里相應的 groupid,如果這里有引用,則主表不能刪除或修改 */
? ? ? );




外鍵的定義語法:
? ? [CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
? ? ? ? REFERENCES tbl_name (index_col_name, ...)
? ? ? ? [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
? ? ? ? [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
? ? 該語法可以在 CREATE TABLE 和 ALTER TABLE 時使用,如果不指定 CONSTRAINT symbol,MYSQL會自動生成一個名字。
? ? ON DELETE 、 ON UPDATE 表示事件觸發限制,可設參數:
? ? RESTRICT(限制外表中的外鍵改動)
? ? CASCADE(跟隨外鍵改動)
? ? SET NULL(設空值)
? ? SET DEFAULT(設默認值)
? ? NO ACTION(無動作,默認的,作用同 RESTRICT )






范式:
? ? 好處:降低數據冗余;減少完整性問題;標識實體,關系和表
? ? 第一范式(First normal form:1Nf),無重復的列
? ? ? ? ? ? 每一個屬性表示一件事情。所有的屬性都只表示單一的意義,即實體中的某個屬性不能有多個值或者不能有重復的屬性。
? ? ? ? ? ? 如果出現重復的屬性,就可能需要定義一個新的實體,新的實體由重復的屬性構成,新實體與原實體之間為一對多關系。
? ? ? ? ? ? 在第一范式(1NF)中表的每一行只包含一個實例的信息。
? ? ? ? ? ? 說明:第一范式(1NF)是對關系模式的基本要求,不滿足第一范式(1NF)的數據庫就不是關系數據庫。
? ? 第二范式(2N范式),屬性完全依賴于主鍵
? ? ? ? ? ? 最少有一個屬性要求唯一且非空PK,其它跟他有關聯。即要求數據庫表中的每個實例或行必須可以被惟一地區分。
? ? ? ? ? ? 為實現區分通常需要為表加上一個列,以存儲各個實例的惟一標識。
? ? 第三范式(3N范式),非主屬性只能依賴于主屬性,不能依賴于其它非主屬性。
? ? ? ? ? ? 任何字段不能由其他字段派生出來,它要求字段沒有冗余。(解決數據冗余問題,不能存在推理能得出的數據)
? ? 第四范式(4N范式),在一個多對多的關系中,獨立的實體不能存放在同一個表格中
? ? ? ? 表不能包含一個實體的兩個或多個相互獨立的多值因子
? ? 第五范式(5N范式),表必須可以分解為更小的表,除非那些表在邏輯上擁有與原始表相同的主鍵


? ? 說明:第二范式(2NF)是在第一范式(1NF)的基礎上建立起來的,即滿足第二范式(2NF)必須先滿足第一范式(1NF)。
? ? ? ? ?滿足第三范式(3NF)必須先滿足第二范式(2NF)。其它范式以此類推,即必須先滿足前面的所有范式。
? ? ? ? ?一般情況會做到第三范式。




創建表: Create Table 表名
? ? ? ? (字段名1 類型(數據長度)(default ...) 約束條件,
? ? ? ? 字段名2 ?類型(數據長度) 約束條件 );
建表的名稱:
? ? 必須字母開頭;最多30字符;只能使用“A~Z、a~z、0~9、_、$、#”;
? ? 同一目錄下不能有同名的表;表名不能跟關鍵字、特殊含意字符同樣。
? ? 如:create table number_1 (n1 number(2,4), n2 number(3,-1), n3 number);
? ? ? ?create table t_sd0808(id number(12) primary key,name varchar(30) not null);
? ? MySQL的: create table student (oid int primary key, ACTNO varchar(20) not null unique,
? ? ? ?BALANCE double); --MySQL的number類型分小類了,Oracle只有number,且MySQL的數值型不用定大小
? ? Oracle的: create table t_ad (oid number(15) primary key,
? ? ? ?ACTNO varchar(20) not null unique,BALANCE number(20));


建立數據庫: CREATE DATABASE database_name;
定義特定使用者: CREATE SCHEMA;




INSERT:插入(或添加)行到數據庫表中的關鍵字。
? ? 插入方式有以下幾種:插入完整的行;插入行的一部分;插入某些查詢的結果。
? ? 對于INSERT操作,可能需要客戶機/服務器的DBMS中的特定的安全權限。
? ? ?插入行(方式一) ? INSERT INTO tableName VALUES(2008,’TV’,222.22,’US’);
? ? 依賴于表中定義的順序,不提倡使用。有空值時需要自己補上。
? ? ?插入行(方式二) ? INSERT INTO tableName(id,name,price,vend_name) VALUES(2008,’TV’,222.22,’US’);
? ? 依賴于邏輯順序,會自動補上空值,提倡使用。


? ? 插入檢索出的數據:可以插入多條行到數據庫表中
? ? ? ? INSERT INTO products(*,*,*,*)
? ? ? ? SELECT *,*,*,*
? ? ? ? FROM products_copy;
? ? 如果這個表為空,則沒有行被插入,不會產生錯誤,因為操作是合法的。
? ? 可以使用WHERE加以行過濾。


復制表: ? 將一個表的內容復制到一個全新的表(在運行中創建,開始可以不存在)
? ? CREATE TABLE 新表名 ?AS
? ? SELECT *
? ? FROM 表名;


? ? INSERT INTO 與 CREATE TABLE AS SELECT 不同,前者是導入數據,而后者是導入表。
? ? 任何SELECT選項和子句都可以使用,包括WHERE和GROUP BY。
? ? 可利用聯接從多個表插入數據。不管從多少個表中檢索數據,數據都只能插入到單個表中。


更新數據 UPDATE 語句
? ? ? ? ? ? 需要提供以下信息:要更新的表;列名和新值;確定要更新的哪些行的過濾條件。
? ? UPDATE 表名
? ? SET ? ?column_name = expression,
? ? ? ? ? ?prod_name = ‘NEWCOMPUTER’
? ? [WHERE ?search_conditions];
? ? --UPDATE 語句中可以使用子查詢,使得能用SELECT語句檢索出的數據更新列數據。也可以將一個列值更新為 NULL。
? ? 如果沒有用where,則指定列的所有單元格都會設成指定值。


刪除數據 DELETE 語句
? ? DELETE FROM ?table_name
? ? WHERE search_conditions ;
? ? 全行刪除,不要省略WHERE,注意安全。
? ? DELETE不需要列名或通配符。刪除整行而不是刪除列。DELETE是刪除表的內容而不是刪除表。
? ? 如果想從表中刪除所有內容,可以使用 TRUNCATE TABLE 語句 (清空表格),它更快。


數字字典表:
Sequence:排列。存儲物理地址


Index:索引。依附于表,為提高檢索速度。
? ? index(索引)是數據庫特有的一類對象,實際應用中一定要考慮索引,view(示圖)
? ? 復合索引 composite indexes; ? 唯一性索引 unique indexes; ? 群集索引 clustered index;
? ? CREATE ?[UNIQUE] ?INDEX ?index_name ? ON ?table_name (column_name) ;
? ? DROP ?INDEX ?index_name;


View:視圖。看到表的一部分數據。
? ? 限制數據訪問。簡化查詢。數據獨立性。本質上是一個sql查詢語句。
? ? Create[or Relace][Force|noForce] ?View ?視圖名
? ? ? ? ?[(alias[,alias]…)] ? ?別名列表
? ? ? ? As subquery
? ? [With Check Option [Constraint ……]]
? ? [With Read Only]
? ? 注意:有些DBMS不允許分組或排序視圖,不能有 Order by 語句。可以有 Select 語句。
? ? 刪除視圖: ? ?DROP VIEW 視圖名
? ? 如: ?create view Holer_view1 ?AS
? ? ? ? ? ? ? select memid, name, classname, points
? ? ? ? ? ? ? from tb_member
? ? ? ? ? ? ? where ?type = 'student';


? ? ? ? ? ? ? select * from Holer_view1;
? ? ? ? ? ? ? drop view Holer_view1;




Union:合并表
? ? Select … ? Union ? Select… ? ?把兩個Select語句的表合并。
? ? 要求兩表的字段數目和類型按順序對應。合并后的表,自動過濾重復的行。
Intersect:交。 ? ?同上例,把兩個Select表相交。
Minus:減。 ? ? ? ?把相交的內容減去。
not exists ? ? ? ?除運算。




EXISTS : ?對其后面的查詢語句進行“存在性檢查”。有傳回至少一倏記錄,則為“真”。
NOT ?EXISTS : ?上式的反相。
? ? ? ? ? ? ? ? ?在 WHERE 子句里的 EXISTS 關鍵詞會檢查是否有數據符合次查詢的限制條件。
? ? ? 格式:
? ? ? ? ? ? ? ? ?Start ?of ?SELECT, ?INSERT, ?UPDATE, ?DELETE ?statement; ?or ?subquery
? ? ? ? ? ? ? ? ?WHERE ?expression ?comparision_operator ?EXISTS (subquery)
? ? ? ? ? ? ? ? ?[End ?of ?SELECT, ?INSERT, ?UPDATE, ?DELETE ?statement; ?or ?subquery]




修改表結構:Alter Table


添加字段(列):
? ? Alter Table 表名
? ? Add (column dataype [Default expr][Not Null]
? ? ? ? ?[,column datatype]…);
? ? 添加有非空限制的字段時,要加Default語句
? ? 字段名字不可以直接改名,需要添加新字段,再復制舊字段后刪除舊字段。
? ? ? 添加約束: ? ?Alter Table 表名
? ? ? ? ? ? ? ? ? Add [CONSTRAINT constraint] type (column);
? ? 添加非空約束時,要用Modify語句。
? ? 查看約束名時,可以違反約束再看出錯提示;或者查看約束字典desc user_constraints


減少字段:
? ? Alter Table 表名
? ? Drop (column [,column]…);
? ? ? 刪除約束: ? ?Alter Table 表名
? ? ? ? ? ? ? ? ? Drop CONSTRAINT ?column;
? ? ? 或: ? Alter Table 表名
? ? ? ? ? ? Drop ?Primary Key ?Cascade;


暫時關閉約束,并非刪除:
? ? Alter Table 表名
? ? Disable CONSTRAINT ?column ?Cascade;
打開剛才關閉的約束:
? ? Alter Table 表名
? ? Enable ?CONSTRAINTcolumn;


修改字段:
? ? Alter Table 表名
? ? Modify ?(column dataype [Default expr][Not Null]
? ? ? ? ? ? ?[,column datatype]…);
修改字段的類型、大小、約束、非空限制、空值轉換。


刪除表:
會刪除表的所有數據,所有索引也會刪除,約束條件也刪除,不可以roll back恢復。
? ? Drop Table 表名 [Cascade Constraints];
? ? 加 [Cascade Constraints] 把子表的約束條件也刪除;但只加 [Cascade]會把子表也刪除。






改表名:
Rename 原表名 To 新表名;


清空表格:
? ? TRUNCATE TABLE 表名;
? ? 相比Delete,Truncate Table清空很快,但不可恢復。清空后釋放內存。
? ? Delete 刪除后可以roll back。清空后不釋放內存。




事務(交易) Transaction
? ? [begin transaction statement]
? ? ? ?SQL statement
? ? ? ?SQL statement
? ? rollback transaction statement
? ? ? ?SQL statement
? ? commit transaction statement






SQL server創建臨時表:
? select identity(int,1,1) as order_num, * into tem ?from tb_member
? select * from tem ? --"*"需要對應上行的"*",即需對應列
? drop table tem




ORACLE 設置環境變量:
? ?ORACLE_SID=oral10g\ ? ?--變局部變量
? ?export ORACLE_SID ? ? ?--變全局變量
? ?unset ORACLE_SID ? ? ? --卸載環境變量
? ?ORACLE_HOME=... ? ? ? ?--安裝路徑;直接用一句語句也可以,如下
? ?export ORACLE_HOME=/oracledata/.../bin:






修改MySQL的字符集:
? ?安裝目錄下找到“my.ini”,設置“default-character-set=utf8”重啟MySQL生效
? ?可設成:gbk,gb2312,big5,utf8
? ?通過MySQL命令行修改:
? ?mysql> set character_set_client=utf8;
? ?mysql> set character_set_connection=utf8;
? ?mysql> set character_set_database=utf8;
? ?mysql> set character_set_results=utf8;
? ?mysql> set character_set_server=utf8;
? ?mysql> set character_set_system=utf8;
? ?mysql> set collation_connection=utf8;
? ?mysql> set collation_database=utf8;
? ?mysql> set collation_server=utf8;
? ?查看其字符集:show variables like 'character%';


? ?修改數據庫的字符集
? ?mysql>use mydb
? ?mysql>alter database mydb character set utf8;
? ?創建數據庫指定數據庫的字符集
? ?mysql>create database mydb character set utf8; --ft_running_status
? ?查看某表的字符集:show create table 表名;
? ?修改某表的字符集:ALTER TABLE 表名 DEFAULT CHARSET utf8;




?SQL Server 創建用戶
?--建立登錄帳號
? ?sp_addlogin ? userName, password, userdatabase
? ?sp_AddUser 'useName'
?--授權訪問
? ?sp_grantdbaccess ? userName
? --指定權限
? ?grant {all|Insert|......} ?to ?userName
? ?grant select, insert, delete on tableName to userNameOrGroupName --指定到某張表




MySql用戶創建、授權以及刪除
? ? mysql> CREATE USER 用戶名 IDENTIFIED BY '密碼'; ?-- 填上想要的用戶名密碼即可
? ? ?上面建立的用戶可以在任何地方登陸。
? ? ?如果要限制在固定地址登陸,比如localhost 登陸:
? ? mysql> CREATE USER 用戶名@localhost IDENTIFIED BY '密碼';
? ? -- localhost 可換上任意ip地址,“%”表示任意地址


? ? 若需要授權,用 grant:
? ? 格式:grant select on 數據庫.* to 用戶名@登錄主機 identified by "密碼";
? ? 如:mysql> GRANT ALL PRIVILEGES ON *.* TO user;@localhost
? ? 如:mysql> grant select,insert,update,delete on *.* to utest1@"%" Identified by "abc";


? ? 修改密碼:
? ? mysql> grant all privileges on 數據庫.* to utest1@localhost identified by 'mimi';


? ? flush:
? ? mysql> flush privileges;


? ? 查看用戶信息:
? ? mysql> select host,user from mysql.user;


? ? 注:創建用戶時,如果提示“table 'user' is read only”,則需要在控制臺運行:
? ? "安裝目錄下\bin\mysqladmin" -u<用戶名> -p<密碼> flush-tables








查看 oracle 表結構:
? ?1.在 SQLPLUS中,直接用 DESC[ribe] tablename 即可。
? ? ?可要是在外部應用程序調用查看ORACLE中的表結構時,這個命令就不能用了。
? ? ?只能用下面的語句代替:
? ?2.看字段名與數據類型
? ? ? select * from user_tab_columns WHERE TABLE_name = upper('表名'); //查看全部列
? ? ?查看某些列
? ? ? select column_name,data_type,data_length,DATA_PRECISION,DATA_SCALE
? ? ? ? from all_tab_columns where table_name=upper('表名');
? ?3.可以通過 user_constraints 查看所有約束
? ? ? select * from user_constraints where table_name = upper('表名');
? ? ?查看主鍵約束:
? ? ? select * from user_constraints where constraint_type='P' and TABLE_name=upper('表名');


? 在系統表: all_tables / user_tables 中有所有表的信息
? 在系統表: all_tab_columns / user_tab_columns 中有所有表的字段信息


? ? select * from tab/dba_tables/dba_objects/cat;?
? ? 看用戶建立的表 : ?
? ? select table_name from user_tables; ?//當前用戶的表?
? ? select table_name from all_tables; ?//所有用戶的表?
? ? select table_name from dba_tables; ?//包括系統表?
? ? select * from user_indexes //可以查詢出所有的用戶表索引


? ? 查所有用戶的表在 all_tables?
? ? 主鍵名稱、外鍵在 all_constraints?
? ? 索引在 all_indexes?
? ? 但主鍵也會成為索引,所以主鍵也會在all_indexes里面。?
? ? 具體需要的字段可以DESC下這幾個view,dba登陸的話可以把all換成dba




? ? 1、查找表的所有索引(包括索引名,類型,構成列):
? ? select t.*,i.index_type from user_ind_columns t,user_indexes i where t.index_name = i.index_name and t.table_name = i.table_name and t.table_name = 要查詢的表
? ? 2、查找表的主鍵(包括名稱,構成列):
? ? select cu.* from user_cons_columns cu, user_constraints au where cu.constraint_name = au.constraint_name and au.constraint_type = 'P' and au.table_name = 要查詢的表
? ? 3、查找表的唯一性約束(包括名稱,構成列):
? ? select column_name from user_cons_columns cu, user_constraints au where cu.constraint_name = au.constraint_name and au.constraint_type = 'U' and au.table_name = 要查詢的表
? ? 4、查找表的外鍵(包括名稱,引用表的表名和對應的鍵名,下面是分成多步查詢):
? ? select * from user_constraints c where c.constraint_type = 'R' and c.table_name = 要查詢的表
? ? 查詢外鍵約束的列名:
? ? select * from user_cons_columns cl where cl.constraint_name = 外鍵名稱
? ? 查詢引用表的鍵的列名:
? ? select * from user_cons_columns cl where cl.constraint_name = 外鍵引用表的鍵名
? ? 5、查詢表的所有列及其屬性
? ? select t.*,c.COMMENTS from user_tab_columns t,user_col_comments c where t.table_name = c.table_name and t.column_name = c.column_name and t.table_name = 要查詢的表




查看 MySQL 表結構:
? ? desc 表名;
? ? describe 表名;
? ? show columns from 表名;
? ? show create table 表名;
? ? select * from information_schema.columns where table_name='表名';


查看 SQL SERVER 表結構:
? ? SELECT * from ? user_cons_columns;
? ? select COLUMN_NAME from all_cons_columns a, all_constraints b?
? ? ? where a.CONSTRAINT_NAME=b.CONSTRAINT_NAME and b.CONSTRAINT_TYPE= 'P' AND b.TABLE_NAME='你的表名';?




MySQL 注釋符號:
? ? ? ?# ?單行注釋
? ? ? ?-- 單行注釋
? ? ? ?/* ... */ 多行注釋


MySQL 的大小寫的:?
? ? ? MySQL 的查詢默認是不區分大小寫的 如:?
? ? ? ?select * from table_name where a like 'a%'
? ? ? ?select * from table_name where a like 'A%'
? ? ? 效果是一樣的。?


? ? ? 要讓mysql查詢區分大小寫,可以:?
? ? ? ?select * from table_name where binary a like 'a%'
? ? ? ?select * from table_name where binary a like 'A%'
? ? ? 也可以在建表時,加以標識?
? ? ? ?create table table_name(a varchar (20) binary);




MySQL 查詢時使用變量:
? ? 如果查詢時需要用變量,而又不希望用存儲過程,可以直接使用臨時變量(僅本次連結有效)
? ? 變量以“@”開頭,賦值時用“:=”符號; 事先可以不需聲明而直接使用,只是初始值為空
? ? 如: (注意:第一次使用時,值為空,故需要用 ifnull 函數)
? ? ?Select openaccount, iodate, amt as inAmt, 0 as outAmt, @a:=ifnull(@a,0)+amt as _sum?
? ? ? From ev_cash where type=1 and openaccount={?OpenAccount} And iodate between '{?StartDate}' and '{?EndDate}'
? ? ?union
? ? ?Select openaccount, iodate, 0 as inAmt, amt as outAmt, remark, @a:=@a-amt as _sum?
? ? ? From ev_cash where type=2 and openaccount={?OpenAccount} And iodate between '{?StartDate}' and '{?EndDate}'




MySQL 存儲過程:
? ? 一個存儲過程包括名字,參數列表,以及可以包括很多SQL語句的SQL語句集。
? ? 在這里對局部變量,異常處理,循環控制和IF條件句有新的語法定義。
? ? 在5.0以上版本可用存儲過程,檢查版本可用語句: SHOW VARIABLES LIKE 'version'; 或者 SELECT VERSION();
? ? ?
? ? CREATE PROCEDURE procedure1 ? ? ? ? ? ? ? ? ? ? ?/* name 存儲過程名 */
? ? (IN parameter1 INTEGER) ? ? ? ? ? ? ? ? ? ? ? ? ?/* parameters 參數 */
? ? BEGIN ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* start of block 語句塊頭 */
? ? ? ?DECLARE variable1 CHAR(10); ? ? ? ? ? ? ? ? ? /* variables變量聲明, 一定要在開頭的語句 */
? ? ? ?IF parameter1 = 17 or parameter1 > 50 THEN ? ?/* start of IF IF條件開始 */
? ? ? ? SET variable1 = 'birds'; ? ? ? ? ? ? ? ? ? ? /* assignment 賦值 */
? ? ? ? SET variable1 = 'ddd'; ? ? ? ? ? ? ? ? ? ? ? /* assignment 操作語句2,這裡只為模擬 */
? ? ? ?ELSE ??
? ? ? ? SET variable1 = 'beasts'; ? ? ? ? ? ? ? ? ? ?/* assignment 賦值 */
? ? ? ?END IF; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* end of IF IF結束 */
? ? ? ? INSERT INTO table1 VALUES (variable1); ? ? ? /* statement SQL語句 */
? ? END ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* end of block 語句塊結束 */




? ? 最簡單的存儲過程:
? ? CREATE PROCEDURE p1() SELECT * FROM tableName;
? ? 呼叫它: ?CALL p1();?


? ? 注意:
? ? 1. 存儲過程名對大小寫不敏感。
? ? 2.在同一個數據庫不能給兩個存儲過程取相同的名字,否則會導致重載。MySQL還不支持重載(希望以后會支持。)
? ? 3.可以采取“數據庫名.存儲過程名”,如“db5.p1”。存儲過程名可以分開,它可以包括空格符,其長度限制為64個字符
? ? 4.但注意不要使用MySQL內建函數的名字,否則將會出錯。




? ? Pick a Delimiter 選擇分隔符:
? ? ? ? DELIMITER // ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 也可以用“|”或“@”符號 */
? ? ? ? 如果以后要恢復使用“;”(分號)作為分隔符,只需輸入: DELIMITER ;//
? ? 用法如(使用“$$”作為分隔符):
? ? ? ? DELIMITER $$
? ? ? ? drop procedure if exists ff $$?
? ? ? ? CREATE PROCEDURE `ff`()?
? ? ? ? BEGIN?
? ? ? ? ? ? declare i integer; # 臨時變量
? ? ? ? ? ? set i=1;
? ? ? ? ? ? # 循環
? ? ? ? ? ? while i <=10 do?
? ? ? ? ? ? begin?
? ? ? ? ? ? ? ? #操作
? ? ? ? ? ? ? ? set i=i+1; # 遞增量
? ? ? ? ? ? end;
? ? ? ? ? ? end while;
? ? ? ? END $$
? ? ? ? DELIMITER ;$$ ? # 恢復分號作分隔符






MySQL 存儲過程 影響的行數:
? ? select FOUND_ROWS(); ?# select 讀取的行數
? ? select ROW_COUNT(); ? # update delete insert 等操作所影響的行數
? ? 注意:只能在存儲過程中使用,僅能讀取上一次的影響行數




? mysql 執行字符串的sql語句:
? ? mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
? ? mysql> SET @a = 3;
? ? mysql> SET @b = 4;
? ? mysql> EXECUTE stmt1 USING @a, @b;


? ? 沒參數的:
? ? mysql> PREPARE stmt1 FROM 'SELECT * from articalinfo';
? ? mysql> EXECUTE stmt1?
? ??
? ? 執行完的sql刪除的時候用下面的語句:
? ? mysql> DEALLOCATE PREPARE stmt1;?


mysql 創建表時:
? ? ? ? CREATE TABLE tableName (
? ? ? ? ? `item1` date NOT NULL,?
? ? ? ? ? `item2` varchar(50) default NULL, ?
? ? ? ? ? `item3` int(10) unsigned NOT NULL,
? ? ? ? ? PRIMARY KEY ?(`item2`)
? ? ? ? ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
? ? ? ? # ENGINE=MyISAM 表示不支持事務,ENGINE=InnoDB 支持事務。 DEFAULT CHARSET=utf8 默認字符集


windows控制臺執行MySQL:
? ? ? ? 運行 cmd,輸入: 絕對路徑的MySQL安裝目錄\bin\mysql.exe -h192.168.0.133 -uroot -p13726402698
? ? ? ? 有mysql的環境變量時可運行 cmd,輸入: mysql -h192.168.0.133 -uroot -p13726402698
? ? ? ? 參數說明: -h地址(不輸入這個時,默認本機localhost), -u用戶名, -p密碼
? ? ? ? 在安裝目錄下,寫一個“mysql-startup.cmd”的文件,內容為“"bin\mysql" -uroot -proot -h127.0.0.1”,雙擊運行即可


mysql備份與恢復用法
? ? ? ? 運行 cmd,輸入: 絕對路徑的MySQL安裝目錄\bin\mysqldump.exe -h192.168.0.133 -uroot -proot ftc > D:\ftc.sql
? ? ? ? 有mysql的環境變量時可運行 cmd,輸入: mysqldump -h192.168.0.133 -uroot -proot ftc > D:\ftc.sql
? ? ? ? 參數說明: -h地址(不輸入這個時,默認本機localhost), -u用戶名, -p密碼, 數據庫名稱 > 導出文件的路徑和名稱
? ? ? ? 在安裝目錄下,寫一個“mysqldump.cmd”的文件,內容為“"bin\mysqldump" -h127.0.0.1 -uroot -proot ftc > ftc.sql”,雙擊運行即可將“ftc”數據庫導出到當前目錄下


? 詳細說明:
? ? ? ? 1.導出整個數據庫: mysqldump -u用戶名 -p密碼 數據庫名稱 > 導出文件的路徑和名稱
? ? ? ? 2.導出一個表: ? ? mysqldump -u用戶名 -p密碼 數據庫名稱 表名> 導出文件的路徑和名稱
? ? ? ? 3.導出一個數據庫結構: mysqldump -u用戶名 -p密碼 -d --add-drop-table 數據庫名稱 > 導出文件的路徑和名稱
? ? ? ? ? -d 沒有數據 --add-drop-table 在每個create語句之前增加一個drop table
? ?導入數據庫:
? ? ? ? mysql>use 數據庫;
? ? ? ? mysql>source 導出文件的路徑和名稱
? ? ? ? 如:mysql>source d:\wcnc_db.sql




MYSQL的事務處理
? 1、用begin,rollback,commit來實現
? ? ? ?begin ? ?開始一個事務
? ? ? ?rollback 事務回滾
? ? ? ?commit ? 事務確認
? ?2、直接用set來改變mysql的自動提交模式
? ? ? ?MYSQL默認是自動提交的,也就是你提交一個QUERY,它就直接執行!我們可以通過
? ? ?set autocommit=0 ?禁止自動提交
? ? ?set autocommit=1 開啟自動提交
? ?但注意當你用 set autocommit=0 的時候,你以后所有的SQL都將做為事務處理,直到你用commit確認或rollback結束,注意當你結束這個事務的同時也開啟了個新的事務!按第一種方法只將當前的作為一個事務!
? ?MYSQL中只有INNODB和BDB類型的數據表才能支持事務處理!其他的類型是不支持的!(切記!)




判斷空值及轉換:
? ? 下面,如果 orders表的 字段price 為null的話,用0.0替換
? ? SQL Server: select isnull(price,0.0) from orders
? ? Oracle: ? ? select nvl(price,0.0) ? ?from orders
? ? MySQL: ? ? ?select ifnull(price,0.0) from orders
? ? 通用: ? ? ? select if(price is null, 0.0, price) from orders


? ? 另外,判斷條件的 is not null,is null 都一樣
? ? select * from orders where price is not null




實例:
? ? 1. 多重查詢( 基于MySQL )
? ? select count(*) as allNums, sum(isFillIn) as Fillin, sum(if(98Nums=3 or (98Nums=2 and it102 != 0),1,0)) as 98Num3
? ? from (
? ? ? ? select case item298 when 0 then 1 else 0 end isFillIn, case item298 when -2 then 1 else 0 end isSuspend,
? ? ? ? if(isnull(left(a.item250,1)) or ifnull(item298,-2)<>0,0,left(a.item250,1)) as 98Nums
? ? ? ? ?FROM ft_running_status AS a where a.years=98 "
? ? ) f


? ? select '期初餘額' as type, (a.amt + b.amt) as inAmt
? ? from (
? ? ? ? (select if(sum(amt) is null,0, sum(amt)) as amt from ev_cash where type=1 and iodate < '2010/06/26') as a,
? ? ? ? (select if(sum(amt) is null,0, sum(amt)) as amt from ev_atm where tdate < '2010/06/26') as b
? ? )


? ? 2. 找領導: (member表,manager_id表示領導id)
? ? ?select id,last_name from member out where exists (select 'x' from member where manager_id = out.id);
? ? ?或者(效率低點): select id,last_name from member out where id in (select manager_id from member);


? ? 3. IF 條件 ( 僅MySQL 測試過,其他未測試 )
? ? -- 如果 表1 里面有 custid='TW00' 的資料,則只查詢此一筆資料;否則查詢所有資料
? ? select * from 表1 where if(exists (select 'V' from 表1 where custid='TW00'), custid='TW00',1=1 )


? ? 4.將縱列改成橫排:
? ? ? 表tb_score:create table tb_score(memid varchar(20) , classid varchar(20), points numeric(10,2) )


? ? ?select distinct memid,
? ? ? (select points from tb_score where classid='1001' ?and memid=s.memid ) JAVA,
? ? ? (select points from tb_score where classid='1002' ?and memid=s.memid) SQL,
? ? ? (select points from tb_score where classid='1003' ?and memid=s.memid) JSP,
? ? ? (select points from tb_score where classid='1004' ?and memid=s.memid) C
? ? from tb_score s


? ?5. case 用法:
? ? select MEM_ID, NAME, AVGPOINT,
? ? ? (case type when 'student' then '學生' when 'teacher' then '老師' else '其它' end ) 'type',
? ? ? (case when (sex='m') then '男' else '女' end ) as 'sex'
? ? from tb_member


? ? case + count : count里可用條件語句
? ? ?select count(*) as '總數', ?count(case when item248 <= 79 then 1 end) as '79前'
? ? ?from table1 where item248 is not null and item298=0;


? ?6. 一次性更新多筆記錄:
? ? update ft_running_status as f set f.item11 = (select (case e.country when 2 then _utf8'美國'
? ? ?when 3 then _utf8'加拿大' when 4 then _utf8'其他' else _utf8'本國' end)
? ? ?from enterprise as e where e.id=f.item5)


? ?7.多表更新
? ? -- 更新東琳有,中壢也有的貨品,改貨品數量(多表同時update,方便復雜的條件)
? ? update ev_inventory a, ev_inventory b set a.nowqty = a.nowqty+b.nowqty
? ? ? where a.wid='中壢' and a.pid=b.pid and b.wid='東琳';


? ?8.update的select子查詢裡面使用自身表(MySQL)
? ? -- 建立臨時表,因為同一個表沒法在update的select子查詢裡面使用
? ? drop table if EXISTS tem_inventory;
? ? CREATE TABLE tem_inventory ?AS ?SELECT * ?FROM ev_inventory where wid='東琳' or wid='中壢';


? ? -- 更新東琳有,而中壢沒有的貨品,直接改倉庫ID即可
? ? update ev_inventory a set a.wid='中壢' where a.wid='東琳' and a.pid not in(
? ? ? select b.pid from tem_inventory b where b.wid='中壢'
? ? );


? ? -- 刪除臨時表
? ? drop table if EXISTS tem_inventory;


? ?9. MySQL 查詢及刪除重復記錄的方法
? ? 1、查找表中多余的重復記錄,重復記錄是根據單個字段(pId)來判斷(查詢出所有重復的資料)
? ? select * from 表1
? ? where pId in (select pId from 表1 group by pId having count(*) > 1);


? ? 2、刪除表中多余的重復記錄,重復記錄是根據單個字段(pId)來判斷,只留有rowid最小的記錄
? ? delete from 表1
? ? where pId in (select pId from 表1 group by pId having count(*) > 1)
? ? and pId not in (select min(pId) from 表1 group by pId having count(*)>1);
? ? -- 建立唯一鍵來限制也可以,只是會改變表結構
? ? ALTER IGNORE TABLE 資料表 ADD UNIQUE INDEX(欄位1,欄位2);


? ? 3、查找表中多余的重復記錄(多個字段)
? ? select * from 表1 a
? ? where (a.pId, a.seq) in (select pId, seq from 表1 group by pId,seq having count(*) > 1);


? ? 4、刪除表中多余的重復記錄(多個字段),只留有rowid最小的記錄
? ? delete from 表1 a
? ? where (a.pId,a.seq) in (select pId,seq from 表1 group by pId,seq having count(*) > 1)
? ? and rowid not in (select min(rowid) from 表1 group by pId,seq having count(*)>1);


? ? /* 用臨時表來做重復查詢和刪除操作; 方便提高效率以及解決不能同表子查詢刪除的情況 */
? ? -- 原本查詢重復的SQL
? ? select * from music a where (a.moid, a.seqno) in?
? ? ? ?(select moid, seqno from music group by moid, seqno having count(*) > 1);
? ? -- 上面SQL太慢,換用臨時表來做
? ? drop table if exists tem;
? ? create table tem as?
? ? ? ?select min(oid) as oid, moid, seqno from music ?group by moid, seqno having count(*) > 1;
? ? select a.* from music a, tem t where a.moid=t.moid and a.seqno=t.seqno;
? ? -- 刪除錯誤資料
? ? delete from music where (moid, seqno) in
? ? ? ?(select moid, seqno from tem) and oid not in (select oid from tem);
? ? drop table tem;

總結

以上是生活随笔為你收集整理的Oracle + SQL 学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。