# 查詢結果'SELECT*FROM t_student;-- =在where 子句后面表示 等于SELECT*FROM t_student WHERE stu_sex='男';-- 不等于男SELECT*FROM t_student WHERE stu_sex<>'男';SELECT*FROM t_student WHERE stu_sex!='男';SELECT*FROM t_student WHERE stu_score>60;SELECT*FROM t_student WHERE stu_score>=60;-- 邏輯運算-- and 與 or 或 not 非-- and 多個條件并列,必須全部成立SELECT*FROM t_student WHERE stu_score>=60AND stu_sex='男';-- or多個條件 符合一個就行SELECT*FROM t_student WHERE stu_score>=60OR stu_sex='男';# 查詢成績合格學生>=60 <=100SELECT*FROM t_student WHERE stu_score>=60AND stu_score<=100SELECT*FROM t_student WHERE stu_score BETWEEN60AND100;
模糊查詢
like 是否匹配一個模式 一般和通配符搭配使用 可以判斷字符數值或者數值型
通配符: % 任意多個字符,包含0個字符 _ 只能匹配單個字符
between and 兩者直接 閉區間
in 判斷某字段的值是否屬于in列表中的某一項
is null (為空) 或者is not null(不為空)
SELECT*FROM t_student WHERE stu_name LIKE'聶%'SELECT*FROM t_student WHERE stu_name LIKE'聶_'SELECT*FROM t_student WHERE stu_name LIKE'%聶%'-- 查詢成績為80和90的學生SELECT*FROM t_student WHERE stu_score=80OR stu_score=90OR stu_score=100;SELECT*FROM t_student WHERE stu_score IN(80,90,100)SELECT*FROM t_student WHERE stu_score NOTIN(80,90,100)-- 查詢性別不為空的-- is null (為空) 或者is not null(不為空)SELECT*FROM t_student WHERE stu_sex ISNULL;SELECT*FROM t_student WHERE stu_sex ISNOTNULL;
UNION和UNION ALL
union用的比較多的是union all是直接連接,取到得得所有得值,記錄可能重復
union是取唯一值,記錄沒有重復
UNION Union將會按照字段的順序進行排序;UNION ALL只是簡單的將兩個結果合并后就返回。
1、對重復結果的處理:UNION在進行表鏈接后會篩選掉重復的記錄,Union All不會去除重復記錄。 2、對排序的處理:Union將會按照字段的順序進行排序;UNION ALL只是簡單的將兩個結果合并后就返回。 從效率上說,UNION ALL 要比UNION快很多,所以,如果可以確認合并的兩個結果集中不包含重復數據且不需要排序時的話,那么就使用UNION ALL。
/*
UNION
Union將會按照字段的順序進行排序;UNION ALL只是簡單的將兩個結果合并后就返回。
*/# union是取唯一值 記錄沒有重復 sql1與 sql2 查詢列 必須一一對應 負責出現數據混亂2q/*
union語法
sql1
union
sql2union all語法
sql1
union all
sql2
*/SELECT`stu_num`,`stu_name`,`stu_birth`FROM t_student WHERE stu_name LIKE'聶%'UNIONSELECT`stu_name`,`stu_num`,`stu_phone`FROM t_student WHERE stu_name LIKE'聶%'SELECT`stu_num`,`stu_name`FROM t_student WHERE stu_name LIKE'聶%'UNIONALLSELECT`stu_num`,`stu_name`FROM t_student WHERE stu_name LIKE'聶%'
排序
查詢結果排序
,使用 ORDER BY 子句排序 order by 排序列 ASC/DESC
asc代表的是升序,desc代表的是降序,如果不寫,默認是升序
order by子句中可以支持單個字段、多個字段、表達式、函數、別名
-- order by DESC 降序 asc代表的是升序-- 默認是按照主鍵-- 指定排序序列,排序規則SELECT*FROM t_student ORDERBY`stu_num`DESCSELECT*FROM t_student ORDERBY`stu_num`ASC-- 在條件后添加 排序SELECT*FROM t_student WHERE stu_sex='男'ORDERBY`stu_num`ASC
#限制行數-- SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset;-- 提取前三條數據SELECT*FROM t_student LIMIT3;-- 查詢成績前兩名的學生 查詢前兩條 SELECT*FROM t_student WHERE stu_score>0ORDERBY`stu_score`DESCLIMIT3;-- 查詢前兩個 分頁 limit (開始位置由0開始 ,數量)SELECT*FROM t_student WHERE stu_score>0ORDERBY`stu_score`DESCLIMIT0,2;-- 功能同上SELECT*FROM t_student WHERE stu_score>0ORDERBY`stu_score`DESCLIMIT2OFFSET0;
分組查詢
語法:
select 分組函數,列(要求出現在group by的后面) from 表 [where 篩選條件] group by 分組的列表 [having 分組后的篩選] [order by 子句]
注意:查詢列表比較特殊,要求是分組函數和group by后出現的字段
分組查詢中的篩選條件分為兩類: 數據源 源位置 關鍵字 分組前篩選 原始表 group by子句的前面 where 分組后篩選 分組后的結果集 group by的后面 having
SELECT stu_sex ,COUNT(*)FROM t_student GROUPBY stu_sex;SELECT stu_sex ,MAX(`stu_score`)FROM t_student GROUPBY stu_sex;-- 添加查詢條件SELECT stu_sex ,COUNT(*) c
FROM t_student
WHERE stu_score>0-- 分組前對數據進行篩選過濾GROUPBY stu_sex -- 分組ORDERBY c DESC-- 對組后的結果進行排序LIMIT1;-- 查詢性別人數大于2的 是哪個性別 對分組后的結果進行條件篩選SELECT stu_sex ,COUNT(*) c
FROM t_student
WHERE stu_score>0-- 分組前對數據進行篩選過濾GROUPBY stu_sex
HAVING c>2-- 對分組后進行條件過濾ORDERBY c DESC-- 對組后的結果進行排序
子查詢
含義:
出現在其他語句中的select語句,稱為子查詢或內查詢;外部的查詢語句,稱為主查詢或外查詢.
分類:
按照子查詢出現得位置:
select后面: 僅僅標量子查詢
from后面:支持表子查詢
where或having后面:支持標量子查詢,列子查詢,行子查詢(較少)
exists后面(相關子查詢):支持表子查詢
按功能、結果集的行列數不同:
標量子查詢(結果集只有一行一列)
列子查詢(結果集只有一列多行)
行子查詢(結果集有一行多列)
表子查詢(結果集一般為多行多列)
# 子查詢出現在其他語句中的select語句-- 其他語句 insert update delete select-- 在insert語句中使用子查詢INSERTINTO t_student(stu_name,stu_sex)SELECT stu_name,stu_sex FROM student WHERE stu_num=2# 在update語句中 使用子查詢, 注意查詢的結果不能再本表中UPDATE t_student SET stu_name ='王'WHERE stu_num =(SELECT stu_num FROM stu_temp WHERE stu_num=2)# 再delete 語句zho使用子查詢, 注意查詢的結果不能在本表中DELETEFROM t_student WHERE stu_num =(SELECT stu_num FROM stu_temp WHERE stu_num=2)-- 在select語句中使用子查詢/*分類:按子查詢出現的位置:select后面:僅僅支持標量子查詢from后面:支持表子查詢where或having后面:支持標量子查詢,列子查詢,行子查詢(較少)exists后面(相關子查詢):支持表子查詢按功能、結果集的行列數不同:標量子查詢(結果集只有一行一列)列子查詢(結果集只有一列多行)行子查詢(結果集有一行多列)表子查詢(結果集一般為多行多列)
*/-- 在select語句后面加子查詢,只是標量子查詢SELECT stu_name,(SELECTNOW()),stu_num FROM t_student-- from后面 支持表子查詢 查詢性別人數大于2de 是哪個性別-- 表子查詢 (結果集一般為多行多列) 把查詢 結果當作一張表處理SELECT*FROM(SELECT stu_sex,COUNT(*) c FROM t_student GROUPBY stu_sex )t
WHERE t.c>2-- 列查詢(一列多行的)SELECT*FROM t_student
WHERE stu_score IN(SELECT stu_score FROM t_student WHERE stu_score >50)-- 行子查詢(結果集有一行多列)-- 查詢學號最小 成績最高的學生 子查詢返回的結果是一行,多列的SELECT*FROM t_student WHERE(stu_num,stu_score)=(SELECTMIN(stu_num),MAX(stu_score)FROM t_student)-- 查詢成績最高的學生信息SELECT*FROM t_student WHERE stu_score =(SELECTMAX(stu_score)FROM t_student)