學生表
CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,`sex` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,`age` int(11) DEFAULT NULL,`c_id` int(10) DEFAULT NULL,PRIMARY KEY (`id`),KEY `c_id` (`c_id`),CONSTRAINT `student_ibfk_1` FOREIGN KEY (`c_id`) REFERENCES `class` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1574588396 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
班級表
CREATE TABLE `class` (`id` int(11) NOT NULL AUTO_INCREMENT,`c_name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
查詢:
詢是數據庫操作的核心,用于從數據庫中檢索、插入、更新和刪除數據。
-- 從表中選取所有列的數據
SELECT * from student
-- 從表中選取指定列的數據
select name,age,sex FROM student;
?
between:
在 SQL 里,BETWEEN
?操作符是一個很實用的工具,主要用于篩選出指定范圍內的數據。此范圍涵蓋數值、日期或者文本等不同類型的數據。
SELECT * from student where age BETWEEN 20 and 100;
?
in:
在 SQL 中,IN
?操作符是一個常用的條件篩選工具,它允許你在?WHERE
?子句里指定多個值,用于判斷某列的值是否包含在給定的值列表中。
select * from student where age in(45,21);
select * from student where id in(1,3);
?
?與或非:
1.?AND
?運算符
AND
?運算符用于在?WHERE
?子句中連接多個條件,只有當所有條件都為真時,對應的記錄才會被返回。
SELECT *
FROM employees
WHERE department = 'IT' AND salary > 5000;
此查詢僅會返回?department
?是?IT
?并且?salary
?超過 5000 的員工記錄,也就是?Bob
?和?David
?的信息。
2.?OR
?運算符
OR
?運算符同樣用于在?WHERE
?子句中連接多個條件,只要其中任何一個條件為真,對應的記錄就會被返回。
SELECT column1, column2, ...
FROM table_name
WHERE condition1 OR condition2 OR ...;
該查詢會返回?department
?為?IT
?或者?salary
?大于 6000 的員工記錄,即?Bob
、Charlie
?和?David
?的信息。
3.?NOT
?運算符
NOT
?運算符用于對一個條件取反,也就是當條件為假時,對應的記錄才會被返回。
SELECT column1, column2, ...
FROM table_name
WHERE NOT condition;
通過靈活運用?AND
、OR
?和?NOT
?運算符,你能夠構建出滿足各種需求的復雜查詢條件。
ISNULL()函數的使用
ISNULL(expr),如果expr的值為null,則返回1,如果expr1的值不為null,則返回0。
SELECT * from student where age is not null;
?
模糊查找
在 SQL 中,模糊查找是一種強大的功能,允許你在數據庫中查找與特定模式匹配的數據,而不是精確匹配。這在處理文本數據時特別有用,比如在搜索功能中。主要通過?LIKE
?操作符結合通配符來實現。
通配符
- 百分號(
%
):代表零個、一個或多個任意字符。 - 下劃線(
_
):代表單個任意字符。 - 方括號(
[]
):用于指定一個字符范圍,只適用于部分數據庫系統(如 SQL Server)。 - 脫字符(
[^ ]
):用于排除指定字符范圍,同樣只適用于部分數據庫系統(如 SQL Server)
SELECT * from student where name like"呂_";
SELECT * from student where name like"呂__";
SELECT * from student where name like"呂%";
SELECT * from student where name like"%呂"
?
分頁查詢
在 SQL 里,LIMIT
?是進行分頁查詢的常用關鍵字,它能限定查詢結果返回的行數,借助?LIMIT
?與偏移量,就能實現分頁查詢。不過不同數據庫系統對?LIMIT
?的使用方式稍有差異。
-- limit a,b a表示起始索引值 b表示查詢個數
-- limt b offset a
SELECT * from student limit 0,5;
SELECT * from student limit 5,5;
?
排序子語句
在 SQL 中,排序子語句通常指的是?ORDER BY
?子句,它用于對查詢結果集按照一個或多個列進行排序。
-- -- 排序子語句
-- order by 列名 desc 降序 asc升序
select * from student order by age desc;
-- where 排序 限制
SELECT *from student where sex="男" ORDER BY age asc limit 0,5
?
聚合函數 分組函數
在 SQL 中,聚合函數和分組函數(通常借助?GROUP BY
?子句與聚合函數配合使用)是用于對數據進行匯總和分析的重要工具,
?COUNT()
- 功能:用于統計記錄的數量。
- 示例:假設有一個?
employees
?表,要統計員工的數量。
SELECT COUNT(*) FROM employees;
SUM()
- 功能:用于計算某列數值的總和。
- 示例:計算?
employees
?表中所有員工的工資總和。
SELECT SUM(salary) FROM employees;
AVG()
- 功能:用于計算某列數值的平均值。
- 示例:計算?
employees
?表中員工的平均工資。
SELECT AVG(salary) FROM employees;
分組函數(GROUP BY
?子句)
GROUP BY
?子句用于將查詢結果按照一個或多個列進行分組,然后可以對每個組應用聚合函數。
-- 聚合函數 分組函數
-- min() 最小 max()最大 sum()求和 avg() 求平均 count()數量-->count不統計null字段
-- HAVING 子句:如果你需要對分組后的結果進行過濾,應該使用 HAVING 子句而不是 WHERE 子句。WHERE子句在數據分組前進行過濾,而 HAVING 子句在數據分組后對分組的結果進行過濾。
SELECT avg(age),c_id from student where sex="男" GROUP BY c_id having c_id=1;
添加:
insert into student(name,age,sex) values("趙云",18,"男");
?
修改:
UPDATE student set name="諸葛亮",age=100,sex="男" where id=14;
?
刪除:
DELETE from student where id=1;
delete from student where id in (5,12,13,4);
多表查詢:
-- 重命名 as 新名字 as可省
select s1.*,c1.c_name 班級名稱 from student as s1,class c1 where s1.c_id=c1.id
連表查詢:
連表查詢(也稱為連接查詢)是 SQL 中一種強大的功能,用于從多個表中檢索相關的數據。當數據分散在不同的表中時,通過連表查詢可以將這些表中的數據組合起來,以滿足特定的查詢需求。
1. 內連接(INNER JOIN)
- 原理:內連接只返回兩個表中滿足連接條件的行,即只返回兩個表中匹配的記錄。
2. 左連接(LEFT JOIN 或 LEFT OUTER JOIN)
- 原理:左連接返回左表中的所有行,以及右表中匹配的行。如果右表中沒有匹配的行,則右表的列值將顯示為?
NULL
。
3. 右連接(RIGHT JOIN 或 RIGHT OUTER JOIN)
- 原理:右連接與左連接相反,它返回右表中的所有行,以及左表中匹配的行。如果左表中沒有匹配的行,則左表的列值將顯示為?
NULL
。
4. 全連接(FULL JOIN 或 FULL OUTER JOIN)
- 原理:全連接返回兩個表中的所有行,無論是否有匹配的行。如果某一行在另一個表中沒有匹配的行,則對應的列值將顯示為?
NULL
SELECT * FROM STUDENT JOIN CLASS ON STUDENT.C_ID=CLASS.ID;
SELECT * FROM STUDENT LEFT JOIN CLASS ON STUDENT.C_ID=CLASS.ID;