-- 结果集中会自动去重复数据 SELECTDISTINCT Company FROM Orders ;
-- 表 Persons 字段 Id_P 等于 Orders 字段 Id_P 的值, -- 结果集显示 Persons表的 LastName、FirstName字段,Orders表的OrderNo字段 SELECT p.LastName, p.FirstName, o.OrderNo FROM Persons p, Orders o WHERE p.Id_P = o.Id_P;
-- gbk 和 utf8 中英文混合排序最简单的办法 -- ci是 case insensitive, 即 “大小写不敏感” SELECT tag, COUNT(tag) from news GROUPBY tag orderbyconvert(tag using gbk) collate gbk_chinese_ci; SELECT tag, COUNT(tag) from news GROUPBY tag orderbyconvert(tag using utf8) collate utf8_unicode_ci;
UPDATE
Update 语法 语句用于修改表中的数据。
1
UPDATE 表名称 SET 列名称1= 值1, 列名称2= 值2, ... WHERE 条件;
1 2 3 4 5 6
-- update语句设置字段值为另一个结果取出来的字段 UPDATEuserset name = (SELECT name from user1 WHERE user1.id =1 ) WHERE id = (SELECT id from user2 WHERE user2.name='小帆');
-- 更新表 orders 中 id=1 的那一行数据更新它的 title 字段 UPDATE `orders` set title='这里是标题'WHERE id=1;
-- 列出所有在中国表(Employees_China)和美国(Employees_USA)的不同的雇员名 SELECT E_Name FROM Employees_China UNIONSELECT E_Name FROM Employees_USA
-- 列出 meeting 表中的 pic_url, -- station 表中的 number_station 别名设置成 pic_url 避免字段不一样报错 -- 按更新时间排序 SELECT id,pic_url FROM meeting UNIONALL SELECT id,number_station AS pic_url FROM station ORDERBY update_at;
-- 通过 UNION 语法同时查询了 products 表 和 comments 表的总记录数,并且按照 count 排序 SELECT'product'AS type, count(*) as count FROM `products` union select'comment'as type, count(*) as count FROM `comments` orderby count;
UNION ALL 不会去重!
BETWEEN
BETWEEN 语法 运算符选择给定范围内的值
1
SELECT 列名称(s) FROM 表名称 WHERE 列名称 BETWEEN 值1AND 值2;
-- 列出表 Orders 字段 OrderPrice 列最大值, -- 结果集列不显示 OrderPrice 显示 LargestOrderPrice SELECTMAX(OrderPrice) AS LargestOrderPrice FROM Orders
-- 显示表 users_profile 中的 name 列 SELECT t.name from (SELECT*from users_profile a) AS t;
-- 表 user_accounts 命名别名 ua,表 users_profile 命名别名 up -- 满足条件 表 user_accounts 字段 id 等于 表 users_profile 字段 user_id -- 结果集只显示mobile、name两列 SELECT ua.mobile,up.name FROM user_accounts as ua INNERJOIN users_profile as up ON ua.id = up.user_id;
JOIN 多表查询
JOIN 子句用于根据两个或多个表之间的相关列组合来自两个或多个表的行。
JOIN: 如果表中有至少一个匹配,则返回行
INNER JOIN:在表中存在至少一个匹配时,INNER JOIN 关键字返回行。
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行(MySQL 是不支持的,通过 LEFT JOIN + UNION + RIGHT JOIN 的方式 来实现)
INNER JOIN
INNER JOIN 语法 选择在两个表中具有匹配值的记录。
1 2 3 4
SELECT 列名称(s) FROM 表1 INNERJOIN 表2 ON 表1.列名称 = 表2.列名称;
1 2 3 4 5 6 7 8
-- 选择包含 Customers 的所有 Orders: SELECT Orders.OrderID, Customers.CustomerName FROM Orders INNERJOIN Customers ON Orders.CustomerID = Customers.CustomerID;
-- [JOIN 三张表] 选择包含 Customers 和 Shippers 的所有 Orders: SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperName FROM Orders INNERJOIN Customers ON Orders.CustomerID = Customers.CustomerID INNERJOIN Shippers ON Orders.ShipperID = Shippers.ShipperID;
SELF JOIN
自连接是INNER JOIN的进阶应用。
1 2 3 4 5 6 7 8 9 10 11 12 13
-- 查询同名但不同员工编号的人 SELECT e1.name, e2.empno, e1.empno FROM emp e1 JOIN emp e2 ON e1.name = e2.name AND e1.empno < e2.empno; -- ⚠️ 使用 < 避免重复显示(如使用 <> 会显示两次)
-- 查询同一部门、时间重叠的记录 SELECT j1.empno, j2.empno, j1.deptno, j1.start_date AS comm_start FROM job_history j1 JOIN job_history j2 ON j1.deptno = j2.deptno AND j1.empno <> j2.empno AND j1.start_date BETWEEN j2.start_date AND j2.end_date;
LEFT JOIN
LEFT JOIN 语法 返回左表 (表1) 中的所有记录,以及右表 (表2) 中的匹配记录
1 2 3 4
SELECT 列名称(s) FROM 表1 LEFTJOIN 表2 ON 表1.列名称 = 表2.列名称;
1 2 3 4
-- 将选择所有 Customers 以及他们可能拥有的任何 Orders: SELECT Customers.CustomerName, Orders.OrderID FROM Customers LEFTJOIN Orders ON Customers.CustomerID = Orders.CustomerID ORDERBY Customers.CustomerName;
RIGHT JOIN
RIGHT JOIN 语法 返回右表 (表2) 中的所有记录,以及左表 (表1) 中的匹配记录
1 2 3 4
SELECT 列名称(s) FROM 表1 RIGHTJOIN 表2 ON 表1.列名称 = 表2.列名称;
1 2 3 4
-- 返回所有 Employees 以及他们可能下的任何 Orders: SELECT Orders.OrderID, Employees.LastName, Employees.FirstName FROM Orders RIGHTJOIN Employees ON Orders.EmployeeID = Employees.EmployeeID ORDERBY Orders.OrderID;
FULL OUTER JOIN
FULL OUTER JOIN 语法 当左(表1)或右(表2)表记录中存在匹配时,关键字返回所有记录
1 2 3 4 5
SELECT 列名称(s) FROM 表1 FULLOUTERJOIN 表2 ON 表1.列名称 = 表2.列名称 WHERE 条件;
SQL 聚合函数
COUNT
COUNT 语法 返回与指定条件匹配的行数
1
SELECTCOUNT(列名称) FROM 表名称 WHERE 条件;
1 2 3 4 5 6 7 8 9
-- 表 Store_Information 有几笔 store_name 栏不是空白的资料。 -- "IS NOT NULL" 是 "这个栏位不是空白" 的意思。 SELECTCOUNT (Store_Name) FROM Store_Information WHERE Store_Name ISNOT NULL;
-- 获取 Persons 表的总数 SELECTCOUNT(1) AS totals FROM Persons;
-- 获取表 station 字段 user_id 相同的总数 select user_id, count(*) as totals from station groupby user_id;
AVG
AVG 语法 返回数值列的平均值
1
SELECTAVG(列名称) FROM 表名称 WHERE 条件;
1 2
-- 查找 Products 表中所的 Price 平均值: SELECTAVG(Price) FROM Products;
SUM
SUM 语法 返回数值列的总和
1
SELECTSUM(列名称) FROM 表名称 WHERE 条件;
1 2
-- 查找 OrderDetails 表中 Quantity 字段的总和: SELECTSUM(Quantity) FROM OrderDetails;
MAX
MAX 语法 返回所选列的最大值
1
SELECTMIN(列名称) FROM 表名称 WHERE 条件;
1 2 3
-- 列出表 Orders 字段 OrderPrice 列最大值, -- 结果集列不显示 OrderPrice 显示 LargestOrderPrice SELECTMAX(OrderPrice) AS LargestOrderPrice FROM Orders
MIN
MIN 语法 返回所选列的最小值
1
SELECTMIN(列名称) FROM 表名称 WHERE 条件;
1 2
-- 查找 Products 表中 Price 字段最小值,并命名 SmallestPrice 别名: SELECTMIN(Price) AS SmallestPrice FROM Products;
Subqueries 子查询
标量子查询
1 2 3 4
-- 返回单值的子查询 SELECT name, salary FROM emp WHERE salary > (SELECTAVG(salary) FROM emp);
子查询可以搭配运算符 – IN / NOT IN:是否在集合中 – > / < / = / >= / <= / <>:比较运算