SQL語句
標簽(空格分隔): 數(shù)據(jù)庫 MySQL
概念:
數(shù)據(jù)庫->表->(行:一個數(shù)據(jù)記錄 列:一個字段)
主鍵:能唯一標志表中每一行的 一列
任意兩行都不具有相同的主鍵值
任意主鍵列中的值不能重用
主鍵列中的值不能修改刪除
每個行都必須有主鍵
外鍵:外鍵是表中的一個列,其值必須在另外一個表的主鍵中列出,外鍵是保證引用完整性的一個極其重要的成分
外鍵可以幫助防止意外的刪除
檢索數(shù)據(jù):
select prod_name
from Tablaes;
排序數(shù)據(jù):
select dat_name1,dat_name2 ...
from tables
order by dat_name1,dat _name2 ....
desc/asc(默認,遞增)
Where條件過濾
where子句操作符:
= 等于
<> 、 != 不等于
< 、 <= 、 !< 小于、小于等于、不小于
> 、 >= 、 !> 大于、大于等于、不大于
between a and b 在兩者之間
is null 為null值
select dat_name
from table
where dat_name
between A and B
where條件中And和OR的計算次序:And的優(yōu)先級較高,所以先計算And的條件(一般要用括號表示計算順序)
IN :用來指定條件范圍:
Select dat_name
from table
where dat_name
in (A,B....)
相當于:
select dat_name
from table
where dat_name=A or dat_name=B
order by dat_name
LIKE操作符:通配符,用來匹配一部分的特殊字符(只能用于文本字段。非文本字段不能使用通配符搜索)
%:出現(xiàn)任意次數(shù)
—:與%類似,但是,只出現(xiàn)一次
[]:用來指定一個字符集,他必須匹配指定位置的一個字符 [^JM]以J或M開頭;[!JM]不是以JM開頭的數(shù)據(jù)
Select dat_name
from tables
where data_name
like 'AA%B'
搜索以AA開頭,B結(jié)尾的數(shù)據(jù)
拼接字段:+ 或者 || ,將值聯(lián)接到一起構(gòu)成單個值 ,
使用別名 as
select dat_nam1+dat_name2
as vend_title (創(chuàng)建了vend_title字段)
from tables
order by dat_name1
Mysql不支持+和||運算符,他使用concat()函數(shù):
select concat(dat_name1,dat_name2)
from table
order by dat_name
RTRIM(dat_name):去除dat_name字段右側(cè)的空格
TRIM(dat_name)去除dat_name字段兩端的空格
LTRIM(dat_name) 去除dat_name字段左側(cè)的空格
計算:
+ - * / 加減乘除、
函數(shù):
upper() 將文本轉(zhuǎn)換成大寫
lower() 將文本準換成小寫
left()返回串左邊的字符
Length()返回串的長度
rtrim() 去掉右邊的空格
trim()去掉兩端的空格
ltrim()去掉發(fā)左邊的空格
日期處理函數(shù):
數(shù)值處理函數(shù):ABS() 。。。
聚集函數(shù):
AVG() 返回某列數(shù)據(jù)的平均值
COUNT() 返回某列的行數(shù)
MAX() 返回某列的最大值
MIN()返回某列的最小值
SUM( ) 返回某列的和
對所有的行執(zhí)行計算:指定ALL參數(shù)或不給參數(shù)
只對指定行執(zhí)行計算:指定Distinct參數(shù)
SELECT AVG(distinct dat_name)
as dat_avg
from table
where dat_name='AAA';
分組數(shù)據(jù):
group by
select dat_name, count(*) as num_prods
from table
group by num_prods;
having num_prods > 2 #過濾分組
GROUP BY子句必須出現(xiàn)在WHERE子句之后, ORDER BY子句之前
在具體使用GROUP BY子句前,需要知道一些重要的規(guī)定:
GROUP BY子句可以包含任意數(shù)目的列。這使得能對分組進行嵌套,為數(shù)據(jù)分組提供更細致的控制。
如果在GROUP BY子句中嵌套了分組,數(shù)據(jù)將在最后規(guī)定的分組上進行匯總。換句話說,在建立分組時,指定的所有列都一起計算(所以不能從個別的列取回數(shù)據(jù))。
GROUP BY子句中列出的每個列都必須是檢索列或有效的表達式(但不能是聚集函數(shù))C 如果在SELECT中使用表達式,則必須在GROUP BY子句中指定相同的表達式。不能使用別名。
大多數(shù)SQL實現(xiàn)不允許GROUP BY列帶有長度可變的數(shù)據(jù)類型(如文本或備注型字段)。
除聚集計算語句外,SELECT語句中的每個列都必須在GROUP BY子句中給出。
如果分組列中具有NULL值,則NULL將作為一個分組返回。如果列中有多行NULL值,它們將分為一組。

HAVINQ和WHERE的差別這里有另一種理解方法i*WHERE在數(shù)據(jù)分組前進行過濾, HAVING在數(shù)據(jù)分組后進行過濾。這是一個重要的區(qū)別, WHERE排除的行不包括在分組中。這可能會改變計算值, 從而影響HAVING子句中基于這些值過濾掉的分組。

約束:用于限制加入表的數(shù)據(jù)的類型
可以在創(chuàng)建時規(guī)定約束(CREATE TABLE),也可以在表創(chuàng)建之后規(guī)定約束(ALTER TABLE )
常用的幾種約束:
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
DEFAULT
LIMIT
Limit子句可以被用于強制 SELECT 語句返回指定的記錄數(shù)。Limit接受一個或兩個數(shù)字參數(shù)。參數(shù)必須是一個整數(shù)常量。如果給定兩個參數(shù),第一個參數(shù)指定第一個返回記錄行的偏移量,第二個參數(shù)指定返回記錄行的最大數(shù)目。
eg:
SELECT *
FROM table
LIMIT 5,10; //檢索記錄行6-15
SELECT *
FROM table
LIMIT 95,-1; // 檢索記錄行 96-last
如果只給定一個參數(shù),它表示返回最大的記錄行數(shù)目。換句話說,LIMIT n 等價于 LIMIT 0,n
SELECT *
FROM table
LIMIT 5; //檢索前 5 個記錄行
子查詢
把一條SELECT語句返回的結(jié)果用千另一條SELECT 語句的WHERE子句
聯(lián)結(jié)表
聯(lián)結(jié)是一種機制,用來在一條SELECT語句中關(guān)聯(lián)表,使用特殊的語法,可以連接多個表返回一組輸出。
eg:
SELECT vend_name, prod_name, prod_price
FROM Vendors, Products
WHERE Vendors.vend_id = Products.vend_id;
與普通的查詢語句最大的區(qū)別在于,from后邊跟了不止一個表,并且這里用了完全限定名。SQL對一條SELECT語句中可以聯(lián)結(jié)的表的數(shù)目沒有限制
笛卡爾積 由沒有連接條件的表關(guān)系返回的結(jié)果為笛卡爾積,檢索出的行的數(shù)目僵尸第一個表中行數(shù)乘以第二個標的行數(shù)。
內(nèi)部聯(lián)結(jié)(等值聯(lián)結(jié))
與上面的聯(lián)結(jié)方式相同,但是語法有差異:
SELECT vend_name, prod_name, prod_price
FROM Vendors INNER JOIN Products
ON Vendors.vend_id = Products.vend_id;
這里兩個表之間的關(guān)系是from子句的組成成分,以inner join指定。在使用這種語法時,連接條件用on子句而非where;
AS可以用來實現(xiàn)表別名,但是與列別名不同,表別名不返回到客戶機。
內(nèi)連接 inner join:指連接結(jié)果僅包含符合連接條件的行,參與連接的兩個表都應(yīng)該符合連接條件。
外連接 outer join:連接結(jié)果不僅包含符合連接條件的行同時也包含自身不符合條件的行。包括左外連接、右外連接和全外連接。
左外連接 left outer join:左邊表數(shù)據(jù)行全部保留,右邊表保留符合連接條件的行。
右外連接 right outer join:右邊表數(shù)據(jù)行全部保留,左邊表保留符合連接條件的行。
全外連接 full outer join:左外連接 union 右外連接。
關(guān)于內(nèi)你聯(lián)結(jié),外聯(lián)結(jié),左聯(lián)結(jié),右聯(lián)結(jié)等詳細介紹:
https://blog.csdn.net/qq_39456689/article/details/80781590
union 組合查詢
利用UNION操作符可以將多條SELECT語句組合成一個結(jié)果集,UNION的使用很簡單。所需做的只是給出每條SELECT語句,在各條語句之間放上關(guān)鍵字UNION。UNION從查詢結(jié)果集中自動去除了重復(fù)的行
insert 插入數(shù)據(jù)
INSERT SELECT從其他表中導(dǎo)入行, 如何用SELECT INTO將行導(dǎo)出到一個新

INSERT還存在
另一種形式,可以利用它將一條SELECT語句的結(jié)果插入表中。這就是所謂的INSERT SELECT, 顧名思義,它是由一條INSERT語句和一條SELECT語句組成的。

更新數(shù)據(jù) update
更新表中特定的行
更新表中所有的行
UPDATE語句總是以要更新的表的名字開始。SET命令用來將新值賦給被更新的列。
update table
set dat_name = val
where .... (如果沒有where,則刪除所有行)
刪除數(shù)據(jù) delete
delete from table
where 條件
有where是刪除一行數(shù)據(jù),沒有是刪除所有行(刪除的是內(nèi)容,而不是表)
創(chuàng)建表 create
create table table_name(
id char(10) not null defalt val,
...
)
更新表結(jié)構(gòu) alter
alter table tablename
add....
刪除表 drop
drop table table_name
事務(wù)
事務(wù)處理是用來維護數(shù)據(jù)庫的完整性,他保證 成批的SQL操作要么完全執(zhí)行,要么完全不執(zhí)行
事務(wù)處理的開始于結(jié)束
begin/start transaction
...
commit transaction
使用ROLLBACK 撤回SQL語句
明確的提交,使用COMMIT語句
保留點SAVE POINT
索引
create index indexid
on table(myindex)
在開始創(chuàng)建索引前, 應(yīng)該記住以下內(nèi)容:
0索引改善檢索操作的性能,但降低數(shù)據(jù)插入、修改和刪除的性能。在執(zhí)行這些操作時, DBMS必須動態(tài)地更新索引。
回0索引數(shù)據(jù)可能要占用大盤的存儲空間。
0并非所有數(shù)據(jù)都適合千索引。唯一性不好的數(shù)據(jù)(如州)從索引得到的好處不比具有更多可能值的數(shù)據(jù)(如姓或名)從索引得到的好處多。
0索引用千數(shù)據(jù)過濾和數(shù)據(jù)排序。如果你經(jīng)常以某種特定的順序排序數(shù)據(jù), 則該數(shù)據(jù)可能是索引的備選。
0可以在索引中定義多個列(例如, 州加上城市)。這樣的索引僅在以州加城市的順序排序時有用。如果想按城市排序, 則這種索引沒有用處。