整理一下sql的關鍵字,一直都在用,只是很少去整理,所以今天簡單整理一下,主要是整理CRUD的一些關鍵字。
寫在前面:sql 不區分大小寫
select 簡單查詢語句
select columnName from tableName where condition group by columnName having condition order by columnName desc asc limit 1;
需要注意說明:當同時含有where子句、group by 子句 、having子句及聚集函數時,執行順序如下:
執行where子句查找符合條件的數據;
使用group by 子句對數據進行分組;對group by 子句形成的組運行聚集函數計算每一組的值;最后用having 子句去掉不符合條件的組。
having 子句中的每一個元素也必須出現在select列表中。有些數據庫例外,如oracle.
having子句和where子句都可以用來設定限制條件以使查詢結果滿足一定的條件限制。
having子句限制的是組,而不是行。where子句中不能使用聚集函數,而having子句中可以。
where在分組前過濾,having在分組后過濾
having字段必須是查詢出來的,where字段必須是數據表存在的。
where 不可以使用字段的別名,having 可以。因為執行WHERE代碼時,可能尚未確定列值。
涉及到的關鍵字:
- distinct:對查詢列進行去重,也可以用在聚合函數中。
- and:用於並列查詢條件,左右兩邊的條件同時滿足時才為真。例如:查詢姓名為jason並且年齡為22的學生信息。 select * from student as s where s.name='jason' and s.age=22;
- or:也用於查詢條件,只要滿足了左右兩邊條件中的一個即可,例如:查詢姓名為jason或者年齡為22的學生信息。 select * from student as s where s.name='jason' or s.age=22;
- not:表示對查詢條件取反,通常和in,between..and..搭配使用。
- between..and.. 或者 not between..and.. :用於查詢條件,通常為符合某個區間的數值或者日期。
- in 或者 not in:用於查詢條件,表示只要查詢的列滿足其中的一個即可(not in 相反),例如:查詢id為1,2,3的學生信息。select * from student as s where s.id in(1,2,3);
- is null 或者 is not null:用於查詢條件,判斷某個字段列是否為空值(is not null 相反),例如:查詢姓名不為空的學生信息。select * from student as s where s.name is not null;
- like 或者 not like 后接通配符:用於查詢條件,通常和 %(0或者多個),_(一個)通配符搭配使用,例如:查詢姓名為j開頭的學生信息。select * from student as s where s.name like 'j%';
- exists 或者 not exists:用於查詢條件,主要是用於判斷某個結果是否存在於表中,如果存在則為true,否則為false。數據量很大時適合使用,而in當數據量很大時則不太適用。
- as:用於為列或者表起別名,也可以使用空格為列或者表起別名,不建議混用。
- *:表示查詢表中符合條件的所有字段信息。
- with: 常常與as連用,將查詢到的結果暫時存儲到一張虛表當中,然后再做操作。后面必須緊跟使用這個虛表的sql語句。with就是一個sql片段,供后面的sql語句引用。
詳情參見:https://www.cnblogs.com/Niko12230/p/5945133.html
例如:with a as (SELECT * FROM table_a);
select * from a; - `>,<,=,<>,!=:分別表示大於,小於,等於,不等於。
- union(去重)/union all(不去重):可以將一個或多個 SELECT 語句的結果連接組合成一個結果集,但是必須列類型和列的個數要一致。
例如:將學生姓名為jason的學生和學生愛好為聽歌的學生查詢出來(例子不恰當)
select s.id,s.name,s.addr from student as s where s.name='jason'
union all
select d.id,d.name,d.addr from student as d where d.hobby='listen song'; - intersect/intersect all(交運算,all不去重):表示獲取兩個查詢sql結果的交集。
類似:
select s.id,s.name,s.addr from student as s where s.name='jason'
intersect all
select d.id,d.name,d.addr from student as d where d.hobby='listen song'; - except/except all(差運算,all不去重):表示獲取兩個查詢sql結果的差集。
sql多表查詢語句
-
inner join on :表示內連接(內連接可用where替換)
例如:查詢a表中在b表中存在id為1的數據信息
select * from a inner join b on a.id=b.id and a.id=1;
可以使用where子句替換為:select * from a,b where a.id=b.id and a.id=1;
有些情況下,可以使用連接來替代子查詢。因為使用join,MySQL不需要在內存中創建臨時表。 -
left join on(左外連接):表示左外連接
例如:查詢a表中在b表中存在姓名j開頭的數據信息(例子不恰當)
select a.name,b.sex from a left join b on a.id=b.id and a.name like 'j%';
它的含義是即使b表中沒有與a表中匹配的數據信息,a表中的數據信息都會全部查詢出來。
left join on 后跟and和where區別
(1)ON條件是在生成臨時表時使用的條件,它不管ON中的條件是否為真,都會返回左邊表中的記錄;
(2)WHERE條件是在臨時表生成好后,再對臨時表進行過濾的條件。這時已經沒有LEFT JOIN的含義(必須 返回左邊表的記錄)了,條件不為真的就全部過濾掉;
(3)AND 是過濾之后再連接,WHERE是連接之后再過濾。
(4)而inner jion沒這個特殊性,則條件放在on中和where中,返回的結果集是相同的。 -
right join on(右外連接):表示右外連接
select a.name,b.sex from a right join b on a.id=b.id and a.name like 'j%';
它的含義與左外連接相反。 -
full join(全連接):即使數據沒有在兩張表中同時存在,也要返回行。
select a.name,b.sex from a full join b on a.id=b.id and a.name like 'j%';
sql插入語句
insert into tablename(column) values(value);
插入語句有四種方式,單個值插入,多個值插入,全部插入,條件插入
第一種情況插入指定字段
insert into table_name(column1,column2)values(value1,value2);
第二種情況插入所有字段:前提條件是字段順序必須與表中字段順序一致
insert into table_name values(value1,value2);
第三種情況批量插入數據
insert into table_name values (value1,value2),(value1,value2);
也可以指定插入批量數據
insert into table_name(column1,column2) values(value1,value2),(value1,value2);
第四種情況就是當滿足了指定條件時才插入數據
insert into table_name(column1,column2) select value1,value2 from table_name where ...
也就是后面select子句中查詢出來的列作為前面的值插入到表中,但是這個列的個數要和前面的字段個數一致。select子句就可以隨便寫了。
例如
insert into dept(deptno,dname,loc) select 11,dept.dname,dept.loc from dept where deptno=22;
sql刪除語句
delete from tablename where condition;
sql更新語句
update tablename set column=value where condition;
sql更改表結構
alter table ..add(添加屬性)
alter table..drop(刪除屬性)
sql刪除表
drop table
刪除表(不可恢復):truncate
sql常見函數
- avg():表示求平均值
- min():表示求最小值
- max():表示求最大值
- sum():表示求和
- count():表示計數統計