有關(guān)MYSQL的基礎(chǔ)知識

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);

添加多條記錄

image.png

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)容扰她;

image.png

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有更高的計算次序!鸳吸!

image.png

操作符 in

用來制定條件范圍熏挎;in的用法類似于OR;條件用圓括號括起來晌砾,每個條件用逗號分割開來坎拐;

image.png

操作符not

not****操作符要放在where語句的條件的前面,用來否定跟在它之后的條件养匈!

image.png

image.png

使用通配符進行過濾

LIKE 操作符

image.png

%****通配符(匹配0個或者多個字符)

%表示任意字符出現(xiàn)的任意次數(shù)哼勇;注意搜索中有的是可區(qū)分大小寫的,這種情況下'fish%'搜索不出來 ‘Fish bean……’

image.png

_****下劃線通配符(匹配單個字符呕乎,不能為0個积担,也不能更多)

_只能匹配單個字符

image.png
image.png

[]****方括號通配符****(****只能在字符集中匹配唯一的一個字符,表示OR的關(guān)系猬仁,有點類似IN的使用****)

https://www.cnblogs.com/cherrysu/p/8023371.html

親測:文中的like '[JM]%' 對于MYSQL不管用帝璧,搜索不出來!湿刽!參照上述網(wǎng)頁鏈接進行修改聋溜!

[]用來指定一個字符集,他必須匹配指定位置(通配符位置)的一個字符叭爱;

image.png

需要否定的關(guān)系時撮躁,用^否定;

如非必要买雾,盡量不使用通配符0崖;

image.png
image.png

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 回車
image.png

06 匹配字符類

字符類 (character class)

image.png

07 匹配多個實例

image.png

image.png

image.png

09 定位符

元字符 說明
^ 文本的開始
$ 文本的結(jié)尾
[[:^:]] 詞的開始
[[:>:]] 詞的結(jié)尾
正則表達式0.png

正則表達式01.png

7、創(chuàng)建字段

01 計算字段

image.png

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)當使用半角單引號引起來囱怕;

image.png

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

image.png

來自 <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]:表明大小寫位置等同

image.png
image.png

返回字符串的字符串函數(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 ');
insert.png

INSERT

replace() 搜索替換所有實例,慎用铝噩;

select replace('goodbye world','goodbye','hello');

可能不止替換了 goodbye world中的goodbye衡蚂;

substring() 從字符串中提取字符串,參數(shù):‘字符串’骏庸,開始位置毛甲,提取字符數(shù);

截取字符串中的子串敞恋,不需要接from[table];

select substring('nihao nikuailema',9,6);
image.png

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;
image.png

/*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ā)音類似的值
soundex
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ù)目的列,使得可以對分組進行嵌套靴拱;

image.png
image.png

例句:

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 的分組出來仆葡!

image.png

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)子查詢

非關(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);

上述例子查詢檢索所有不管理別人的雇員振峻,


image.png

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分行柜員開立的賬戶躏吊,


image.png

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 ,表示并集

image.png

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里面

image.png
image.png
  • 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 selectselect 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 更新和刪除的指導原則

image.png
image.png

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疃馈婴削!

image.png

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的語句熙卡,它給出被索引列的一個逗號分隔的列表,


image.png

02 進行全文本搜索

select note_text
from productnotes
where match(note_text)against('rabbit');

rabbit為搜索文本励饵,note_text為指定列驳癌;


image.png

03 使用查詢擴展

查詢擴展用來設(shè)法放寬所返回的全文本搜索結(jié)果的范圍,利用查詢擴展能找出可能相關(guān)的結(jié)果役听,即使他們并不精確包含所查找的詞颓鲜;

select note_text
from productnotes
where match(note_text)against('anvils' with query expansion);
image.png

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ù)讀

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末栏渺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锐涯,更是在濱河造成了極大的恐慌磕诊,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纹腌,死亡現(xiàn)場離奇詭異霎终,居然都是意外死亡,警方通過查閱死者的電腦和手機升薯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門莱褒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人涎劈,你說我怎么就攤上這事广凸。” “怎么了蛛枚?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵谅海,是天一觀的道長。 經(jīng)常有香客問我蹦浦,道長扭吁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮侥袜,結(jié)果婚禮上蝌诡,老公的妹妹穿的比我還像新娘。我一直安慰自己系馆,他們只是感情好送漠,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布顽照。 她就那樣靜靜地躺著由蘑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪代兵。 梳的紋絲不亂的頭發(fā)上尼酿,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音植影,去河邊找鬼裳擎。 笑死,一個胖子當著我的面吹牛思币,可吹牛的內(nèi)容都是我干的鹿响。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼谷饿,長吁一口氣:“原來是場噩夢啊……” “哼惶我!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起博投,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤绸贡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后毅哗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體听怕,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年虑绵,在試婚紗的時候發(fā)現(xiàn)自己被綠了尿瞭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡翅睛,死狀恐怖声搁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宏所,我是刑警寧澤酥艳,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站爬骤,受9級特大地震影響充石,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜霞玄,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一骤铃、第九天 我趴在偏房一處隱蔽的房頂上張望拉岁。 院中可真熱鬧,春花似錦惰爬、人聲如沸喊暖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陵叽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贼穆。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胖替,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓豫缨,卻偏偏與公主長得像独令,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子好芭,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 手動不易燃箭,轉(zhuǎn)發(fā)請注明出處 --Trance 數(shù)據(jù)庫系統(tǒng)命令: (1).查看存儲過程狀態(tài):show pro...
    Trance_b54c閱讀 1,663評論 0 8
  • 概要 64學時 3.5學分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,197評論 0 3
  • (一)幾個數(shù)據(jù)庫相關(guān)的概念 1.數(shù)據(jù)庫 數(shù)據(jù)庫: 保存有組織數(shù)據(jù)的容器。 數(shù)據(jù)的所有存儲栓撞、檢索遍膜、管理和處理實際上是...
    快樂的小飛熊閱讀 524評論 0 1
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,383評論 0 5
  • 2018年轉(zhuǎn)眼而逝瓢颅,讀書營的服務(wù)期也結(jié)束了。細數(shù)這一年弛说,我畢業(yè)了挽懦,從學校到職場,從老家到西安木人,慢慢的信柿,我也有自己的...
    歡胖閱讀 304評論 1 1