1、數(shù)據(jù)庫和****sql**
SQL****的語句種類
DDL
Date define language.數(shù)據(jù)定義語言向叉,用來創(chuàng)建或刪除存儲數(shù)據(jù)用的數(shù)據(jù)庫以及數(shù)據(jù)庫中的表等對象
CREAT
DROP
ALTER
DML
Data manipulation language.數(shù)據(jù)操縱語言,用來查詢或變更表中的記錄嗦董,
Select
Insert
Update
Delete
DCL
Data control language, 數(shù)據(jù)控制語言母谎,用來確認或取消對數(shù)據(jù)的變更,除此之外京革,還可以確定對方是否有操作數(shù)據(jù)庫中對象的權(quán)限奇唤,
Commit
Rollback
Grant
Revoke
基本書寫規(guī)則
語句以****; 英文分號為結(jié)尾;
語句關(guān)鍵字(****select insert****等)不區(qū)分大小寫匹摇;
常數(shù)(字符串咬扇、、數(shù)字)的書寫方式是固定的廊勃;字符串和日期用單引號闊起來懈贺,數(shù)字無需特殊
單詞要用半角空格或者換行分割開來
表的刪除
Drop table <name>
刪除的表格無法恢復(fù)!
查詢數(shù)據(jù)
排序
升序: ORDER BY score 例如按照成績從低到高進行排序:
降序: ORDER BY score DESC 成績從搞到低進行排序
ORDER BY語句要放到WHERE 語句后面
分頁查詢
使用****LIMIT <M> OFFSET <N>****可以對結(jié)果集進行分頁坡垫,每次查詢返回結(jié)果集的一部分梭灿;
分頁查詢需要先確定每頁的數(shù)量和當前頁數(shù),然后確定****LIMIT****和****OFFSET****的值冰悠。
M表示每頁多少行(取M行數(shù)據(jù))堡妒,N表示從第幾條記錄開始取數(shù)據(jù)
聚合查詢
SELECT COUNT(*) FROM students; 查詢students表有幾行
SQL還提供了“分組聚合”的功能:GROUP BY
按照class_id分組:SELECT COUNT(*) num FROM students GROUP BY class_id;
1班、2班溉卓、3班分別有幾個人
修改語句
插入 insert into ……****()values():
在一個表中插入一條記錄皮迟;也可以一次性添加多條記錄
INSERT語句的基本語法是:
INSERT INTO <表名> (字段1, 字段2, ...) VALUES (值1, 值2, ...);
例如,我們向students表插入一條新記錄桑寨,先列舉出需要插入的字段名稱伏尼,然后在VALUES子句中依次寫出對應(yīng)字段的值:
INSERT INTO students (class_id, name, gender, score) VALUES (2, '大牛', 'M', 80);
添加多條記錄
Update 更新數(shù)據(jù)
UPDATE <表名> SET 字段1=值1, 字段2=值2, ... WHERE ...;
set****后面是更改的內(nèi)容;update的表名是指更新哪張表尉尾;where是從整張表中篩選的條件烦粒;****不接where的話,整張表的字段都會被更新成set的內(nèi)容
當where篩選出來的內(nèi)容是多個記錄時代赁,update可以同時更新多條內(nèi)容扰她;
Delete****刪除數(shù)據(jù)
Delete from <****表名> WHERE
where****篩選出條件,delete 刪除符合條件的記錄芭碍;
如果不接where那么整張表的數(shù)據(jù)都會被刪除徒役!會得到空表;
Caution:
WHERE 語句篩選條件時 and 和or可以組合用窖壕,但是邏輯會默認先執(zhí)行AND語句再執(zhí)行OR語句忧勿。因此如果想要先執(zhí)行OR語句就需要將要執(zhí)行的OR語句用圓括號括起來杉女!
圓括號較AND和OR有更高的計算次序!鸳吸!
操作符 in
用來制定條件范圍熏挎;in的用法類似于OR;條件用圓括號括起來晌砾,每個條件用逗號分割開來坎拐;
操作符not
not****操作符要放在where語句的條件的前面,用來否定跟在它之后的條件养匈!
使用通配符進行過濾
LIKE 操作符
%****通配符(匹配0個或者多個字符)
%表示任意字符出現(xiàn)的任意次數(shù)哼勇;注意搜索中有的是可區(qū)分大小寫的,這種情況下'fish%'搜索不出來 ‘Fish bean……’
_****下劃線通配符(匹配單個字符呕乎,不能為0個积担,也不能更多)
_只能匹配單個字符
[]****方括號通配符****(****只能在字符集中匹配唯一的一個字符,表示OR的關(guān)系猬仁,有點類似IN的使用****)
https://www.cnblogs.com/cherrysu/p/8023371.html
親測:文中的like '[JM]%' 對于MYSQL不管用帝璧,搜索不出來!湿刽!參照上述網(wǎng)頁鏈接進行修改聋溜!
[]用來指定一個字符集,他必須匹配指定位置(通配符位置)的一個字符叭爱;
需要否定的關(guān)系時撮躁,用^否定;
如非必要买雾,盡量不使用通配符0崖;
mysql****表達式
01 基本字符匹配
與like使用方式相近 REGEXP 后面跟的東西作為正則表達式
Select prod_name from product
Where prod_name regexp '1000'
Like 語句中漓穿,使用_下劃線通配符作為單個字符通配符嗤军,正則表達式則使用'.' 英文半角字符句號作為單個字符匹配
Select prod_name from product
Where prod_name regexp '.000'
02 進行or匹配
'|'豎線表示or,1000或2000晃危,可以匹配兩個以上的OR條件
Select prod_name from product
Where prod_name regexp '1000|2000'
03 匹配幾個字符之一
Select prod_name from product
Where prod_name regexp '[123] ton'
表示匹配 1ton 叙赚、2ton、或者3ton
與'|'相近僚饭,但不能寫成1|2|3ton震叮,sql會理解為1或2或3ton
但是[123]表示除123外的任何字符,[]中加上表示否定
04 匹配范圍
[0123456789] = [0-9]
0123 = [0-3]
[a-z]匹配任意字母
05 匹配任意字符
由于. | - 在正則表達式中有特殊含義鳍鸵,因此如果需要查找字符'.|-'需要加上\ 苇瓣;如果需要查找\則要寫成\\
[\也用來引用元字符](file://也用來引用元字符)
元字符 | 說明 |
---|---|
[\f](file://f) | 換頁 |
\n | 回車 |
06 匹配字符類
字符類 (character class)
07 匹配多個實例
09 定位符
元字符 | 說明 |
---|---|
^ | 文本的開始 |
$ | 文本的結(jié)尾 |
[[:^:]] | 詞的開始 |
[[:>:]] | 詞的結(jié)尾 |
7、創(chuàng)建字段
01 計算字段
02 拼接字段
拼接(Concatenate):將值連接到一起偿乖,構(gòu)成單個值击罪;
操作符 '+' ||
select vend_name || ' ( ' || vend_country || ' )' from Vendors order by vend_name;
經(jīng)過實際操作哲嘲,MYSQL顯示了六行0值,并未向書上的一樣兩個字段拼接媳禁;
Mysql需要 用函數(shù)concat:
select concat (vend_name, ' ( ' ,vend_country,' )' ) as vend_namecontry from Vendors order by vend_name;
As vend_namecontry****眠副;更名;
別名可以時一個單詞也可以是一個字符串竣稽,但是字符串應(yīng)當使用半角單引號引起來囱怕;
1****、格式化#
(1)拼接字段||(oracle和sqlite等使用) 或+(sql server和access使用):如:select name+'('+price+')' from product;輸出形如: apple (3.2)
(2)mysql使用函數(shù)concat丧枪,如****select concat(name,'(',price,')' )from product;
(3)別名:as
來自 <https://www.cnblogs.com/Qi-Lin/p/11334021.html>
03 執(zhí)行算數(shù)計算
select prod_id,
quantity,
item_price,
quantity*item_price as expanded_price #計算兩個字段相乘并命名為expanded_price
from Orderitems where order_num =20008;
sql的運算操作符:+光涂、-庞萍、*拧烦、/ 分別是加、減钝计、乘恋博、除
8****、使用函數(shù)**
01 函數(shù)
每個DBMS數(shù)據(jù)庫管理系統(tǒng)都有自己的函數(shù)私恬;由于SQL語句不同债沮,SQL函數(shù)是不可移植的;
使用函數(shù)時本鸣,應(yīng)當做好代碼注釋疫衩,以便他日可以確切知道函數(shù)的意義;
02 使用函數(shù)
(1)·文本處理**
版權(quán)歸作者所有荣德,任何形式轉(zhuǎn)載請聯(lián)系作者闷煤。
作者:ohYogi(來自豆瓣)
來源:https://www.douban.com/note/666299969/
返回數(shù)字的字符串函數(shù)
instr****(字符串,‘-’) 返回‘-’在字符串中的位置
position() 給字符串定位涮瞻,返回結(jié)果為數(shù)值鲤拿,當?shù)玫降亩ㄎ粸?時,表示不存在該值署咽;(類似VBA中的instr)
select position('characters' in vchar_fld) from string_tbl;
locate() 接受第三個參數(shù)近顷,指定搜索起始位置;類似position宁否,函數(shù)內(nèi)容不太一樣窒升,直接逗號隔開,不用IN
select locate('is', vchar_fld,2) from string_tbl;
#表示從第二個字符開始查找慕匠,但是返回的值是在整個字符串中的位置异剥,不會減2
strcmp() 比較同一字段中兩個字符串的位置大小; strcmp 對大小寫不敏感
返回 -1,如果第一個字符串位于第二個字符串之,前絮重;
返回 0冤寿,兩個相同歹苦;
返回 1,第一個位于第二個之后督怜;且此函數(shù)不區(qū)分大小寫殴瘦;類似功能可用 ‘like'、‘regexp’操作符完成号杠;
select strcmp('12345','12345') 12345_12345 ,
strcmp('abcd','xyz') abcd_xyz,
strcmp('qrstuv','QRSTUV') qrstuv_QRSTUV ;
結(jié)果如下圖蚪腋,函數(shù)后面不需要接 from [table]:表明大小寫位置等同
返回字符串的字符串函數(shù)
內(nèi)建函數(shù):
concat() 連接字符串的內(nèi)建函數(shù),可用連接操作符 || 或者連接字符 + 替代姨蟋;
insert() 插入功能屉凯,參數(shù)為:(原始字符串、開始位置眼溶、替換的字符數(shù)悠砚、替換字符串);
從第二參數(shù)的位置開始插入或替換
第三參數(shù)為0堂飞,則表示插入灌旧;
第三參數(shù)大于0,比如5绰筛,則表示 相應(yīng)的字符數(shù)被新字符代替枢泰;
select insert('goodbye world',9,3,'cruel '); 不需要接from[table];
select insert('goodbye world',9,0,'cruel ');
replace() 搜索替換所有實例,慎用铝噩;
select replace('goodbye world','goodbye','hello');
可能不止替換了 goodbye world中的goodbye衡蚂;
substring() 從字符串中提取字符串,參數(shù):‘字符串’骏庸,開始位置毛甲,提取字符數(shù);
截取字符串中的子串敞恋,不需要接from[table];
select substring('nihao nikuailema',9,6);
cell() 向上取整丽啡;
floor() 向下取整;
round() 四舍五入取整硬猫,第二個可選參數(shù)表示保留小數(shù)點位數(shù)补箍;
truncate() 簡單地抹去不需要的小數(shù)位,不進行四舍五入啸蜜;
Pow(2,8)第一個參數(shù)的第二個參數(shù)冪次方 2^8
Select pow(2,8); 輸出256
Mysql 可以將半角單引號作為轉(zhuǎn)義符坑雅,如:句子中存在 don''t,
SQL****中可以使用斜杠\作為 作為轉(zhuǎn)義符衬横,如:don\'t
select @@session.sql_mode; #修改為警告模式
set sql_mode = 'ansi';
/*quote可以將整個字符串包含起來裹粤,
并為字符串本身的單引號增加轉(zhuǎn)義符*/
select quote(text_fld) from string_tbl;
/*char中存放字符串是使用空格向右補齊的,MYSQL在獲取數(shù)據(jù)時蜂林,會刪除char類型數(shù)據(jù)的尾端空格遥诉,因此無論存放的數(shù)據(jù)為何種類型拇泣,該字符串函數(shù)得到的結(jié)果都是相同的;下例子中char列的字符數(shù)設(shè)定為30矮锈,但運行結(jié)果為28 */
select length(char_fil),length(vchar_fld),length(text_fld) from string_tbl;
用于處理文本串(刪除或填充值霉翔,轉(zhuǎn)換值為大寫或者小寫)的文本函數(shù)
文本函數(shù) | 說明 |
---|---|
left() | 返回串左側(cè)字符 |
right() | 返回串右邊字符 |
lower() | 將串轉(zhuǎn)換為小寫(access用Lcase()) |
upper() | 將串轉(zhuǎn)換為小寫(access用Ucase()) |
Ltrim() | 去掉串左邊的空格 |
Rtrim() | 去掉串右邊的空格 |
right() | 返回串右邊的字符 |
soundex() | 返回串的soundex值 對串的發(fā)音進行比較,可以返回發(fā)音類似的值 |
select cust_name, cust_contact from Customers
where soundex(cust_contact) = soundex('MICHAel green');
尋找讀音接近 Michael green的數(shù)據(jù)苞笨;
(2) 日期和時間處理函數(shù)
用于處理日期债朵、時間值并從這些值中提取特定成分(如返回兩日期只差,檢查日期有效性等)的日期和時間函數(shù)瀑凝;
每個數(shù)據(jù)從處理系統(tǒng)的日期處理函數(shù)各不相同序芦,需要因地制宜;
函數(shù) | 數(shù)據(jù)庫 |
---|---|
datepart(yy, date) | SQL sever |
sybase' | access |
year(date) | MySQL |
Date_part(yyyy粤咪,date) | postgreSQL |
To_number( to_char(date,yy)) | Oracle |
MYSQL中常用的日期和時間處理函數(shù)
函數(shù) | 說明 |
---|---|
AddDate() | 增加一個日期(天谚中、周等) |
ADDtime() | 增加一個時間(時、分等) |
Curdate() | 返回當前日期 |
CURtime() | 返回當前時間 |
date() | 返回日期時間的日期部分 |
datediff() | 計算兩個日期之差 |
Date_add() | 高度靈活的日期運算函數(shù)可以為指定日期增加任意一段時間間隔(年射窒、月藏杖、天)将塑,并產(chǎn)生另外一個日期脉顿,時間間隔類型如下表: |
Date_format() | 返回一個格式化的日期或者時間串 |
day() | 返回一個日期的天數(shù)部分 |
dayofmonth() | 對于一個日期,返回對應(yīng)的該月的第幾天 |
dayofyear() | 對于一個日期点寥,返回對應(yīng)的該年好的好的艾疟,嗯,謝謝敢辩!的第幾天 |
dayof() | 對于一個日期蔽莱,返回對應(yīng)的該周的第幾天,默認星期日為一周的開頭戚长, |
Hour | 返回時間的小時部分 |
Minute | 返回時間的分鐘部分 |
Now | 返回當前的日期和時間 |
Second | 返回一個時間的秒部分 |
Time | 返回一個日期時間的時間部分 |
Year | 返回一個日期的年份部分 |
Month | 返回一個日期的月份部分 |
Last_day(日期) | 返回一個日期所在月份的最后一天盗冷, |
select datediff(current_date(),last_day(current_date())); | 計算當前到月底剩余的天數(shù), |
dayname() | 返回日期是星期幾 |
select datediff(current_date(),last_day(current_date())); | 計算當前到月底剩余的天數(shù)同廉, |
Str_to_date 函數(shù)(‘字符串’仪糖,‘日期格式’)他的第2個參數(shù)指明了帶轉(zhuǎn)換字符串的日期格式,
如 str_to date('September 17,2008' ,'%M %d, %Y)
日期格式部件迫肖,
格式部件 | 描述锅劝, |
---|---|
%M | 月名稱(1月~12月), |
%m | 月序號(01~12)蟆湖, |
%d | 日序號(01~31)泪掀, |
%j | 日在一年中的序號(001~366)论巍, |
%w | 星期名稱,星期日~星期六回季, |
%Y | 4位數(shù)字表示的年份, |
%y | 兩位數(shù)字表示的年份仿耽, |
%H | 小時00~23, |
%h | 小時01~12 |
%i | 分鐘00~59, |
%s | 秒鐘00~59痹籍, |
%f | 微秒,000000~999999. |
%p | A.m.或P.M. |
常用的時間間隔類型晦鞋,
間隔名稱 | 描述蹲缠, |
---|---|
Second | 秒數(shù) |
Minute | 分鐘數(shù), |
hour | 小時數(shù)悠垛, |
Day | 天數(shù)线定, |
Month | 月好,份 |
Year | 年份确买, |
Minute_second | 分鐘數(shù)和秒數(shù)中間用":"隔開斤讥, |
hour_second | 小時數(shù)、分鐘數(shù)和秒數(shù)湾趾,中間用":"隔開芭商, |
Year_month | 年份和月份中間用“-”隔開, |
9搀缠、匯總數(shù)據(jù)
01 聚集函數(shù)
聚集函數(shù)即:運行在行組上铛楣,計算和返回單個值的函數(shù);
匯總數(shù)據(jù)艺普,而非返回數(shù)據(jù)本身簸州;
sql的五個聚集函數(shù)
函數(shù) | 說明 |
---|---|
AVG() | 返回某列的平均值 |
COUNT() | 返回某列的行數(shù) |
MAX() | 返回某列的最大值 |
min() | 返回某列的最小值 |
sum() | 返回某列之和 |
·AVG()函數(shù)
求列的和的平均值;
·count()函數(shù)
表中行的數(shù)目或者符合特定條件的行的數(shù)目歧譬。
count的兩種使用方式:
01 使用count(*) 對表中行的數(shù)目進行計數(shù)岸浑,不管時否有null值,都計算在內(nèi)瑰步!
02 使用count(column)對特定的列中具有值的行進行計數(shù)矢洲,null值不計!
· max和min分別表示最大和最小
·sum(column)函數(shù)
用來返回指定列值的和缩焦。
也可用來合計計算值读虏;
02 聚集不同的值
對所有行執(zhí)行,指定參數(shù)或者不給參數(shù)
只包含不同的值舌界,指定 DIStinct參數(shù)(distinct 去掉重復(fù)值或者重復(fù)行)掘譬;
03 組合聚集函數(shù)
可以組合來用
10、分組數(shù)據(jù)(group by呻拌,having)**
01 數(shù)據(jù)分組
針對特定的字段進行分組葱轩;
02 創(chuàng)建分組
Group by的使用規(guī)定
· group by,可以包含任意數(shù)目的列,使得可以對分組進行嵌套靴拱;
例句:
select product_cd, open_branch_id,
sum(avail_balance) tat_balance
from account
group by product_cd,open_branch_id with rollup;
With rollup****和****with cube
上例中:假設(shè)需要在為每種產(chǎn)品支行組合計算合計余額的同時垃喊,還需要為每種產(chǎn)品單獨計算合計數(shù),那么就要使用 with rollup. 如果處理計算產(chǎn)品合計還需要為每個支行進行計算合計的話可以使用 with Cube 選項袜炕,但是 Mysql 不支持 with cube 只有 sql serve R和 oracle 數(shù)據(jù)中可用本谜。
03 過濾分組
where過濾行;having過濾分組偎窘;
where在數(shù)據(jù)分組前進行過濾乌助;having在數(shù)據(jù)分組后進行過濾;
下圖是各個語句的執(zhí)行順序:
·先根據(jù)where的條件過濾陌知,
·再根據(jù)GROUPBY的條件進行分組他托;
·計算分好的組的 行數(shù);
·過濾并選擇行數(shù)>=2 的分組出來仆葡!
04 分組和排序
Order by 可以使用未被選擇的列進行排序赏参;
Group by 只能使用選擇列或者表達式列,而且必須使用每個選擇列表達式沿盅;
05 Select 子句順序
Select
From
Where
Group by
Having
Order by
Limit(要檢索的行數(shù)把篓??腰涧?)
11韧掩、使用子查詢
01 子查詢
嵌套在其他查詢中的查詢;
關(guān)聯(lián)子查詢
關(guān)聯(lián)語句 WHERE y.continent=x.continent
的條件下先從select語句中選取 area南窗,然后逐條判斷揍很,符合條件的列出郎楼,不符合條件的省略万伤,
關(guān)聯(lián)子查詢與非關(guān)聯(lián)子查詢不同的是,他并不是在包含語句執(zhí)行之前一次執(zhí)行完畢呜袁,而是為每一個候選行執(zhí)行一次敌买,
非關(guān)聯(lián)子查詢
非關(guān)聯(lián)查詢可以單獨執(zhí)行,而不需要引用包含語句中的任何內(nèi)容阶界,
多行單列:
注意虹钮,如果在等式條件下使用子查詢,而子查詢又返回多行膘融,結(jié)果那么將會出錯芙粱,因為單一的事物不能等于多個事物的結(jié)合;情況可以用以下幾種方式氧映,
In 或者 not in in運算符被用于查看能否在一個表達式集合中找到某一個表達式春畔,
如果對此查詢返回的重復(fù)性感到困擾,那么可以對子查詢的select語句中增加關(guān)鍵字distinct,并且不會改變包含查詢的結(jié)果集律姨。
select emp_id,lname,fname from employee where emp_id not in
(select distinct superior_emp_id from employee
where superior_emp_id is not null);
上述例子查詢檢索所有不管理別人的雇員振峻,
all運算符,all運算圖則用于將某單值與集合中每個值進行比較择份,構(gòu)建這樣的條件扣孟,需要將其中一個比較運算符與all運算符配合使用
select emp_id,lname,fname from employee where emp_id <> all
(select distinct superior_emp_id from employee
where superior_emp_id is not null);
-- 與上述例子的不同是將not in改成了<> all,
當用數(shù)值比較時荣赶,all運算符相較于in運算符更方便凤价;
例如:查找可用余額小于Frank Tucker的所有賬戶的賬戶,
SELECT account_id,cust_id,product_cd,avail_balance from account
where avail_balance < all (select a.avail_balance from account a
inner join individual i on a.cust_id = i.cust_id
where i.fname='Frank' and i.lname ='Tucker') ;
any****運算符拔创,與all不同的是料仗,any 運算符只要有一個比較成立,那么條件為真伏蚊,all運算符是只有與集合中所有成員比較都成立時條件才為真
any的這一特性可以用來查找可用余額大于Frank Tucker任意賬戶的所有賬戶
SELECT account_id,cust_id,product_cd,avail_balance from account
where avail_balance > any (select a.avail_balance from account a
inner join individual i on a.cust_id = i.cust_id
where i.fname='Frank' and i.lname ='Tucker') ;
多列子查詢
select account_id, product_id ,cust_id
from account
where (open_branch_id, open_emp_id) in
(select b.branch_id,e.emp_id
from branch b
inner join employee e on b.branch_id = e.branch_id
where b.name = 'Woburn Branch'
and (e.title = 'Teller' or e.title = 'Head Teller'));
檢索Woburn支行的Id及所有銀行柜員的Id立轧,同時包含查詢使用這個信息,查找所有Woburn分行柜員開立的賬戶躏吊,
02 利用子查詢進行過濾
可以根據(jù)select進行嵌套氛改;
根據(jù)where in的嵌套;
03 作為計算字段使用子查詢
select cust_name,cust_state, (select count(*) from orders where orders.cust_id =customers.cust_id) as orders from customers order by cust_name;
子句中的where與通常的where語句有所不同比伏,它使用了完全限定列名(胜卤??赁项?)葛躏,上面的語句告訴sql比較orders表中的cust_ID,與當前正從customer表中的檢索的cUst_Id悠菜,
涉及外部查詢的子查詢:叫做“相關(guān)子查詢”舰攒;
12、聯(lián)結(jié)表
Sql是一種非過程化的語言悔醋,他只需要描述要獲取的數(shù)據(jù)庫對象摩窃,而如何以最好的方式執(zhí)行查詢,則由數(shù)據(jù)庫服務(wù)器負責芬骄,因此猾愿,在from子句中各表出現(xiàn)的順序并不重要,
創(chuàng)建連接:
連續(xù)兩次使用同一張表(SQL學習指南)账阻;
如果需要在結(jié)果集合中包含這兩個支行的名稱蒂秘,就需要在from子句中兩次引用branch表,一次與employee表連接淘太,另一次與account表聯(lián)結(jié)姻僧,
為了使他正常工作观挎,給每個branch表的實例定義不同的別名,以便服務(wù)器能夠在各自之中正確的引用他們段化,
例如:下列例子中分別將branch表命名為b_a和b_e嘁捷,以表明它和兩個不同表的聯(lián)結(jié),并起名為不同的名字显熏,
select a.account_id, e.emp_id,
b_a.name open_branch, b_e.name emp_branch
from account a inner join branch b_a
on a.open_branch_id = b_a.branch_id
inner join employee e on a.open_emp_id = e.emp_id
inner join branch b_e on e.assigned_branch_id = b_e.branch_id
where a.product_cd = 'CHK';
自聯(lián)結(jié)雄嚣;
不僅可以在同一查詢中多次包含同一表,還可以對表自身進行連接喘蟆,下面的例子中缓升,是一個在查詢中需要定義表別名的例子,否則服務(wù)器將無法確定連接條件中所指代的是雇員還是雇員的主管蕴轨,
例如:e和e_s都是employee的別名
select e.fname, e.lname, e_s.fname as superior_fname,
e_s.lname as superior_lname
from employee e inner join employee e_s
on e.emp_id = e_s. superior_emp_id;
相等聯(lián)結(jié)和不相等聯(lián)結(jié)
大多數(shù)查詢是相等連接港谊,但有時也可以通過限定值的范圍實現(xiàn)代表的連接,即不等連接橙弱;
上面例子查詢連接的兩個表并沒有外鍵關(guān)聯(lián)歧寺,他的意圖是找出所有在no-fee cheking產(chǎn)品存續(xù)期間入職的銀行雇員,
例如:
select e.emp_id,e.fname,e.lname,e.start_date
from employee e inner join product p
on e.start_date >= p.date_offered
and e.start_date <=p.date_retired
where p.name = 'no-fee cheking';
例子2:
select e1.fname ,e1.lname, 'VS' as vs , e2.fname,
e2.lname
from employee e1 inner join employee e2
on e1.emp_id < e2.emp_id
where e1.title = 'Teller' and e2.title ='Teller';
例子2中是一個不等自連接的例子棘脐,假如執(zhí)行經(jīng)理決定舉辦一次面向銀行柜員的象棋錦標賽斜筐,那么需要創(chuàng)建所有對弈者的列表,這就需要為所有的柜員進行employee表的自連接并返回emp_id不同的行蛀缝,因為柜員無法和自己下棋
14顷链、組合查詢
·Union 類似于OR ,表示并集
Union****和where語句會從查詢結(jié)果中自動去除重復(fù)行屈梁;如果想要返回所有匹配行(不去除重復(fù)行)嗤练,可以使用union all;
·排序:
Order by 語句只能出現(xiàn)在最后一條select語句之后在讶;不允許使用多條order by 語句煞抬;
15、數(shù)據(jù)插入
01 數(shù)據(jù)插入
插入完整行
Insert into 表名(field 1,field 2……) Values( 值1真朗,值2此疹,……)
如果是完整行,可以不用寫字段遮婶,只需要把相應(yīng)的值錄進去就可以了,如果某一列沒有值用null代替湖笨;
值的順序要和字段的順序相一致旗扑,字段順序可以不必和表中字段順序相同;
盡量不使用沒有明確給出列的列表的insert語句
插入行的一部分
插入部分行時慈省,省略的列必須滿足以下幾個條件:
第一該列定義為允許空值臀防,
或者在表定義中給出默認值,表示如果不給出空值將使用默認值;
如果不滿足這兩個條件袱衷,那么插入行不成功
插入某些查詢結(jié)果
插入檢索出的數(shù)據(jù) insert select
將cust_new中的數(shù)據(jù)插入到customers里面
INSERT SELECT中的列名為簡單起見捎废,這個例子在INSERT和SELECT語句中使用了相同的列名。但是致燥,不一定要求列名匹配登疗。事實上,DBMS甚至不關(guān)心SELECT 返回的列名嫌蚤。它使用的是列的位置辐益,因此SELECT中的第一列(不管其列名)將 用來填充表列中旨定的第一個列,第二列將用來填充表列中指定的第二個列脱吱,此等等智政。
INSERT SELECT中 SELECT語句可包含whERE子句以過濾插入的數(shù)據(jù)。
插入多行 iNSERT通常只插入一行箱蝠。為了插入多行续捂,必須執(zhí)行多個INSERT語句,INSERT SELECT是個例外宦搬,它可以用單條iNSERT插入多行疾忍,不管SELECT語句返回多少行,都將被INSERTE入床三。
02 從一個表復(fù)制到另一個表
講一個表的內(nèi)容復(fù)制到一個全新的表格一罩;
可以使用select into 語句
Insert select
與 select into
他們之間的一個重要差別是前者導出數(shù)據(jù),而后者導入表撇簿,
比如:
select * into custcopy from customers;
MYSQL用法與oracle稍微不一樣:
create table custcopy as
select *
from customers;
select可以聯(lián)結(jié)多個表插入數(shù)據(jù)聂渊;
不管從多少個表中檢索數(shù)據(jù),數(shù)據(jù)都只能插入到單個表中四瘫;
16汉嗽、更新和刪除數(shù)據(jù)**
01 更新數(shù)據(jù)
UPDATE(更新表中特定的行 更新表中所有行,)
使用where子句的時候找蜜,會更新where篩選出來的行饼暑,
不使用where的時候會更新所有的行!
因此使用update語句的時候洗做,一定要注意跟上****where弓叛,
Update <表名> set 字段名 = '', 字段名 = '', where
可以更新一個字段或者多個字段诚纸;
02 刪除數(shù)據(jù) delete
同一個表中刪除特定的行撰筷,
從一個表中刪除所有行,
請同樣記得畦徘,不要省略where子句毕籽,因為省略where子句后會刪除所有行抬闯!
Delete 刪除的是整行,刪除表的內(nèi)容关筒,而非表本身溶握;
Delete from <表名> where……
要刪除所有行可以使用TRUECATE table語句,刪除速度更快
03 更新和刪除的指導原則
17蒸播、創(chuàng)建和操縱表
01 創(chuàng)建表
Create table睡榆,或者select into
Create table 表名
(字段1,數(shù)據(jù)類型廉赔,約束條件(not null)肉微,
字段2,數(shù)據(jù)類型蜡塌,約束條件(not null))碉纳;
例如:
create table orderitems01
(
order_num integer not null,
order_item integer not null,
prod_id char(10) not null,
quantity integer not null default 1,
item_price decimal(8,2) not null
);
約束條件為空,則表示'null'馏艾,即:可以是空值劳曹;
主鍵不能為允許空值的字段~,當約束非空字段沒有填入值時琅摩,會填入設(shè)置的default值铁孵,默認值;
02 更新表
Alter table用來增刪列
- 增加列:
Alter table <表名>
Add vend_phone char(20;)
- 刪除列:
Alter table <表名>
Drop Column vend_phone;
warning****:增加列或者刪除列時房资,要注意備份數(shù)據(jù)蜕劝,以免增刪后無法更改!!
能不能重命名列?轰异?
03 刪除表
Drop table <表名>
warning****:刪除表執(zhí)行語句無需確認即可刪除岖沛,刪除后不能撤銷,即:無法UNDO 4疃馈婴削!
04 重命名表
DB2、MYSQL牙肝、Oracle唉俗、postgreSQL用戶使用 Rename table;
SQLserver 和sybase使用 sp_rename存儲過程
無一例外要提供更名前的表名和更名后的表名
例如:將表A\C\E更名為表B\D\F
Rename Table <表名A> TO <表名B>配椭,
<表名C> TO <表名d>虫溜,
<表名e> TO <表名F>;
Rename 可以一次改多個表名颂郎;
18吼渡、使用視圖
01 視圖
02 使用視圖
·視圖的創(chuàng)建和刪除,
視圖用create view語句來創(chuàng)建乓序;
使用show create view viewname寺酪;來查看創(chuàng)建視圖的語句,
用drop刪除視圖替劈,語法為寄雀,
Drop view viewname.
更新試圖時可以先用drop,再用create陨献;也可以直接用create or replace view盒犹。如果要更新的視圖不存在,
則第2條更新語句會創(chuàng)建一個視圖眨业,如果要更新的視圖存在急膀,那么第2條語句會替換原有視圖;
·利用視圖簡化復(fù)雜的聯(lián)結(jié):
create view productcustomers as #創(chuàng)建視圖
select cust_name,cust_contact, prod_id
from customers, orders,orderitems
where customers.cust_id= orders.cust_id
and orderitems.order_num = orders.order_num;
使用視圖
select cust_name, cust_contact
from productcustomers where prod_id = 'BR01'龄捡;
視圖極大簡化了復(fù)雜的SQL語句卓嫂,在上述使用視圖查詢中,它將制定的 WHERE 語句添加到已有的 where 字句之中聘殖,以便正確過濾數(shù)據(jù)晨雳,
001 用視圖重新格式化檢索出的數(shù)據(jù),
要這個格式的結(jié)果奸腺,不必在每次需要時執(zhí)行聯(lián)結(jié)餐禁,創(chuàng)建一個視圖,每次需要時使用它即可突照!
例如
create view vendlocation as
select concat(vend_name,'(',vend_country,')') as vend_title
from vendors order by vend_name;
select * from vendlocation;
002用視圖過濾不想要的數(shù)據(jù)帮非,
視圖對于應(yīng)用普通的where子句也很有用,例如可以定義customerEMAILlist視圖讹蘑,它過濾沒有電子郵件地址的客戶末盔。
例如:
create view custemaillist as
select cust_id,cust_name,cust_email
From customers where cust_email is not null;
發(fā)送電子郵件到郵件列表時,需要排除沒有電子郵件地址的用戶衔肢,這里的where字句過濾了cast EMAIL列中具有null值的這些行庄岖,使他們不被檢索出來,這樣可以像使用其他表一樣使用視圖customer EMAIL list角骤。
003 使用視圖與計算字段隅忿,
視圖對于簡化計算字段的使用特別有用,
例如:
create view orderitemsexpanded2 as
select prod_id,
quantity,
item_price,
order_num,
quantity*item_price as expanded_price
from orderitems;
select * from orderitemsexpanded2 where order_num = 20005;
視圖非常容易創(chuàng)建邦尊,而且很好使用背桐。正確使用的話,視圖可以極大的簡化復(fù)雜的數(shù)據(jù)處理蝉揍。
19链峭、全文本搜索
使用全文本搜索
使用全文本搜索,必須索引被搜索的列又沾,而且要隨著數(shù)據(jù)的改變不斷的重新索引.
在索引之后select可以match和against一起使用以執(zhí)行搜索弊仪;
01 啟用全文本搜索支持
Create table一句接受fulltext的語句熙卡,它給出被索引列的一個逗號分隔的列表,
02 進行全文本搜索
select note_text
from productnotes
where match(note_text)against('rabbit');
rabbit為搜索文本励饵,note_text為指定列驳癌;
03 使用查詢擴展
查詢擴展用來設(shè)法放寬所返回的全文本搜索結(jié)果的范圍,利用查詢擴展能找出可能相關(guān)的結(jié)果役听,即使他們并不精確包含所查找的詞颓鲜;
select note_text
from productnotes
where match(note_text)against('anvils' with query expansion);
04 布爾文本搜索 in boolean mode
可以搜索:
要匹配的詞
要排斥的詞
排列提示
表達式分組
另外一些內(nèi)容
是沒有full text索引也可以使用布爾搜索,只是布爾搜索非常慢典予,
20甜滨、管理事務(wù)處理
事務(wù)處理
并非所有引擎都支持事務(wù)處理,但是InnoDB支持瘤袖;
事務(wù)處理可以用來維護數(shù)據(jù)庫的完整性衣摩,保證成批的SQL操作完全執(zhí)行或完全不執(zhí)行;
事務(wù)(transaction):指一組SQL語句
rollback:指撤銷指定的SQL 語句的過程孽椰;
commit:將未存儲的SQL語句寫入數(shù)據(jù)庫表昭娩;
保留點(savepoint):指事務(wù)處理中臨時設(shè)置的占位符,
你可以對它發(fā)布回退(與回退整個事務(wù)處理不同)黍匾;
臟讀
幻讀
重復(fù)讀