Mysql的指定查詢、模糊查詢、SELECT結構
阿新 • • 發佈:2021-06-18
4、DQL查詢資料(重點)
Data Query Language : 資料查詢語言
- 使用頻率高
4.2 指定查詢欄位
-- 查詢全部的學生,select 欄位 from 表 SELECT * FROM student -- 查詢指定欄位----起別名 SELECT `SNO` AS 學號,`SNAME` AS 學生姓名 FROM student -- 也可以給欄位起別名 SELECT `SNO` AS 學號,`SNAME` AS 學生姓名 FROM student AS S1 -- 函式 Concat(a,b) SELECT CONCAT('姓名: ',SNAME) AS 新名字 FROM student -- 結果展示:如下圖
有時候,列明不是那麼的見名知意,
我們起別名: 使用AS
- 欄位名 AS 別名1
- 表名 AS 別名2
去重 DISTINCT
去除SELECT查詢出來的結果中重複的資料,重複的資料只顯示一條
-- 查詢那些同學參加了考試
SELECT * FROM result -- 全部考試成績
-- 查詢成績
SELECT DISTINCT `GRADE` FROM result
一些自帶的可以查詢的東西,瞭解下
SELECT VERSION() -- 查詢系統版本(函式) SELECT 100+3-1 AS 計算結果 -- 用來計算(表示式) SELECT @@auto_increment_increment -- 查詢自增的步長(變數)
-- 學員的考試成績 +1 檢視
SELECT `SNO`,`result`+1 AS '提分後' FROM result
資料庫中的表示式:文字值,列,函式,NULL,計算表示式,系統變數
select 表示式 from 表
4.3、where條件子句
作用:檢索資料中符合條件的資料
搜尋的條件是由一個或者多個表示式組成,結果為布林值
邏輯運算子
運算子 | 語法 | 描述 |
---|---|---|
&& and | a and b a && b | 邏輯與 |
|| or | a or b a || b | 邏輯或 |
! Not | not a !a | 邏輯非(取反) |
儘量使用英文字母
+++
程式碼展示
-- where
SELECT `sno` AS '學號',`grade` AS '成績'
FROM SC
where grade >= 95 AND grade <= 100
-- 上面的例子儘量使用 AND 不要使用 &&
-- 模糊查詢
SELECT sno,`grade`
FROM SC
WHERE grade between 95 and 100
-- c除了1000號學生的成績
SELECT sno,`grade`
FROM SC
WHERE NOT sno = 1000
-- 或者是下面的這種方式
SELECT sno,`grade`
FROM SC
WHERE sno != 1000
-- 多個條件查詢
-- 成績在95~100之間且學號不是1002的學生
SELECT sno,`grade`
FROM SC
WHERE grade between 90 AND 100 AND sno != 1002
模糊查詢:比較運算子
運算子 | 語法 | 描述 |
---|---|---|
IS NULL | a is null | 如果操作符為null,結果為真 |
IS NOT NULL | a is not null | 如果操作符不為null,結果為真 |
BETWEEN | a BETWEEN b and c | 若 a 在 b 和 c 之間,則結果為真 |
like | a like b | SQL匹配,如果a匹配b,則結果為真 |
IN | a in (a1,a2,a3......) | 假設 a 在a1,或者a2其中的某個值,則結果為真 |
-- 模糊查詢
-- 查詢姓劉的同學
SELECT `sno`,`sname`
FROM `student`
WHERE sname LIKE '劉%';
-- 查詢姓劉的同學,名字後面只有一個字
SELECT `sno`,`sname`
FROM `student`
WHERE sname LIKE '劉_';
-- 查詢姓劉的同學,名字後面只有2個字
SELECT `sno`,`sname`
FROM `student`
WHERE sname LIKE '劉__';
-- 查詢名字中間有 ‘嘉’字的同學
SELECT `sno`,`sname`
FROM `student`
WHERE sname LIKE '%嘉%';
-- -----------IN-------------------------------------
-- 查詢指定的學員資訊--1001 1002 1003
SELECT `sno`,`sname`
FROM `student`
WHERE sno IN ('1001','1002','1003');
-- 查詢在北京的人
SELECT sno ,sname
FROM `student`
WHERE `address` IN ('北京');
-- 查詢地址為空的學生
SELECT `sno`,`sname`
FROM `student`
WHERE `address` = ' ' OR `address` IS NULL
-- 查詢有出生日期的同學,意思就是出生日期不為空
SELECT `sno`,`sname`
FROM `student`
WHERE `bornDate` IS NOT NULL
4.4、 聯表查詢
JOIN對比
---------------------聯表查詢--------------------------
-- 1、分析需求<分析需要的資料來自那幾個表>
-- 2、確定使用什麼查詢 上面的7種
-- 3、使用共同的屬性來連線屬性
-- 查詢參加考試的同學資訊及成績
SELECT s.sno,`sname`,`cno`,`grade`
FROM student AS 's'
INNER JOIN SC AS 'r' -- 連線兩個表並取別名
ON s.sno = r.sno
-- Right JOIN
SELECT s.sno,`sname`,`cno`,`grade`
FROM student AS 's' -- 取別名可以 一個空格解決
RIGHT JOIN SC AS 'r' -- 連線兩個表並取別名
ON s.sno = r.sno
-- LIFT JOIN
SELECT s.sno,`sname`,`cno`,`grade`
FROM student AS 's' -- 取別名可以 一個空格解決
LEFT JOIN SC AS 'r' -- 連線兩個表並取別名
ON s.sno = r.sno
-- 左表和右表的位置
-- 是由LIGHT JOIN 前後的位置決定的,join之前的就是左表,後邊就是右表
操作 | 描述 |
---|---|
INNER JOIN(並集) | 如果表中至少有一個匹配就返回行<元組>, |
LEFT JOIN | 會從左表中返回所有的值,即使在右表中沒有匹配到。-----例子:kuangshen同學沒有考試,會有記錄,但是成績為NULL |
RIGHT JOIN | 會從右表中返回所有的值,即使在左表中沒有匹配到。 |
-- 查詢缺考的同學
SELECT s.sno,`sname`,`cno`,`grade`
FROM student AS 's'
LEFT JOIN SC AS 'r'
ON s.sno = r.sno
WHERE grade IS NULL;
join <連線的表>on <判斷的條件> 是連線查詢
WHERE 等值查詢
-- 思考:查詢參加考試的同學的所有資訊,包括使用科目資訊
SELECT s.sno,`sname`,`cname`,`grade`
FROM student s
Right Join sc r -- 第一次連線
ON r.sno = s.sno
Inner JOIN course sub -- 第二次連線
ON r.cno = sub.cno
-- 假設存在一種多張表查詢,慢慢來,先查詢兩張表再慢慢增加
4.6、自連線以及聯表查詢
自連線: 瞭解
自己的表和自己的表連線,核心:一張表拆成兩個一樣的表來即可
父表
categoryid | categoryName |
---|---|
2 | 資訊科技 |
3 | 軟體開發 |
5 | 美術設計 |
子表
pid | categoryid | categoryName |
---|---|---|
3 | 4 | 資料庫 |
2 | 8 | 辦公資訊 |
3 | 6 | Web開發 |
5 | 7 | ps技術 |
操作:查詢父類對應的子類關係
父類 | 子類 |
---|---|
資訊科技 | 辦公資訊 |
軟體開發 | 資料庫 |
美術設計 | web開發 |
軟體開發 | ps技術 |
-- 查詢父子資訊
SELECT a.`categoryName` AS '父欄目',b.`categoryName` AS '子欄目'
FROM `category` AS a,`category` AS b
WHERE a.`categoryid` = b.`pid`;
-- 查詢學員所屬的年級,學號,學生姓名,年級名稱
SELECT s.`sno`,`sname`,`gradeName`
FROM student s
INNER JOIN `SC` g
ON S.`GRADEID` = G.`GRADEID`;
-- 查詢科目所屬的年級(科目名稱,年級名稱)
SELECT c.`cno`,`gradeName`
FROM Course c
INNER JOIN `SC` g
ON c.`cno` = g.`cno`;
-- 查詢參加資料庫-1 考試的同學資訊,學號,學生姓名,科目名,分數
SELECT
FROM student s
INNER JOIN `SC` g
ON s.sno = g.sno -- 連線學生表和成績表
INNER JOIN course c
ON g.cno = c.cno -- 連線科目表和 前面已經連線的表
WHERE c.cno = '資料庫-1';
select完整的語法結構: