文章目錄
- Create(insert)
- 指定列的單行插入和全列插入
- 多行全列插入和指定列的多行插入
- 如果主鍵存在,要插入替換存在的值
- replace
- 基本select
- 全列查詢
- 指定列查詢
- where子句
- where子句案例
- 語文成績在 [80, 90] 分的同學及語文成績
- 數學成績是 58 或者 59 或者 98 或者 99 分的同學及數學成績
- 姓孫的同學 及 孫某同學
- 語文成績好于英語成績的同學
- 總分在 200 分以下的同學
- 語文成績 > 80 并且不姓孫的同學
- 孫某同學,否則要求總成績 > 200 并且 語文成績 < 數學成績 并且 英語成績 > 80
- NULL 的查詢
- order by 子句
- order by 子句案例
- NULL值比任何值都小
- 查詢同學各門成績,依次按 數學降序,英語降序,語文升序的方式顯示
- 查詢姓孫的同學或者姓曹的同學數學成績,結果按數學成績由高到低顯示
- 篩選分頁結果
CRUD : Create(創建), Retrieve(讀取),Update(更新),Delete(刪除)
Create(insert)
指定列的單行插入和全列插入
create table students(
id int unsigned primary key auto_increment,
sn int unsigned unique key,
name varchar(30) not null,
qq varchar(30) unique key
);
// 指定列插入
insert into students (sn,name,qq) values(1,'張三','123456789');
// 全列插入
insert into students values(12,2,'李四','12345678');
// into可以省略
insert students values(13,3,'王五','123456');
多行全列插入和指定列的多行插入
// 全列插入
insert into students values(15,5,'曹操','12345'),
(16,6,'諸葛亮','123');
// 指定列插入
insert into students (sn,name,qq) values(6,'項羽','125'),(7,'張飛','126');
如果主鍵存在,要插入替換存在的值
- 由于 主鍵 或者 唯一鍵 對應的值已經存在而導致插入失敗
// 發生主鍵沖突,把主鍵后面的屬性都修改了
// 要更新的值不能和其他的主鍵和唯一鍵沖突
insert into students values(13,132,'xuyou','111111') on duplicate key update sn=132,name='xuyou',qq='111111';
2. 1行被影響,等價于數據直接插入,2行被影響,表中有沖突數據并且要被update更新,0行被影響,表中的老的數據和update要更新的值是一樣的
3. 通過 MySQL 函數獲取受到影響的數據行數
select row_count();
-1表示沒有行受到影響
1行受到影響
replace
- 主鍵 或者 唯一鍵 沒有沖突,則直接插入
- 主鍵 或者 唯一鍵 如果沖突,則刪除后再插入
replace into students (name,name,qq) values(222,'張三','123');
- 1 row affected:表中沒有沖突數據,數據被插入
- 2 row affected:表中有沖突數據,刪除后重新插入
基本select
全列查詢
- *,通配符,可以進行全列查詢,把所有數據都遍歷一遍,公司中不建議使用 * ,因為數據庫的數據太多了,全遍歷還是不方便查看
select * from 表名
指定列查詢
- 指定列的順序不需要按定義表的順序來
select name,math,id from 表名
- select 可以幫你計算出表達式放到這一列中
4. 可以重命名表達式的名字
5. 也可以不帶as重命名
// 多加一列,數學+10分的列
select name 姓名,math 數學,math+10 from exam_result;
6. 對查詢結果進行去重
where子句
- where可以篩選行,只要包含了=的是不可以用來比較NULL的,是不安全的
- 比較運算符
3. 邏輯運算符
select name,english from exam_result where english < 60;
where子句案例
語文成績在 [80, 90] 分的同學及語文成績
select chinese,name from exam_result where chinese between 80 and 90;
select chinese,name from exam_result where chinese >= 80 and chinese <= 90;
數學成績是 58 或者 59 或者 98 或者 99 分的同學及數學成績
- in,如果是 option 中的任意一個,返回 TRUE(1)
select name,math from exam_result where math = 58 or math = 59 or math = 98 or math = 99;
// in表示只要在括號中存在的就滿足條件
select name,math from exam_result where math in(58,59,98,99);
姓孫的同學 及 孫某同學
- like,模糊匹配。% 表示任意多個(包括 0 個)任意字符;_ 表示任意一個字符
// 把姓孫的都匹配出來
select name from exam_result where name like '孫%';
// 把孫某匹配出來
select name from exam_result where name like '孫_';
語文成績好于英語成績的同學
select name,chinese,english from exam_result where chinese > english;
總分在 200 分以下的同學
select name,chinese+english+math as total from exam_result where chinese+english+math < 200;
- 篩選的條件是先從哪個表中找,再按條件篩選,最后要篩選出對應的屬性,第三步才知道total,所以第二步才會報錯
語文成績 > 80 并且不姓孫的同學
select name,chinese from exam_result where chinese > 80 and name not like '孫%';
孫某同學,否則要求總成績 > 200 并且 語文成績 < 數學成績 并且 英語成績 > 80
select name,chinese,math,english,chinese+math+english as 總分 from exam_result where name like '孫_' or (chinese+math+english > 200 and chinese < math and english > 80);
NULL 的查詢
- ’ ‘和NULL是不一樣的,’ '是空串
select * from test where name is null;
select * from test where name is not null;
2. NULL和任何數比較都是NULL,NULL是不參與比較的
3. <=> 可以用于NULL比較,0表示假,1表示真
order by 子句
- asc為升序,desc為降序,默認是asc
- SELECT … FROM table_name [WHERE …]
ORDER BY column [ASC|DESC], […];
// 按數學成績升序排序
select name,math from exam_result where order by math asc;
// 按數學成績降序排序
select name,math from exam_result where order by math desc;
order by 子句案例
NULL值比任何值都小
查詢同學各門成績,依次按 數學降序,英語降序,語文升序的方式顯示
- 如果數學成績相同,按照英語成績升序的順序排列,如果數學,英語成績相同,按照語文升序的順序排列
select name,math,english,chinese from exam_result where order by math desc,english desc,chinese asc;// 不顯示給升序和降序,默認是升序排序
select name,math,english,chinese from exam_result
where order by math;
- 可以使用別名了,因為是先有別名,再使用別名
查詢姓孫的同學或者姓曹的同學數學成績,結果按數學成績由高到低顯示
- order by的執行順序是比where的順序要晚
select name,math from exam_result where name like '孫%' or name like '曹%' order by math desc;
篩選分頁結果
// 篩選出前5行的數據
select * from exam_result limit 5;
2. 從第二條記錄開始篩選
// n表示行數,s表示從下標哪個位置開始篩選
select * from test limit n offset s;
3. 對未知表進行查詢時,最好加一條 LIMIT 1,避免因為表中數據過大,查詢全表數據導致數據庫卡死
4. 也可以進行分頁操作,如下圖,按三行分1頁
5. 需要有數據才能排序,只有數據準備好了,你才需要顯示,limit的本質功能是’顯示’數據,并且limit的順序等級是最后的,在排序后
6. 需要排序好后再分頁查看,比如要查看5到10名的成績,則需要排升序,再分頁