sql--15回顾学习记录
DML
單表查詢:
1. 導入數(shù)據(jù)
(1)decimal是表示小數(shù)類型,后面比例為2,表示小數(shù)點后兩位
(2)navicat 讀excel表時,要注意excel表必須是打開的狀態(tài)
(3)excel的文件一定是沒有格式的,比如不能有加粗,不能有網(wǎng)格線。
2. sql 關(guān)鍵字
(1)sql 中關(guān)鍵字不能作為表名、列名,一般大寫
(2)語句以英文分號結(jié)束
(3)一點代碼:
3.單表查詢select from
(1)SELECT 必需子句1(查詢列)FROM 必需子句2(數(shù)據(jù)表);
select結(jié)果二維表
(2)AS別名;AS不改變原表!;不可以給表名單獨改名字,比如:SELECT milk_tea.prod_name FROM milk_tea AS m,會報錯,
SELECT m.prod_name FROM milk_tea AS m; SELECT m.prod_date,m.sale_price FROM milk_tea AS m(3)增加常數(shù)列(不改變原表)
SELECT prod_id, prod_name, in_price, sale_price,0.9 FROM milk_tea; SELECT prod_id, prod_name, in_price, sale_price, 0.9 AS discount FROM milk_tea; SELECT prod_id, prod_name, in_price, sale_price, '零食'AS class FROM milk_tea; SELECT m.*, m.in_price*0.9 newinprice FROM milk_tea AS m;(4)列的四則運算–加減乘除(不改變原表)
SELECT m.prod_name,m.sale_price - m.in_price FROM milk_tea AS m; SELECT m.prod_name,m.sale_price - m.in_price AS profit FROM milk_tea AS m; SELECT m.prod_name,m.sale_price * 0.9 AS new_saleprice FROM milk_tea AS m;4. 字符拼接CONCAT
(1)
SELECT m.*,CONCAT(prod_name,net_w) FROM milk_tea AS m; SELECT m.*,CONCAT(prod_name,net_w) AS combination FROM milk_tea AS m; SELECT prod_name,net_w,CONCAT(prod_name,net_w) AS combi FROM milk_tea AS m; SELECT prod_name,net_w,CONCAT(prod_name,net_w) AS 產(chǎn)品信息 FROM milk_tea AS m; SELECT prod_id,prod_name,net_w,CONCAT(prod_id,prod_name,net_w) AS 產(chǎn)品信息 FROM milk_tea AS m;(2)
SELECT prod_name,net_w,CONCAT(prod_name,'(',net_w,')') AS 產(chǎn)品信息 FROM milk_tea AS m;(3)
SELECT prod_name,net_w,CONCAT(prod_name,'是',net_w) AS 產(chǎn)品信息 FROM milk_tea AS m; SELECT m.prod_name,m.net_w,CONCAT(m.prod_name,'是',m.net_w) AS 產(chǎn)品信息 FROM milk_tea AS m; SELECT m.prod_name, m.net_w, CONCAT(m.prod_name, '是', m.net_w, ',單價是',m.sale_price,'元') AS 產(chǎn)品信息 FROM milk_tea AS m ;(4)遇到拼接的部分有NULL,CONCAT()會直接將拼接結(jié)果變成NULL
(5)指定拼接符,關(guān)鍵字CONCAT_WS
注:CONCAT()與CONCAT_WS()區(qū)別
如果遇到拼接的部分有NULL,CONCAT()會直接將拼接結(jié)果變成NULL;
CONCAT_WS()是忽略NULL部分,但保留其他拼接的內(nèi)容
(6)
SELECT m.prod_name, m.net_w, m.sale_price, CONCAT_WS( '+', m.prod_name, m.net_w, m.sale_price ) FROM milk_tea AS m;SELECT m.prod_name, m.net_w, m.sale_price, CONCAT_WS( ' + ', m.prod_name, m.net_w, m.sale_price ) FROM milk_tea AS m;SELECT m.prod_name, m.net_w, m.sale_price, CONCAT_WS( ' ', m.prod_name, m.net_w, m.sale_price ) FROM milk_tea AS m;5. 用SELECT在sql中做一個展示器
SELECT 6; SELECT CONCAT('sql','訓練營'); SELECT CONCAT_WS('+',1,2,3,4); SELECT 15 * 5;6. DISTINCT
(1)DISTINCT必須放在 列名前 面;
(2)不能部分使用DISTINCT,DISTINCT作用于所有列。
如果用DISTINCT后面跟了兩個列名,那么 如果這兩行的內(nèi)容均不完全相同,所有的行都會被檢索出來。
7. ORDER BY
(1)ORDER BY一定放在 最末尾, 與分號;連寫在一起!
(2)排序:升序ASC,降序DESC
(3)排序列可以不顯示。因為排序是對整張表操作的。
(4)ASC, DESC 只作用與前一列
(5)數(shù)字中默認NULL是最小值
8. WHERE
(1)WHERE 子句在FROM之后,ORDER 之前
(2)WHERE過濾的是行,不影響列的展示。
(3)WHERE結(jié)果忽略NULL,直接不展示。
(4)常規(guī)運算符:等于(=);不等于(!=或者<>);大于(>);小于(<);大于等于(>=);小于等于(<=);
(5)
SELECT m.* FROM milk_tea AS m WHERE m.prod_id = 2; SELECT m.* FROM milk_tea AS m WHERE m.prod_id = '2'; SELECT m.* FROM milk_tea AS m WHERE m.prod_name = '奶糖'; SELECT m.* FROM milk_tea AS m WHERE m.net_w = '150g';(6)where空值遺漏問題
用IFNULL(參數(shù)1,參數(shù)2),比如參數(shù)1是某個列名,那么當參數(shù)1代表的列值為空時,用參數(shù)2代替空值。參數(shù)1可以是列值運算。
(6.1) WHERE IFNULL(m.sale_price,0) = 15
是比較sale_price列值與15的大小,如果sale_price列值為NULL,那么用0代替列值,再用0與15進行比較,即此時NULL的那行數(shù)據(jù)不會顯示出來。
(6.2) WHERE IFNULL(m.sale_price,0) != 15
如果sale_price列值為NULL,那么用0代替列值,再用0與15進行比較,此時NULL的那行數(shù)據(jù)會顯示
9. IFNULL(expr1,expr2)
(1)IFNULL(參數(shù)1,參數(shù)2) 參數(shù)1可以是運算:
SELECT m.* FROM milk_tea AS m WHERE IFNULL(m.sale_price * 0.9,0) < 10; SELECT m.* FROM milk_tea AS m WHERE IFNULL(m.sale_price,0) * 0.9 < 10;8-2. 數(shù)據(jù)過濾 BETWEEN…AND…/IS/IS NOT
(1)BETWEEN [前端值] AND [后端值]
=> 前端、后端值 均包含
(2)
SELECT m.* FROM milk_tea AS m WHERE m.sale_price IS NULL;SELECT m.* FROM milk_tea AS m WHERE m.sale_price IS NOT NULL;SELECT m.* FROM milk_tea AS m WHERE IFNULL( m.sale_price, 10) = 10 ;8-3. LIKE、通配符(_%)、轉(zhuǎn)義字符(\)、AND、OR、IN
(1)下劃線_代表: 單個的任何字符(指一個字或字母或數(shù)字或字符)
使用: WHERE [列名 ] LIKE ‘…_…’
文本要加引號!
適合知道字符數(shù)目;知道字符位置
SELECT m.* FROM milk_tea AS m WHERE m.prod_name LIKE '奶_';SELECT m.* FROM milk_tea AS m WHERE m.prod_name LIKE '薯_';SELECT m.* FROM milk_tea AS m WHERE m.prod_name LIKE '_糖';SELECT m.* FROM milk_tea AS m WHERE m.prod_name LIKE '__糖'; #最后一行寫了兩個下劃線,要找的是三個字且最后一個字是糖(2)百分號%代表: 任意數(shù)目(包括0個)的任何字符
使用: WHERE [列名 ] LIKE ‘…%…’
適用范圍不知道字符數(shù)目;知道字符位置
不會出現(xiàn)連續(xù)的兩個百分號
注:以通配符開頭,查詢效率低
(3)轉(zhuǎn)義字符
轉(zhuǎn)義字符\ 含義是 在它后面緊跟著的符號 僅代表 那個符號本身,比如 \ %指的就是百分號本身,而不是通配符%。
(4)且AND:同時滿足兩個或多個條件;類似求 交集
SELECT * FROM milk_tea AS m WHERE m.sale_price BETWEEN 5 AND 15; #1SELECT * FROM milk_tea AS m WHERE m.sale_price >= 5;#2SELECT * FROM milk_tea AS m WHERE m.sale_price <= 15;#3 SELECT * FROM milk_tea AS m WHERE m.sale_price >= 5 AND m.sale_price <= 15; #4,結(jié)果與1一樣(5)OR兩個或多個條件,至少滿足一個;類似求 并集
SELECT * FROM milk_tea AS m WHERE m.sale_price >= 5 OR m.sale_price <= 15; #AND、OR使用結(jié)果,空值依然會被忽視(6)IN:明確而不連續(xù)的取值(過濾值明確;但不是連續(xù)范圍)。
WHERE [列名] IN (值1,值2,…)
(7)NOT:否定一個或多個過濾條件;類似補集的概念
寫法:WHERE NOT [條件1]
注:NOT是放在條件前!而且只否定一個條件,而且只否定緊跟著的那個條件。
區(qū)分位置:
(1) WHERE [列] IS NOT NULL
(2) WHERE NOT [條件]
(8)文字轉(zhuǎn)換CONVERT(列 USING gbk)
SELECT m.* FROM milk_tea AS m ORDER BY CONVERT(m.prod_name USING gbk);SELECT m.* FROM milk_tea AS m ORDER BY CONVERT(m.prod_name USING gbk) DESC;10. 數(shù)據(jù)類型
數(shù)值型:INTEGER,DECIMAL,FLOAT
兩個參數(shù):(寬度,小數(shù)點位數(shù))
ABS(),四舍五入函數(shù)ROUND()
文本型:CHAR,VARCHAR
一個參數(shù):(字符個數(shù))
字節(jié)數(shù)LENGTH() ,字符長度CHAR_LENGTH(),去右空值RTRIM(),去左空值LTRIM() ,變大寫UPPER(),LOWER()
日期型:DATE,TIME,DATETIME
YEAR(),HUOR(),MONTH(),MONTHNAME(),取當前的時間NOW(),取當前的日期CURDATE(),取當前的時間CURTIME(),DATE_ADD(),DATE_SUB()
(1)整型integer
用法: INTEGER, INTEGER(10)顯示10位數(shù)字
(2)定點型 decimal,多出的位數(shù)四舍五入
定義:固定位數(shù)的小數(shù),默認參數(shù)為Decimal(10,0)
Decimal(2,2)。第一個2表示兩個數(shù),第二個2表示小數(shù)點后兩位。這種數(shù)不會超過1,比如0.16總共是兩位,恰好是在小數(shù)點后的兩位。
DECIMAL(4,2)。總長度是4位,小數(shù)點是后2位,那么小數(shù)點前是兩位,因為4-2=2。
(3)浮點型 float\double\real,多出位數(shù)五舍六入
定義:不固定位數(shù)的小數(shù)
不固定位數(shù),直接寫。FLOAT / DOUBLE / REAL
固定位數(shù),標出精度。FLOAT(5,3)
解釋:數(shù)字是10.0005,FLOAT(5,3),那么結(jié)果是10.000
(4)CHAR 定長字符串,CHAR(10),標定長度為10,即字符個數(shù)為10
注:定長字符串,如果定了10個字符,寫了4個字符,那么系統(tǒng)自動給補上6個空位。
(5)VARCHAR 可變長字符串,VARCHAR(100),標定長度位100,但可以不填滿。
UTF-8中,1個中文字符占3個字節(jié),1個數(shù)字或英文占1個字節(jié)。
gbk中,1個中文字符占2個字節(jié)
(6) DATE
用法:DATE
舉例:‘2018-09-01’
(7)TIME
用法:TIME
舉例:‘23:08:01’
(8)DATETIME
用法:DATETIME
舉例:‘2018-09-01 23:08:01’
11. 函數(shù)
(1)絕對值函數(shù)ABS,例,ABS(-3)=3;
(2)平方根函數(shù)SQRT,例,SQRT(4)=2;
(3)指數(shù)函數(shù)EXP,例,EXP(4)=e^4;
(4)四舍五入函數(shù)ROUND,第二個參數(shù)是小數(shù)點位數(shù),例,ROUND(1.234,2) = 1.23
(5)圓周率函數(shù)PI,例,PI() = Π
(6)字符長度 CHAR_LENGTH,例,CHAR_LENGTH(‘數(shù)據(jù)’) = 2
(7)字節(jié)數(shù) LENGTH, 例,LENGTH(’數(shù)據(jù)‘)=6;當然不同的編碼語言中,中文文字代表的字節(jié)數(shù)不同。
(8)去除右邊空值 RTRIM, 例,RTRIM(‘home ‘) = ‘home’
(9)去除左邊空值 LTRIM,例,LTRIM(’ home’) = ‘home’
(10)大寫字母轉(zhuǎn)換 UPPER,例,UPPER(‘home’) = ‘HOME’
(11)小寫字母轉(zhuǎn)換 LOWER,例,LOWER(‘HOME’) = ‘home’
(12)獲取具體日期段 YEAR、MONTH、DAY,例,
YEAR(‘2019-1-2’) = ‘2019’
(13)獲取具體時間段 HOUR、MINUTE、SECOND,例,HOUR(‘14:05:55’) = ‘14’
(14)獲取月份名稱 MOTHNAME,例,MOTHNAME(‘2019-1-2’) = ‘JAN’
(15)獲取當前日期時間 NOW,例,NOW() = systime
(16)獲取當前日期 CURDATE,例,CURDATE() = ‘20190501’
(17)獲取當前時間 CURTIME,例,CURTIME() = ‘15:10:39’ (18)時間增加 DATE_ADD,例,DATE_ADD(‘20190501’,INTERVAL 1 MONTH)
(19)時間減少 DATE_SUB,例,DATE_SUB(‘20190501’, INTERVAL 1 YEAR)
12. 聚合函數(shù)
聚合函數(shù)不檢索,只匯總。
(1)COUNT()
COUNT()計數(shù)過程忽略NULL行,只作用非NULL行。
COUNT(col) 確定col這一列有多少行,不可以計數(shù)多列,參數(shù)只能是一個列名。
COUNT(*) 確定表中行的數(shù)目,COUNT(1) 確定表中第一列的行的數(shù)目。
COUNT(DISTINCT col) 對行去重計數(shù)
SELECT COUNT(DISTINCT m.sale_price) FROM milk_tea AS m;(2)SUM(col)
SUM求和是直接跳過空值,忽略NULL行,計算其他所有非空值的和。
執(zhí)行順序是:
確定表–過濾表–選取展示列
FROM–WHERE–SELECT
(3)AVG(col)
AVG(col)結(jié)果 = 列的SUM值 / 列的COUNT值
分母計數(shù)不對NULL計數(shù),分子求和忽略NULL求和,即空值行被過濾掉。
(4)MAX(col)
MAX(col)忽略NULL行,因為NULL沒法比較大小
(5)MIN(col)
MIN(col)忽略NULL行
(6)一行寫多個聚合函數(shù)
SELECT COUNT(m.sale_price) , MIN(m.sale_price) , MAX(m.sale_price) , SUM(m.sale_price), AVG(m.sale_price) FROM milk_tea AS m;13. 數(shù)據(jù)分組、分組過濾
GROUP BY 列;(對列分組)
SELECT 聚合鍵,聚合函數(shù) FROM 表;
HAVING 聚合函數(shù) +條件;(對分組后的結(jié)果進行過濾)
(聚合鍵在WHERE中過濾)
(1)數(shù)據(jù)分組結(jié)構(gòu):
SELECT … FROM … (這是必需子句)
WHERE +條件 (這是過濾子句)
GROUP BY +聚合鍵(這是分組子句)
注: 聚合鍵所在列盡量不要出起別名
(2)結(jié)果:是多行數(shù)據(jù);一行數(shù)據(jù)代表一個分組;SELECT展示的列必須與分組對應,聚合鍵決定分組標準,那么SELECT展示的列 要有聚合鍵所在列、聚合函數(shù)作用得到的結(jié)果列;NULL值單獨成為一個分組
(3)分組過濾結(jié)構(gòu):
SELECT…
FROM…
WHERE + 過濾條件
GROUP BY + 聚合鍵
HAVING +聚合函數(shù)(這是分組篩選子句);
先WHERE 對整張表進行過濾,再GROUP BY對過濾的結(jié)果進行分組,再HAVING對分組結(jié)果進行篩選,結(jié)果是只剩下滿足條件的組。
SELECT m.net_w ,SUM(m.sale_price) FROM milk_tea AS m GROUP BY m.net_w; SELECT m.net_w , SUM(m.sale_price) FROM milk_tea AS m GROUP BY m.net_w HAVING SUM(m.sale_price) > 20; #這里,Having后跟的是聚合函數(shù)結(jié)果列,即對分組結(jié)果進行過濾#HAVING相當于在分組聚合的結(jié)果下(此時兩列為m.net_w和SUM(m.sale_price)),取出此時表中SUM(m.sale_price)>20的行 SELECT m.net_w , SUM(m.sale_price) FROM milk_tea AS m GROUP BY m.net_w HAVING m.net_w IN ('100g','150g'); #不推薦這種方法 SELECT m.net_w , SUM(m.sale_price) FROM milk_tea AS m WHERE m.net_w IN ('100g','150g') GROUP BY m.net_w ; SELECT p.class, COUNT(1), SUM(p.sale_price) , AVG(p.sale_price) FROM prod_info as P GROUP BY p.class; SELECT p.class, COUNT(1), SUM(p.sale_price) , AVG(p.sale_price) FROM prod_info as P GROUP BY p.class HAVING COUNT(1) > 4;14-1. sql語句的書寫順序
SELECT FROM
WHERE (過濾的是行)
GROUP BY (分組條件)
HAVING (對分組結(jié)果過濾,篩選的是組)
ORDER BY (作為排序條件的組) ;
14-2. sql語句的執(zhí)行順序
FROM (確定從哪個表中選數(shù)據(jù))
WHERE (確定選什么數(shù)據(jù))
GROUP BY (對選出來的數(shù)據(jù)進行分組)
HAVING (對分組的數(shù)據(jù)進行組的篩選)
SELECT (然后對滿足條件的具體的列做一個展示)
ORDER BY (展示的時候進行排序)
注: 盡量不要對GROUP BY使用別名,但是ORDER BY可以使用別名。
多表查詢+聯(lián)結(jié):
----多表查詢
–子查詢:嵌套在其他查詢中的查詢
標量子查詢:只返回一行一列的子查詢(得到常數(shù))
關(guān)聯(lián)子查詢:組內(nèi)比較,使用常數(shù),用在WHERE在組內(nèi)比較
普通子查詢:返回一整列,用IN得到二維表,即心的檢索表
----聯(lián)結(jié)(列之間組合)
內(nèi)聯(lián)結(jié):INNER JOIN… ON
–外聯(lián)結(jié):
左外聯(lián)結(jié):LEFT OUTER JOIN … ON
右外聯(lián)結(jié):RIGHT OUTER JOIN…ON
全外聯(lián)結(jié):FULL OUTER JOIN…ON
–組合(行之間的組合)
去重組合:UNION
不去重組合:UNION ALL
15. 子查詢
例,milk_tea 表中saleprice 的價格大于milk_tea表中的奶茶的價格
SELECT * FROM milk_tea AS m1 WHERE m1.sale_price > (SELECT m.sale_price FROM milk_tea AS m WHERE m.prod_name = '奶茶');#2例,增加常數(shù)列為奶茶的價格
SELECT m.* ,( SELECT m.sale_price FROM milk_tea AS m WHERE m.prod_name = '奶茶') AS '奶茶價格' FROM milk_tea AS m;例,要查詢平均銷售價格>milk_tea表中的奶茶價格
SELECT p.class , AVG(p.sale_price) FROM prod_info AS p GROUP BY p.class HAVING AVG(p.sale_price) > (SELECT m.sale_price FROM milk_tea AS m WHERE m.prod_name = '奶茶');例,選出銷售價格大于平均售價的日用品
SELECT * FROM prod_info AS p WHERE p.class = '日用品' AND p.sale_price > (SELECT AVG(p1.sale_price)FROM prod_info AS p1WHERE p1.class = '日用品' );例,選出每個品類中售價大于該品類平均價格的商品
SELECT * FROM prod_info AS p WHERE p.sale_price > (SELECT AVG(p1.sale_price)FROM prod_info AS p1WHERE p1.class = p.class GROUP BY p1.class);例,
SELECT * FROM milk_tea AS m1 WHERE m1.prod_name IN (SELECT m2.prod_name FROM milk_tea AS m2 WHERE m2.sale_price = 15);例,
SELECT * FROM ( SELECT p.brand , p.prod_name ,p.sale_price FROM prod_info AS p WHERE p.prod_name = '抽紙') AS b; #注:派生表必須要有別名,所以 AS b 這里不能省略。例,
SELECT * FROM ( SELECT p.type , p.brand , p.prod_name ,p.sale_price FROM prod_info AS p WHERE p.prod_name = '抽紙') AS b WHERE b.sale_price > 26;16. 表聯(lián)結(jié)
關(guān)系型數(shù)據(jù)庫是將所有的數(shù)據(jù)分解為多個表,表之間互相聯(lián)系。
16-1內(nèi)聯(lián)結(jié)
(1)結(jié)構(gòu):
select 列名(可以是來自不同表的多個列)
from 表1,表2 (可以拓展到更多表)
where 表1.列a = 表2.列b
(這里where是說明聯(lián)結(jié)方式和聯(lián)結(jié)字段,這是內(nèi)聯(lián)結(jié))
(2)聯(lián)結(jié)前提:必須有共同列;
(3)創(chuàng)建聯(lián)結(jié)規(guī)則:列出所有表、定義所有表關(guān)系
(4)聯(lián)結(jié)結(jié)果:所有表的所有列、共同列重復行;
(5)通用內(nèi)聯(lián)結(jié)關(guān)鍵字:INNER JOIN, ON
16-2 自聯(lián)結(jié)
16-3 外部聯(lián)結(jié)
(1)聯(lián)結(jié)規(guī)則:列出所有表、定義所有表關(guān)系
(2)外聯(lián)結(jié)前提:有共同列;但不要求共同的列要一摸一樣。
(3)聯(lián)結(jié)結(jié)果:所有表所有列、包含相關(guān)表中沒有關(guān)聯(lián)行的行
即:所有表所有列+包含相關(guān)表中沒有關(guān)聯(lián)行的行
(4)連接方式:
i.左外部聯(lián)結(jié):包含左邊表的所有行
關(guān)鍵字是:LEFT OUTER JION
(就是用這個關(guān)鍵字代替之前的INNER JION)
ii. 右外部聯(lián)結(jié):包含右邊表的所有行
將客戶信息放左邊,流水信息放右邊
關(guān)鍵字是:RIGHT OUTER JION
iii. 全外部聯(lián)結(jié):包含兩邊表的所有行
(無所謂兩個表的位置,比如可能兩個表的信息都不是完全對應的,都有空缺。)
關(guān)鍵字是:FULL OUTER JION
17.組合查詢
1.組合查詢:在查詢結(jié)果上做處理。
UNION是先查詢結(jié)果,再進行組合。有多條select語句。
2.UNION使用要求:
(1)多個select語句中的列字段必須一樣;表達式、聚集函數(shù)也要一樣。否則組合結(jié)果沒意義
(2)數(shù)據(jù)類型必須兼容,數(shù)據(jù)類型是確定且唯一。允許隱式轉(zhuǎn)換,指的是字符串的數(shù)字和數(shù)值數(shù)字之間可以隱式轉(zhuǎn)換。
(3)最終的字段名由第一條select語句決定。
(4)最后一條select語句可以只用order,此時order是作用與整個檢索結(jié)果的排序。
(5)表可以不一樣,但是字段的意義要一樣,否則合并起來沒有意義。比如選擇產(chǎn)品名稱字段和產(chǎn)品價格字段拼接起來沒有意義。有意義的情況是指表1是產(chǎn)品1的價格字段、表2是產(chǎn)品2的價格字段。
UNION執(zhí)行注意事項:
(1)自動過濾重復行。
比如表1中選出3個商品,表2中選出3個商品,那么有一個商品是重復的,將只顯示一條該商品,即最后只有5條記錄。
(2)兩條及兩條以上的select語句,每兩條UNION一次。
指 select … UNION select… UNION select …UNION
(3)UNION ALL關(guān)鍵字是不自動過濾重復行。
增刪改
----數(shù)據(jù)插入
完整插入:INSERT INTO 表 VALUES(值,值);
部分插入:INSERT INTO 表(字段,字段)VALUES(值,值);
插入查詢語句:INSERT INTO 表 SELECT 列 FROM 表;
注意空值的處理
----數(shù)據(jù)更新
UPDATE 表
SET 字段 = 常數(shù) 或者NULL
WHERE 過濾條件;
----刪除數(shù)據(jù)
DELETE FROM 表
WHERE 條件;
----清空表
TRUNCATE TABLE 表;
18. 數(shù)據(jù)插入
因為會改變原表,因此操作時,要先測試。
1.語句結(jié)構(gòu):
INSERT INTO 表名 VALUES(插入值)
注:插入值可以是完整的行,即每個列都有值;也可以不完整。
注:主鍵列的值是不能重復,也不能是空值。
這兩種的語句區(qū)別是:
(1)插入完整的行:
INSERT INTO 表名 VALUES(插入值)
(2)插入不完整的行:
INSERT INTO 表名(插入字段名) VALUES (字段對應的插入值)
其中,字段名和插入值一一對應
(3)插入值可以是空值,直接在VALUES不填充內(nèi)容。
注:要與表格中列的格式相對應,比如字符串就用引號,數(shù)字就用數(shù)字,日期就用日期。
例,插入完整的檢索列
用select 字段 from… where … group by …替代VALUES+插入值
注: 這里用CONCAT進行拼接的原因?
因為這里的例子中 pro_info表、prod_info2表是一摸一樣的,包括主鍵。sql 表中主鍵值唯一,且不能重復,所以需要在插入字段時,拼接點內(nèi)容讓主鍵變化,這里只是為了展示所以這么拼接,沒有別的含義。
19. 數(shù)據(jù)更新
因為會改變原表,因此操作時,要先測試。
結(jié)構(gòu):
UPDATE 表名
SET 字段 = 值
WHERE 過濾條件
注:
(1)等號=是賦值符號
(2)更新的表必須是真實的表。比如不能是聯(lián)結(jié)表,聯(lián)結(jié)表是虛擬表。
(3)set子句中間用 逗號!!! 隔開
(4)要用過濾條件指定更新的行,否則全部更新
(5)可以更新值為空值,但必須原表允許該列為空值
比如:set goal = NULL
19-1 修改數(shù)據(jù)
#先測試過濾條件 SELECT p2.* FROM prod_info2 AS p2 WHERE p2.prod_id LIKE 'g%';#再更新UPDATE prod_info2 SET class = '零食' WHERE prod_id LIKE 'g%'; #測試 SELECT p2.* FROM prod_info2 AS p2 WHERE p2.prod_id LIKE '3%';#更新 UPDATE prod_info2 SET class = '飲料' WHERE prod_id LIKE '3%';#檢查是否更新 SELECT p2.* FROM prod_info2 AS p2 WHERE p2.prod_id LIKE '3%'; #測試 SELECT * FROM prod_info2 AS p2;#更新價格 UPDATE prod_info2 SET sale_price = 0.9 * sale_price;#檢查 SELECT * FROM prod_info2 AS p2; #測試 SELECT p2.* FROM prod_info2 AS p2 WHERE p2.prod_name = '抽紙' OR p2.class = '飲料';#更新 UPDATE prod_info2 SET sale_price = sale_price * 0.9 WHERE prod_name = '抽紙' OR class = '飲料';#檢查 SELECT p2.* FROM prod_info2 AS p2 WHERE p2.prod_name = '抽紙' OR p2.class = '飲料'; #測試 SELECT p2.sale_price, p2.cost FROM prod_info2 AS p2; #更新 UPDATE prod_info2 SET sale_price = sale_price / 0.9,cost = cost / 0.9;19-2 表之間兩列數(shù)值替換
在更新過程中進行聯(lián)結(jié),用INNER JOIN
20. 數(shù)據(jù)刪除
因為會改變原表,因此操作時,要先測試。
語句結(jié)構(gòu):
DELETE FROM 表名 WHERE 過濾條件
注:刪除的是表中數(shù)據(jù),但表仍然存在
例
DDL
----創(chuàng)建表
CREATE TABLE 表 (
字段 數(shù)據(jù)類型 字段屬性);
–復制表
CREATE TABLE 新表
AS SELECT 列 FROM 已有表 WHERE 條件;
–重命名表
RENAME 表 TO 新表名;
----修改表
–增加字段
ALTER TABLE 表
ADD 字段 數(shù)據(jù)類型 字段屬性;
–刪除字段
ALTER TABLE 表
DROP 字段, DROP 字段;
(還有一種寫法增加一個關(guān)鍵字COLUMN)
ALTER TABLE 表
DROP COLUMN 字段, DROP COLUMN 字段;
–修改字段內(nèi)容
ALTER TABLE 表
MODIFY COLUMN 字段 數(shù)據(jù)類型 字段屬性;
----刪除表
DROP TABLE 表名;
----視圖
–創(chuàng)建視圖
CREATE VIEW 視圖名 AS SELECT 列 FROM 已有表 WHERE 條件;
–刪除視圖
DROP VIEW 視圖名;
----存儲過程PROCEDURE
通過BEGIN END創(chuàng)建
通過CALL調(diào)用
21.創(chuàng)建表CREATE TABLE
語句結(jié)構(gòu):
CREATE TABLE 表名
(字段名1 數(shù)據(jù)類型 屬性 ,
字段名2 數(shù)據(jù)類型 屬性
)
1.表名要求:英文字符開頭,由字母、數(shù)字、下劃線 組成,英文通常小寫。
2.字段逗號 隔開,字段名唯一。
3.字段名、數(shù)據(jù)類型是必須的項,屬性不是必須項,中間空格隔開。
4.屬性:是否允許空值NULL,默認允許,設置成不允許空值就是用NOT NULL;默認值設置用DEFAULT設置,必須是常數(shù)。
22. 復制表結(jié)構(gòu)
復制表mysql操作語句:
CREATE TABLE 表名 AS 目標二維表;
(AS理解為如同)
注:通過select語句得到的就是目標二維表,表結(jié)構(gòu)由select字段決定,表記錄由select中的where過濾條件決定。
解釋:因為SELECT p2.name,p2.owner FROM pet2 AS p2 WHERE 1 = 2中,1=2是一個偽命題,pet2表中沒有滿足這個條件的數(shù)據(jù),所以取出來的數(shù)據(jù)也是空
23. 更新表結(jié)構(gòu)ALTER TABLE
表更改不能撤銷,建議做完整備份
關(guān)鍵字:ALTER TABLE
語句:ALTER TABLE 表名 + 操作
三種操作:
(i)添加字段ADD
使用:ALTER TABLE 表名 ADD 字段名 數(shù)據(jù)類型 屬性;
(ii)刪除一個或多個字段DROP(或者用DROP COLLUMN),字段名用逗號連接
使用:
ALTER TABLE 表名 DROP 字段名;
ALTER TABLE 表名 DROP COLUMN 字段名;
(iii)修改字段MODIFY COLUMN
使用:ALTER TABLE 表名 MODIFY COLUMN 字段名 數(shù)據(jù)類型 屬性;
24. 刪除表DROP TABLE
語句:
DROP TABLE 表名;
注:DROP TABLE沒有確認、沒有撤銷、永久刪除,建議做完整備份。
例:
25. 表重命名RENAME TABLE
語句:
RENAME TABLE
表名1 TO 新表名1,
表名2 TO 新表名2,
…;
注:可以批量修改,從左往右依次進行。
DCL
commit
ROLLBACK
SAVEPOINT
RELAESE SAVEPOINT 保留點名
26. 事務處理
1.管理對象(對數(shù)據(jù)修改的操作):INSERT、UPDATE、DELETE
2.關(guān)鍵字:COMMIT、ROLLBACK、SAVEPOINT、ROLLBACK、RELEASE
3.事務管理通過BEGIN開始,以END結(jié)束,并且在進行事務管理的時候是可以對是否提交進行設定。在非事務管理狀態(tài)下運行代碼,直接提交結(jié)果,因此,此時回退操作無效。
在MySQL中,使用 SET AUTOCOMMIT = 0; 代表取消自動提交操作
提交COMMIT:將sql語句的執(zhí)行結(jié)果寫入數(shù)據(jù)庫表中
回退ROLLBACK:撤銷sql語句的執(zhí)行結(jié)果
保留點SAVEPOINT:時間點的備份,可以對其發(fā)布回退
注:CTREATE、DROP不可以回滾
4.舉例:
begin(開始管理事務)
刪除T3行
savepoint sp1(#1)
刪除slim行
savepoint sp2
插入test3行
回退到sp1(恢復到了#1狀態(tài))
釋放sp2(RELESE savepoint sp1)
釋放sp1(RELESE savepoint sp2)
回退到sp1(ROLLBACK TO sp1)
出現(xiàn)ERROR(因為沒有sp1了)
此時commit
結(jié)果仍然是#1的狀態(tài)。
27. 對字段的約束
27-1. 主鍵(PRIMARY KEY)
1.作用:確保數(shù)據(jù)的唯一性
2.特征:
(1)每行都有;
(2)行的唯一標識(主鍵之間不能有重復,,即主鍵所在的列中每個值都是唯一的);
(3)不能修改;
(4)刪除后不再分配。
(不同DBMS要求不同,要自己測試)
3.主鍵不能為空,建表的時候就要標注。
4.建表時設定主鍵
<字段名> <數(shù)據(jù)類型> NOT NULL UNIQUE
5.建表后增加主鍵
ALTER TABLE <表名>
ADD CONSTRAINT PRIMARY KEY(<列名>)
27-2. 外鍵(foreign key)
(1)確保引用完整性
(2)特征:該表與其他表的關(guān)聯(lián);外鍵一定是其他表的主鍵.
(3)建表時設定外鍵
<字段名><數(shù)據(jù)類型> NOT NULL
REFERENCES KEY <關(guān)聯(lián)表>(關(guān)聯(lián)列)
(4)建表后增加外鍵
ALTER TABLE <表名>
ADD CONSTRAINT FOREIGN KEY(<列名>)
REFERENCES <關(guān)聯(lián)表>(關(guān)聯(lián)列)
27-3. 唯一約束UNIQUE**
1.作用:確保行數(shù)據(jù)唯一性(有點像主鍵的意思)
2.具體特征:
(1)可以有多個字段(和主鍵的不同點)
(2)可以是NULL
(3)可以被更新
(4)可以重復使用(?)
(5)不能定義外鍵
3.語句:
(1)<字段名> <數(shù)據(jù)類型> UNIQUE
(2)ALTER TABLE <表名>
ADD CONSTRAINT UNIQUE(<列名>)
27-5. 檢查約束CHECK
1.作用:確保該列數(shù)據(jù)滿足指定條件
2.指定條件:
(1)值的范圍(>0)
(2)特定值(性別M/F)
3.語句:
(1)<字段名> <數(shù)據(jù)類型> NOT NULL
CHECK ( <字段> (限定條件) )
(2)ALTER TABLE <表名>
ADD CONSTRAINT CHECK ( <字段> (限定條件))
27-6. 默認約束DEFAULT**
1.作用:指定默認值
2.語句:
<字段名> <數(shù)據(jù)類型> DEFAULT<默認值>
28. 索引
建立索引語句:CREATE INDEX 索引名 ON 表名(列名);
索引的本質(zhì)是一種排序,在某列上建立索引,即對該列進行“排序”
(1)可以快速定位、快速排序
(2)可以定義多列,實現(xiàn)組合排序。
使用注意:
(1)要求數(shù)據(jù)的唯一性較好(某列數(shù)據(jù)重復的多進行排序的意義不大)
(2)索引提高查詢、排序速度,適用于過濾或者排序較多的字段,索引名不能重復
(3)數(shù)據(jù)修改(增刪改)操作時,需要重新更新索引,效率低
(4)占用大量內(nèi)存(所以要科學使用索引)
29. 數(shù)據(jù)庫安全
限制數(shù)據(jù)庫操作
(1)表的訪問權(quán)限(可以用VIEW PROCEDURE實現(xiàn))
(2)表字段的訪問權(quán)限(可以用VIEW PROCEDURE實現(xiàn))
(3)表的修改權(quán)限(可以用GPANT REVOKE實現(xiàn))(比如對不同賬號采用不同的使用權(quán)限)
數(shù)據(jù)庫管理員(運維工程師)–從事管理和維護DBMS 的相關(guān)工作人員的統(tǒng)稱
管理內(nèi)容:
數(shù)據(jù)庫設計、數(shù)據(jù)庫測試、數(shù)據(jù)庫部署、數(shù)據(jù)庫交付
核心目標:
保證數(shù)據(jù)庫管理系統(tǒng)的穩(wěn)定性、安全性、完整性、高性能。
(穩(wěn)定性、安全性、完整性是基本的工作,而高性能是持續(xù)優(yōu)化和努力的方向)
30. 數(shù)據(jù)庫拓展
數(shù)據(jù)分SQL、NOSQL
特點:存在關(guān)系模型,有清晰的結(jié)構(gòu)劃分
數(shù)據(jù)化查詢數(shù)據(jù)規(guī)模有限、增長速度有預期
2.1 半結(jié)構(gòu)化數(shù)據(jù),包括EMAIL、XML文件
特點:非關(guān)系模型,有基本固定結(jié)構(gòu)模式
解釋:EMAIL有收件地址、收件人發(fā)件地址、發(fā)件人這些是固定的,但是內(nèi)容是不固定的
2.2 非結(jié)構(gòu)化數(shù)據(jù),包括WORD、PPT、圖片
特點:沒有固定模式,采用內(nèi)容管理
對NOSQL數(shù)據(jù)對結(jié)構(gòu)化查詢的支持比較差,而且海量數(shù)據(jù)增長速度難以預期,但是要挖掘信息還是需要這種海量的信息支持
31. HIVE
HIVE是數(shù)據(jù)系統(tǒng)倉庫工具
HIVE能做的事情:將操作型數(shù)據(jù),抽取出來,進行數(shù)據(jù)清洗,進行加工、匯總、整理,最后將所有數(shù)據(jù)放入數(shù)據(jù)倉庫中。
Q1:為什么要進行加工整理這些工作
A1:保證數(shù)據(jù)一致性,因為不同的系統(tǒng)數(shù)據(jù)抽取時的數(shù)據(jù)口徑可能不太一樣
Q2:原始數(shù)據(jù)與數(shù)據(jù)倉庫區(qū)別?
A2:數(shù)據(jù)倉庫中的數(shù)據(jù)是面向主題的(比如按業(yè)務分類,或者按著使用目分類),經(jīng)過事務處理的數(shù)據(jù)進入數(shù)據(jù)倉庫是為了進行決策分析的。整個過程可能就是將NONSQL的數(shù)據(jù)經(jīng)過加工后變成SQL數(shù)據(jù),數(shù)據(jù)倉庫中的數(shù)據(jù)就是結(jié)構(gòu)型的數(shù)據(jù)。
數(shù)據(jù)倉庫工具HIVE有什么特性?
(1)HIVE的底層架構(gòu)是Hadoop,Hadoop這種結(jié)構(gòu)就決定了HIVE能為海量數(shù)據(jù)提供存儲和計算。
(2)HIVE提供工具ETL(ETL 數(shù)據(jù)提取轉(zhuǎn)化加載),ETL可以存儲、查詢、分析存儲在Hadoop中的大規(guī)模數(shù)據(jù)。
(即HIVE 最終得到的是結(jié)構(gòu)型數(shù)據(jù)(SQL型),但是HIVE使用的底層邏輯是Hadoop海量數(shù)據(jù)(可以是NOSQL型)。HIVE架起了SQL與NOSQL之間的橋梁)
(3)在HIVE中使用的是一種類似SQL的查詢語言,稱為HQL。(也是結(jié)構(gòu)化的查詢語言)
總結(jié)
以上是生活随笔為你收集整理的sql--15回顾学习记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 车牌号归属地_获取车牌类型示例
- 下一篇: 《欢乐颂2》狗血的剧情才是生活该有的模样