2020 5/9 十九、分頁查詢 應用場景:當要顯示的數據,一頁顯示不全,需要分頁提交sql請求 語法:(執行順序已標出) SELECT 查詢列表 ⑦每執行一步都會生成一個虛擬的結果集 FROM 表名 ① [join type join 表2 ② on 連接條件 ③ where 篩選條件 ④ gro ...
2020 5/9
十九、分頁查詢
應用場景:當要顯示的數據,一頁顯示不全,需要分頁提交sql請求
語法:(執行順序已標出)
SELECT 查詢列表 ⑦每執行一步都會生成一個虛擬的結果集
FROM 表名 ①
[join type join 表2 ②
on 連接條件 ③
where 篩選條件 ④
group by 分組欄位 ⑤
having 分組後的篩選條件 ⑥
order by 排序的字端] ⑧
limit offet,size; ⑨
(offset->要顯示條目的索引(起始索引從0開始),size->顯示的條數)
特點:
① limit語句放在查詢語句的最後面
② 若不加offset(索引),則預設起始索引為0
③ 公式:要顯示的頁數pags,每頁的條數size
select 查詢列表 from 表名 limit (page-1)*size,size;
#案例1:查詢前五條員工信息
SELECT * FROM employees LIMIT 0,5;
SELECT * FROM employees LIMIT 5;
#案例2:查詢第11條-第25條
SELECT * FROM employees LIMIT 10,15;
#案例3:查詢有獎金的員工信息,並且工資較高的前十名顯示出來
SELECT
*
FROM
employees
WHERE
commission_pct IS NOT NULL
ORDER BY
salary DESC
LIMIT 0,
10;
二十、聯合查詢
關鍵字:union(聯合、合併)->將多條查詢結果合併成一個結果
語法:
查詢語句1
union
查詢語句2
union
……
應用場景:要查詢的結果來自於多個表,且多個表中沒有直接的連接關係,但查詢的信息一致時
特點:
① 要求多條語句查詢的查詢列數是一致的!
② 要求多條查詢語句的查詢的每一列的類型和順序最好一致
③ union關鍵字預設是帶去重的,如果使用union all可以包含重覆項
#查詢:查詢部門編號大於90或郵箱中包含a的員工信息
SELECT * FROM employees WHERE department_id>90 OR email LIKE '%a%';
-------------------------------------------------------------
SELECT * FROM employees WHERE department_id >90
UNION
SELECT * FROM employees WHERE email LIKE '%a%';
以上兩種放式等價!!!
#查詢女神表中姓名中有‘周’字的女神名以及男朋友ID和男朋友表中名字有‘鹿’的男生的姓名與ID
SELECT NAME,boyfriend_id FROM beauty WHERE name LIKE '%周%'
UNION
SELECT boyname,id FROM boys WHERE boyname LIKE '%鹿%';
二十一、DML語言(數據操縱語言)
分類:
插入:insert
修改:update
刪除:delete
#插入語句
語法:(方式一》經典插入)
INSERT INTO FROM 表名(列名、列名…) VALUES(值1、值2…);
#1.插入的值類型要與列的類型一致或相容(可以隱式的轉換)
INSERT INTO beauty(id,name,borndate,phone,photo,boyfriend_id)
VALUES(13,'菜菜','2000-12-28','000000',null,0);(插入一條)
INSERT INTO beauty(id,name,borndate,phone,photo,boyfriend_id)
VALUES(16,'菜菜','2000-12-28','000000',null,0),(14,'MIS詹','2001-5-17','000000',null,0)
,(15,'夢玲','2000-7-24','000000',null,0);(插入多條)
#2.可以為null的列如何插入(不可以為null的列必須插入欄位)
#方式一:直接寫為null
#方式二:在表名後要修改的列名直接不寫
INSERT INTO beauty(id,name,phone,boyfriend_id)
VALUES(17,'汪汪','000000',0);
#列的順序可以顛倒,但在給值時需要一一對應
#插入時,列數和值得個數必須一一對應
#列名可以省略,預設為所有列,而且列的順序與表中列的順序一致
INSERT INTO beauty
VALUES(18,'菜菜','2000-12-28','000000',null,0);
語法:(方式二)
INSERT INTO 表名
SET 列名=值,列名=值…
INSERT INTO beauty
SET id=19,name='hdjk',phone='909090';
插入的兩種方式PK
- 方式一支持多行插入,而方式二不支持
- 方式一支持多行子查詢,而方式二不支持
如下(子查詢)
INSERT INTO beauty(id,name,phone)
SELECT 20,'qqqq','688944';
INSERT INTO beauty(id,name,phone)
SELECT 34,boyname,'688944'
FROM boys
WHERE id =3;
#修改語句
1.修改單表的記錄
語法:(執行順序已標出)
update 表名 ①
set 列名=新值,列名=新值,… ③
where 篩選條件; ②
案例:#修改beauty表中姓唐的女神的電話為0000000
UPDATE beauty
SET phone = '0000000'
WHERE name LIKE '周%';
2.修改多表的記錄
語法:(sql92)
update 表1 別名, 表2,別名 ①
set 列名=新值,列名=新值,… ③
where 連接條件 and篩選條件; ②
語法:(sql99)
update 表1 別名
inner|left|right join 表2 別名
on 連接條件
set 列名=新值,列名=新值…
where篩選條件;
(sql99與語法下的)
#案例1:修改張無忌的女朋友的手機號為114[內連接]
UPDATE beauty b
INNER JOIN boys bo
ON b.boyfriend_id = bo.id
SET b.phone = '114'
WHERE bo.boyname='張無忌';
#案例2:修改沒有男朋友的女神的男朋友編號都為2號
UPDATE beauty b
LEFT JOIN boys bo
ON b.boyfriend_id = bo.id
SET b.boyfriend_id=2
WHERE bo.id IS NULL;
#刪除語句
方式一:delete
1.單表的刪除
語法:delete from 表名 where 篩選條件
2.多表的刪除
(sql92)
語法:delete 表1別名,表2別名#想刪除哪個表的信息就寫那個表,都想刪除就都寫
from 表1 別名,表2 別名
where 連接條件 and 篩選條件;
(sql99)
語法:
delete 表1別名,表2別名 #想刪除哪個表的信息就寫那個表,都想刪除就都寫
from 表1 別名
inner|left|right join 表2 別名 on 連接條件
where篩選條件;
(sql99與語法下的)
#刪除張無忌的女朋友的信息
DELETE b
FROM beauty b
INNER JOIN boys bo
ON b.boyfriend_id = bo.id
WHERE bo.boyName = '張無忌';
#刪除黃曉明的信息以及他女朋友的信息
DELETE b,bo
FROM beauty b
INNER JOIN boys bo
ON b.boyfriend_id = bo.id
WHERE bo.boyName = '黃曉明';
方式二:truncate
語法:
truncate table 表名;(不支持鏈家篩選條件)
TRUNCATE TABLE boys;(直接清空)
兩種刪除方式PK
- delete可以加篩選條件,truncate不能加
- truncate刪除,效率高一丟丟
- 假如要刪除的表中有自增長列,
如果用delete刪除後,在插入數據,自增長列的值從斷點開始,
而truncate刪除後,在插入數據,自增長列值從1開始
- truncate刪除後沒有返回值,而delete有(即是否顯示表中有幾行收到影響,若是truncate,則都是0)
- truncate刪除不能回滾,而delete刪除可以回滾