系列博客目錄
文章目錄
- 系列博客目錄
- 1.distinct關鍵字 去除重復
- 2.char_length()
- 3.group by 與 count()連用
- 4.date類型有個函數datediff()
- 5.mod 函數
- 6.join和left join的區別
- 1. **`JOIN`(內連接,`INNER JOIN`)**
- 示例:
- 2. **`LEFT JOIN`(左外連接)**
- 示例:
- 總結:
- 用途:
- 7.AVG函數
- 1. **`AVG()` 函數的基本用法**
- 語法:
- 2. **搭配 `GROUP BY` 使用**
- 示例 1:計算每個部門的平均薪資
- 示例 2:計算每個學生的平均成績
- 3. **不搭配 `GROUP BY` 使用**
- 示例:計算所有員工的平均薪資
- 4. **處理 `NULL` 值**
- 5. **總結**
- 8.
- 9.CONCAT UPPER LOWER SUBSTRING
- 10.
1.distinct關鍵字 去除重復
select distinct author_id as id from Views where author_id = viewer_id order by id;
2.char_length()
select tweet_id from Tweets where char_length(content) > 15;
3.group by 與 count()連用
select customer_id, count(customer_id) as count_no_trans
from Visits left join Transactions on Visits.visit_id = Transactions.visit_id
where transaction_id is null group by customer_id;
4.date類型有個函數datediff()
select a.id
from Weather as a cross join Weather as b on datediff(a.recordDate, b.recordDate) = 1
where a.temperature > b.temperature;
5.mod 函數
select * from cinema where mod(id, 2) = 1 and description != 'boring' order by rating desc;
6.join和left join的區別
在 MySQL 中,JOIN
和 LEFT JOIN
都用于將兩個或多個表連接在一起,但它們之間有重要的區別:
1. JOIN
(內連接,INNER JOIN
)
- 定義:
JOIN
默認是INNER JOIN
,表示僅返回兩個表中滿足連接條件的行。如果一個表中的某一行在另一個表中沒有對應的匹配行,那么該行就不會出現在查詢結果中。 - 行為:
INNER JOIN
返回的是兩個表中匹配的數據行,若某個表的某行在另一個表中找不到對應的匹配行,那么這一行就不會出現在查詢結果中。
示例:
假設有兩個表:
-
students
(學生表)id name 1 Alice 2 Bob 3 Charlie -
courses
(課程表)student_id course 1 Math 2 Science 4 History
查詢:SELECT students.name, courses.course FROM students JOIN courses ON students.id = courses.student_id;
結果:
name | course |
---|---|
Alice | Math |
Bob | Science |
- 只有
students
和courses
表中匹配的行會出現在結果中,Charlie
沒有參加任何課程,所以不會出現在結果中。
2. LEFT JOIN
(左外連接)
- 定義:
LEFT JOIN
返回左表(即FROM
后指定的第一個表)中的所有行,即使這些行在右表(即JOIN
后指定的表)中沒有匹配項。如果左表中的某行在右表中找不到對應的匹配行,那么右表中的字段會用NULL
填充。 - 行為:
LEFT JOIN
返回的是左表中的所有數據行,若右表沒有與左表行匹配的數據,則右表的列將會用NULL
填充。
示例:
使用同樣的表 students
和 courses
,查詢:SELECT students.name, courses.course FROM students LEFT JOIN courses ON students.id = courses.student_id;
結果:
name | course |
---|---|
Alice | Math |
Bob | Science |
Charlie | NULL |
- 即使
Charlie
沒有參加任何課程,LEFT JOIN
仍然返回了Charlie
的數據行,并且courses.course
列顯示為NULL
。
總結:
JOIN
(INNER JOIN
):只返回兩個表中匹配的行。如果某行在另一個表中沒有對應的行,則該行不會出現在結果中。LEFT JOIN
(左外連接):返回左表(FROM
后的表)中的所有行,即使右表中沒有匹配的行。如果右表沒有匹配項,右表的字段會填充NULL
。
用途:
INNER JOIN
:用于只關心兩個表中匹配的記錄,常見于查詢需要聯動的數據。LEFT JOIN
:用于查詢左表中的所有數據,即使右表沒有匹配的記錄。例如,查詢所有學生及其參加的課程,即使有些學生沒有參加任何課程。
mysql中join 我后面不加條件呢?在 MySQL 中,如果在使用 JOIN 時不加連接條件,會發生笛卡爾積(Cartesian Product)。笛卡爾積是指將兩個表的每一行與另一個表的每一行進行配對,導致結果集的行數是兩個表行數的乘積。
7.AVG函數
AVG()
函數是 SQL 中一個聚合函數,用于計算某一列的 平均值。它會計算某列所有非 NULL
值的平均數。
1. AVG()
函數的基本用法
AVG()
函數可以用于數值型數據列(如整數、浮動數等),它返回該列的平均值。
語法:
AVG(column_name)
column_name
:要計算平均值的列。
2. 搭配 GROUP BY
使用
通常,AVG()
函數會與 GROUP BY
子句一起使用,這樣可以對數據進行分組計算每個組的平均值。GROUP BY
會根據指定的列對數據進行分組,AVG()
會分別計算每個分組的平均值。
示例 1:計算每個部門的平均薪資
假設有一個員工表 employees
,包含以下字段:employee_id
、department
、salary
。
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;
解釋:
AVG(salary)
:計算每個部門的平均薪資。GROUP BY department
:將數據按部門進行分組,對每個部門計算薪資的平均值。
結果:
department | avg_salary |
---|---|
HR | 5000 |
IT | 6000 |
Sales | 4500 |
這個查詢的結果是每個部門的平均薪資。
示例 2:計算每個學生的平均成績
假設有一個 students
表,記錄學生的成績:
SELECT student_id, AVG(score) AS avg_score
FROM scores
GROUP BY student_id;
解釋:
AVG(score)
:計算每個學生的平均成績。GROUP BY student_id
:按學生的 ID 對數據進行分組。
結果:
student_id | avg_score |
---|---|
1 | 85.5 |
2 | 78.0 |
3. 不搭配 GROUP BY
使用
如果不使用 GROUP BY
,AVG()
會計算整個數據集的平均值,而不是每個分組的平均值。
示例:計算所有員工的平均薪資
如果你不使用 GROUP BY
,就會得到整個表的平均值。
SELECT AVG(salary) AS avg_salary
FROM employees;
結果:
avg_salary |
---|
5500 |
這個查詢計算的是所有員工的平均薪資,而沒有分組。
4. 處理 NULL
值
AVG()
會忽略 NULL
值,它只會計算那些非 NULL
的記錄。例如,如果某個員工的薪資為 NULL
,則該值不會影響平均薪資的計算。
5. 總結
AVG()
函數計算某列的平均值。GROUP BY
通常與AVG()
配合使用,用于對數據進行分組并計算每個分組的平均值。- 如果不使用
GROUP BY
,AVG()
會計算整個表的平均值。 AVG()
會忽略NULL
值。
AVG()
是常用的聚合函數之一,用于執行匯總統計,特別適用于報告和數據分析任務。
8.
select Product.product_id, product_name
from Product left join Sales on Product.product_id = Sales.product_id
group by product_id
having count(sale_date between '2019-01-01' and '2019-03-31' or null) = count(*);
這里值得注意的是count的條件用法。舉個例子count(age > 20 or null
)這個語句,里面or null
必須加,否則就等價于count(*)
了,要么就是寫作sum(age > 20)
也可以。
我猜測是因為age > 20
返回的是0或者1,而count對于不管是0還是1,都是會計數一次的,只有Null
不會被計數。所以這個age > 20 or null
表達的是不大于20就轉換為null
,這樣就不會被count計數
作者:喜刷刷
鏈接:https://leetcode.cn/problems/sales-analysis-iii/description/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
9.CONCAT UPPER LOWER SUBSTRING
SELECT user_id, CONCAT(UPPER(SUBSTRING(name, 1, 1)), LOWER(SUBSTRING(name, 2))) AS name
FROM Users
ORDER BY user_id;
SUBSTRING(string, start, length)
string:要從中提取子字符串的原始字符串。
start:子字符串的起始位置(從 1 開始)。
length:要提取的字符數(可選,如果省略,則提取從起始位置到字符串末尾的所有字符)。
10.
select
(select distinct salary
from Employee
order by salary desc
limit 1 offset 1 ) as SecondHighestSalary ;
雖然這沒有顯式創建臨時表,但在某種意義上,子查詢的結果就充當了臨時表的角色。