SQL
SQL分類
SQL分類 | 操作對象 | 操作 | 關鍵字 |
---|---|---|---|
DDL(數據定義語言) | 數據庫,表,視圖和索引 | 創建,刪除,修改 | CREATE,DROP,ALTER |
DCL(數據控制語言) | 數據庫 | 數據庫的事務管理 | grant |
DML(數據操縱語言) | 數據內容 | 增刪改 | INSERT INTO,DELETE,UPDATE |
DQL(數據查詢語言) | 數據內容 | 查詢 | SELECT |
DDL(數據定義)
數據定義,數據庫的創建修改刪除
DCL(數據控制)
事務管理
授權:
DML(數據操縱)
數據操縱語言,對數據進行增刪改
DQL(數據查詢)
SQL註釋和注意事項
1.簡單查詢
1)基本的查詢語句
where條件查詢
select name from student where id=1;
(查詢id等於1的學生的名字)
組合where子句
操作符 and
select name from student where id>2 and id<6 and age=18;
(and操作符將條件組合在一起,每增加一個過濾條件就要添加一個and)
操作符or
select * from student where age>8 or name like “zhang%”;
(查詢年齡大於8歲或者名字是zhang開頭的 所有人的 學生)
計算次序 當or與and一起出現的時候 and優先級更高
select * from student where age>8 or age<18 and name like “zhang%”;
(查詢年齡小於18而且名字是zhang開頭的 學生 或者年齡只需要大於8歲的學生)
不過最好用括號()來明確計算次序,括號括起來的先計算
in操作符
select *from student where id in(1,4,2,7);
(in表示指定了條件範圍)
過濾查詢 關鍵字distinct(不能有重複的)
SELECT DISTINCT name FROM student; (查詢stundent表中所有不重複的名字)
limit限制查詢
select *from student order by id desc limit 1,2;
(根據id倒序排序,從下標爲1開始查,查2條數據)
查詢多個字段
SELECT id,name from student ; (從student表中查詢所有的id和name列,用逗號作爲字段之間的分隔符)
別名 as
select id as sid from student;
(查詢出來的視圖中id字段名變爲sid,只是修改視圖中的而不會修改原來表中的id名)
連接 concat(" 分隔符",字段1,字段2)
select concat(‘=’id,name) from student;
結果比如就是:2018214491=張三
2)模糊查詢
like操作符與%通配符
%通配符(匹配任何字符任意長度,但null不能匹配)
select name from student where name like “張%”;
(查詢“張”開頭的所有student表中的名字; “%”是一個通配符,表示任何字符他都匹配)
應用場景:棧內搜索(效率比較低)
通配符 _
_只能匹配任意單個字符,不能多個字符
正則匹配
關鍵字regexp
select * from student where name regexp " [z,c]c" ;
regexp表示後面接的是一個正則表達式;
3)排序以及聚合函數
排序關鍵字order by
select *from student order bt age; 默認是升序
select *from student order bt age desc; 降序
聚合函數
count() 計算數量
sum() 計算和 select sum(age) from student;求student表格中的年齡之和
avg() 求平均 select avg(age)from student; 求年齡的平均
分組 group by
select count(*)as total ,sex from student group by sex;
(按照sex分組,查出男女各自的數量)
group by having
select count(*),sex from student group by sex having sex=“女”;
按照sex分組查詢sex=“女”的數量;
4)字符串模糊查詢
2.複雜查詢
1)內連接
內連接查詢列出與連接條件匹配的數據行,它使用比較運算符來比較被連接的值。
等值連接
select * from stu as s,mark as m where s.id=m.id;
或者
select * from stu as s,mark as m inner join on s.id=m.id;
(查詢mark表的id 與stu表的id相等的所有的列值) inner join 連接了兩個表
ON條件:是過濾兩個鏈接表笛卡爾積形成的 中間表的 約束條件。
意思是上方查詢的是兩個表的所有列,形成了一個笛卡爾積,以此基礎上的約束條件是s.id=m.id
where條件:1在沒有on條件的單表查詢中, 是限制物理表或者 中間記錄查詢結果的約束
2.在有on的時候是兩表形成的中間表的查詢條件
on只進行連接操作,where只過濾物理表/中間表的記錄
having 用在分組中 group by having
不等值連接
運算符有: !=,<,<=, >,>=,<>(不等於), between
select *from stu as s,mark as m where s.id=m.id and m.mark>50;
(在上方等值連接的基礎上,在加一個查詢條件mark>50分)
自然連接:在連接條件中使用等於(=)運算符比較被連接列的列值,但它使用選擇列表指出查詢結果集合中所包括的列,並刪除連接表中的重複列
說明:select *from mark,stu ; 返回的是兩個表的笛卡爾積
若 mark表內有4條記錄, stu有3條記錄,那麼返回就是3×4=12條記錄
2)外連接查詢
左連接left join
以左邊表爲準,左邊有有幾條記錄,返回就幾條。
select * from stu as s left join mark as m on s.id=m.id;
假設stu表3條記錄,mark表2條記錄,以stu爲準的話,返回3條記錄,但是mark不夠,就以null填充
右連接right join
以右邊的表爲準
全連接
沒有以左表爲準還是以右表爲準。
3)聯合查詢union all
select *from student union all select *from course;
(把兩個表分別查到的數據放到一起,聯合查詢)
4)子查詢
1)視圖(概念,如何使用,作用,注意事項)
2)子查詢,標量子查詢,關聯子查詢
3)各種常用函數
4.多表查詢
1)表的加法
2)聯結查詢,交叉連接,內連接,外連接(左連接,右連接),全連接
3)聯結應用案列
4)case表達式
sql常見面試題: