SQL高级

in 操作符

允许在WHERE子句中规定多个值.

IN操作符是多个OR条件的简写.

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1, value2, ...);

join 关键字

join : 连接三个表

SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperName
FROM (
    (Orders INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID) 
    INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID
);

left join

LEFT JOIN 关键字会从左表 (table1) 那里返回所有的行,即使在右表 (table2) 中没有匹配的行。如果没有匹配项,则结果从右侧为NULL。

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;

right join

RIGHT JOIN 关键字返回右表(table2)中的所有记录,以及左表(table1)中的匹配记录。当没有匹配项时,左侧的结果为NULL。

SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;

full join

以上 SQL 语句将产生 table1 和 table2 的并集,能匹配和不能匹配的行全部被返回,但是能匹配的行将合并为一行,不能匹配的行将另一个表中的数据用 NULL 值替换

SELECT table1.column1, table2.column2...
FROM table1
FULL JOIN table2
ON table1.common_column1 = table2.common_column2;

group by 语句

以下 SQL 语句列出了每个地区的客户数量,按从高到低排序:

SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
ORDER BY COUNT(CustomerID) DESC;

having子句

在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。

HAVING 子句可以让我们筛选分组后的各组数据。

SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s);
SELECT Employees.LastName, COUNT(Orders.OrderID) AS NumberOfOrders
FROM Orders
INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
WHERE LastName = 'Davolio' OR LastName = 'Fuller'
GROUP BY LastName
HAVING COUNT(Orders.OrderID) > 25;

case 语句

CASE语句遍历条件并在满足第一个条件时返回一个值(如IF-THEN-ELSE语句)。因此,一旦条件为真,它将停止读取并返回结果。如果没有条件为 true,则返回 ELSE 子句中的值。

如果没有其他部分,并且没有条件为 true,则返回 NULL。

CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    WHEN conditionN THEN resultN
    ELSE result
END;
使用case -> 格式 -> [ 各种函数 ] (case 列名1 when 列名2/值 then 1/处理方式 , else null/别的处理方式 end ) as 别名

SELECT
	date `日期`, 
	count(CASE `result` WHEN '胜' THEN 1 else null END) AS `胜`,
	count(CASE `result` WHEN '负' THEN 1 else null END) AS `负`
FROM
	08_t_game
GROUP BY
	date 
SELECT `年份`,
max(CASE `季度` WHEN '1' then `销量` ELSE 0 END) as 一季度,
max(CASE `季度` WHEN '2' then `销量` ELSE 0 END) as 二季度,
max(CASE `季度` WHEN '3' then `销量` ELSE 0 END) as 三季度,
max(CASE `季度` WHEN '4' then `销量` ELSE 0 END) as 四季度
from 07_t_order_sale
GROUP BY `年份`
思路二: 使用if函数

SELECT date `日期`,
		count(IF(result = '胜', 1, NULL)) `胜`,
		count(IF(result = '负', 1, NULL)) `负`
	FROM
		08_t_game
	GROUP BY
		date

IFNULL 函数

SELECT ProductName, UnitPrice * (UnitsInStock + IFNULL(UnitsOnOrder, 0))
FROM Products;

create index 语句

CREATE INDEX 语句用于在表中创建索引。

从本质上看,索引是根据表的一个或者多个字段生成的子表,该子表中的数据已经进行了排序。子表除了包含指定字段中的数据,还包含一个 rowid 列,用于存储当前记录在原始表中的位置。

索引用于更快地从数据库检索数据。用户看不到索引,它们只是用来加速搜索/查询。

在表上创建一个简单的索引。允许使用重复的值:

CREATE INDEX index_name
ON table_name (column1, column2, ...);
在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。

CREATE UNIQUE INDEX index_name
ON table_name (column1, column2, ...);

现在您可以针对 name 字段创建索引,用以提高检索姓名时的效率,如下所示:

CREATE INDEX myIndex
ON website(name);

myIndex 是索引的名字。

删除索引

ALTER TABLE website
DROP INDEX myIndex;
posted @ 2023-03-10 22:30  简筱莜  阅读(46)  评论(0)    收藏  举报