[w3school 參考連結](https://www.w3schools.com/sql/default.asp)
[sqlite data type](https://www.sqlite.org/datatype3.html)
## SELECT 與 FROM
`SELECT * FROM table_name;`
`SELECT` 敘述用於指定要查詢的欄位,`FROM` 敘述用於指定資料表名稱。`SELECT *` 表示選擇資料表的所有欄位。
```sql=
SELECT * FROM album
```
- 篩選資料時 (select) 一定要有想要篩選的目標與要操作的表格
- 篩選語法寫完後面記得要接著一個 `;`
### 選擇單一欄位
`SELECT column_name FROM table_name;`
`SELECT column_name` 表示只選擇指定的欄位。`column_name` 是要查詢的欄位名稱。
### 選擇多個欄位
`SELECT column1, column2 FROM table_name;`
- 若想指定多個欄位,可用逗號將多個欄位名稱隔開。
## AS 別名用法
AS 關鍵字用於給表或欄位指定一個別名,這對於簡化複雜查詢的欄位名稱非常有用。
### 欄位取別名
```sql=
SELECT first_name AS 名字, last_name AS 姓氏 FROM employees;
```
### 表格取別名
```sql=
SELECT e.name, e.department FROM employees AS e;
```
## Distinct 用法
```sql=
SELECT DISTINCT column_name FROM table_name;
```
這會從 table_name 表中選擇 column_name 列的所有唯一值。
## WHERE 子句的使用
WHERE 關鍵字用於過濾查詢結果,僅顯示符合特定條件的記錄。
```sql=
SELECT * FROM employees WHERE department = 'Sales';
```
- 此查詢將從 employees 表中選取所有在銷售部 (Sales) 工作的員工。
### 比較運算子
WHERE 子句中常用的比較運算符包括:
- =:等於
- != 或 <>:不等於
- >:大於
- <:小於
- >=:大於等於
- <=:小於等於
```sql=
SELECT * FROM products WHERE price > 100;
```
### 邏輯運算子
- AND:所有條件必須為真
- OR:至少一個條件為真
- NOT:否定後面的條件
```sql=
SELECT * FROM employees WHERE department = 'Sales' AND salary > 5000;
```
### 範圍條件
- BETWEEN:在兩個值之間(包括邊界值)
```sql=
SELECT * FROM products WHERE price BETWEEN 50 AND 100;
```
### 集合條件
- IN:指定欄位的值匹配列出的任何一個值
```sql=
SELECT * FROM employees WHERE department IN ('Sales', 'HR');
```
### LIKE 用於字串匹配
- LIKE 關鍵字用於在 WHERE 子句中進行模式匹配。% 表示任何數量的字符,_ 表示單一字符。
```sql=
SELECT * FROM customers WHERE name LIKE 'A%';
```
這個查詢將從 customers 表中選取所有名字以字母 'A' 開頭的顧客。
- [練習](https://leetcode.com/problems/big-countries/description/)
## 排序(ORDER BY)
ORDER BY 關鍵字用於對查詢結果進行排序。
```sql=
SELECT name, age FROM employees ORDER BY age DESC;
```
這個查詢將返回所有員工的名字和年齡,按年齡從大到小排序。
- 如果想要由小到大那就可以使用 ORDER BY xxx ASC
- [練習](https://leetcode.com/problems/article-views-i/description/)
## 限制查詢結果(LIMIT 和 TOP)
LIMIT 和 TOP (這個語法不是每個資料庫語言都可以用)用於限制查詢結果的數量。
```sql=
SELECT * FROM products ORDER BY price DESC LIMIT 5;
```
這些查詢將返回價格最高的前五個產品。
## Join
```SQL=
SELECT column1, column2, ...
FROM table1
[JOIN type] JOIN table2
ON table1.column = table2.column;
```
- 類型介紹:
- `INNER JOIN`: 只返回兩個表中交集的。
- `LEFT JOIN` (或 `LEFT OUTER JOIN`): 返回左表的所有 Row,如果右表中有匹配的 Row,則返回匹配的資料,否則返回 NULL。
- `RIGHT JOIN` (或 `RIGHT OUTER JOIN`): 返回右表的所有 Row,如果左表中有匹配的 Row,則返回匹配的資料,否則返回 NULL。
- `FULL JOIN` (或 `FULL OUTER JOIN`): 返回左右兩個表中的所有 Row,如果其中一邊有匹配的 Row,則返回匹配的資料,否則返回 NULL。
```SQL=
SELECT Employees.Name, Departments.DepartmentName
FROM Employees
INNER JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID;
```
### 表格取別名
```SQL=
SELECT
emp.Name AS EmployeeName,
dept.DepartmentName AS DepartmentName
FROM Employees AS emp
JOIN Departments AS dept ON emp.DepartmentID = dept.DepartmentID;
```
- [ ] [練習](https://leetcode.com/problems/combine-two-tables/description/)
- [ ] [練習](https://leetcode.com/problems/customers-who-never-order/description/)
- [ ] [練習](https://leetcode.com/problems/product-sales-analysis-i/description/)
- [ ] [練習](https://leetcode.com/problems/employee-bonus/description/)
### Self Join 與同個表格做 Join
```SQL=
SELECT
e1.Name AS EmployeeName,
e2.Name AS ManagerName
FROM Employees e1
LEFT JOIN Employees e2 ON e1.ManagerID = e2.EmployeeID;
```
- [ ] [練習](https://leetcode.com/problems/employees-earning-more-than-their-managers/description/)
## 運算
### 數學運算
- 加法:計算兩個欄位的和。
- 範例:`SELECT quantity1 as qty1, quantity2 as qty2, (quantity1 + quantity2) AS total_quantity FROM orders;`
- 減法:計算兩個欄位的差。
- 範例:`SELECT sale_price, cost_price, (sale_price - cost_price) AS profit FROM products;`
- 乘法:計算兩個欄位的乘積。
- 範例:`SELECT length, width, (length * width) AS area FROM rectangles;`
- 除法:計算兩個欄位的商。
- 範例:`SELECT total_distance, total_time, (total_distance / total_time) AS speed FROM trips;`
### 字符串運算
- 字符串連接:將兩個字符串欄位連接起來。
- 範例:`SELECT first_name, last_name, (first_name || ' ' || last_name) AS full_name FROM employees;`
- 字符串操作:使用函數進行字符串操作。
- 範例:`SELECT name, UPPER(name) AS upper_name, LOWER(name) AS lower_name FROM customers;`
### 日期運算
- 日期相減:計算兩個日期之間的天數差。
- 範例:`SELECT start_date, end_date, (end_date - start_date) AS duration FROM projects;`
- 日期加減:增加或減去特定天數。
- 範例:`SELECT order_date, (order_date + INTERVAL '7 days') AS delivery_date FROM orders;`
### 邏輯運算
- 邏輯運算:使用邏輯運算符來計算布爾值。
- 範例:`SELECT id, age, (age > 18 AND age < 65) AS is_working_age FROM persons;`
## Group by
### COUNT 函數
- **說明**:計算表中 row 數。
- **應用**:計算所有學生的數量。
- **範例**:`SELECT COUNT(*) AS total_students FROM students;`
### SUM 函數
- **說明**:計算列中所有值的總和。
- **應用**:計算所有學生年齡的總和。
- **範例**:`SELECT SUM(age) AS total_age FROM students;`
### AVG 函數
- **說明**:計算列中所有值的平均值。
- **應用**:計算所有學生年齡的平均值。
- **範例**:`SELECT AVG(age) AS average_age FROM students;`
### MAX 函數
- **說明**:找出列中的最大值。
- **應用**:找出最高年齡。
- **範例**:`SELECT MAX(age) AS max_age FROM students;`
### MIN 函數
- **說明**:找出列中的最小值。
- **應用**:找出最低年齡。
- **範例**:`SELECT MIN(age) AS min_age FROM students;`
### GROUP BY 子句與聚合函數
- **說明**:將結果集按照一個或多個列進行分組,通常與聚合函數一起使用。
- **應用**:
- 按照年級分組,計算每個年級的學生數量。
- 按照年級分組,計算每個年級的平均年齡。
- **範例**:
- `SELECT grade, COUNT(*) AS total_students FROM students GROUP BY grade;`
- `SELECT grade, AVG(age) AS average_age FROM students GROUP BY grade;`
### Group 練習
- [練習](https://leetcode.com/problems/classes-more-than-5-students/description/)
- [練習](https://leetcode.com/problems/invalid-tweets/description/) 結合 Distinct
- [練習](https://leetcode.com/problems/find-total-time-spent-by-each-employee/description/)
### HAVING 子句與聚合函數
- **說明**:過濾分組後的結果集,通常與聚合函數一起使用。
- **應用**:
- 按照年級分組,顯示學生數量大於等於 2 的年級。
- 按照年級分組,顯示平均年齡大於 14 的年級。
- **範例**:
- `SELECT grade, COUNT(*) AS total_students FROM students GROUP BY grade HAVING COUNT(*) >= 2;`
- `SELECT grade, AVG(age) AS average_age FROM students GROUP BY grade HAVING AVG(age) > 14;`
### 複習語法順序
1. **FROM**:指定資料來源表或視圖。
2. **WHERE**:用來篩選資料。
3. **GROUP BY**:將資料進行分組。
4. **HAVING**:篩選分組後的資料(通常與聚合函數一起使用)。
5. **SELECT**:選擇要顯示的資料列。
6. **ORDER BY**:指定結果集的排序順序。
```sql=
SELECT column1, column2, aggregate_function(column3)
FROM table_name
WHERE condition
GROUP BY column1, column2
HAVING condition
ORDER BY column1, column2;
```
### Group + Having 練習
- [練習](https://leetcode.com/problems/bank-account-summary-ii/description/)
### 作業
- [回家作業](https://leetcode.com/problems/average-selling-price/description/)
### 複習
- [group having](https://leetcode.com/problems/actors-and-directors-who-cooperated-at-least-three-times/description/)
## Date 資料
1. DATE 資料類型
定義:DATE 資料類型用來存儲年、月和日。它的格式通常為 'YYYY-MM-DD'。
範圍:DATE 類型的範圍從 '1000-01-01' 到 '9999-12-31'。
2. DATE 資料的常用操作
2.1. 日期格式化和顯示
`SELECT CURRENT_DATE;` -- 獲取當前日期
### 練習
1. 根據出生日期計算出他的年紀
2. 過濾出年紀介於 15~20 之間的資料
- [ ] [時間過濾](https://leetcode.com/problems/the-latest-login-in-2020/description/)
## Casting
目標:將數據從一種數據類型轉換為另一種數據類型
```sql=
-- 範例 1: 將整數轉換為字符型
SELECT CAST(123 AS CHAR);
-- 範例 2: 將字符型轉換為日期型
SELECT CAST('2024-06-17' AS DATE);
-- 範例 3: 將字符型轉換為浮點型
SELECT CAST('123.45' AS REAL);
```
## CASE 語法
目標:根據條件返回不同的結果
```sql=
-- 範例 1: 使用 CASE 語法進行簡單條件檢查
SELECT
employee_id,
first_name,
last_name,
CASE
WHEN salary > 5000 THEN 'High Salary'
WHEN salary BETWEEN 3000 AND 5000 THEN 'Medium Salary'
ELSE 'Low Salary'
END AS salary_category
FROM employees;
-- 範例 2: 使用 CASE 語法進行複雜條件檢查
SELECT
order_id,
order_date,
customer_id,
CASE
WHEN order_status = 'Completed' THEN 'Order Completed'
WHEN order_status = 'Pending' THEN 'Order Pending'
WHEN order_status = 'Cancelled' THEN 'Order Cancelled'
ELSE 'Unknown Status'
END AS order_status_description
FROM orders;
```
### 練習
- 根據他的年紀做區分,分成 child(0~17), adult(19~64), elder(65以上)
- [ ] [case](https://leetcode.com/problems/calculate-special-bonus/)
- [ ] [triangle](https://leetcode.com/problems/triangle-judgement/description/)
---
## 補充
這些語法差異主要是由於不同的資料庫管理系統(DBMS)之間的特性和實現方式不同。每個 DBMS 都有自己的一套 SQL 方言,這意味著某些 SQL 語法在一個系統上有效,但在另一個系統上可能無效。以下是一些原因解釋為什麼會出現這些差異:
### 1. 資料庫管理系統的特性和功能差異
**SQL Workbench** 通常用於連接和操作多種資料庫管理系統,如 MySQL、PostgreSQL、Oracle、SQL Server 等。這些資料庫系統有許多高級功能和擴展,支援複雜的 SQL 語法和功能,如存儲過程、觸發器、視圖、高級索引和全文檢索等。
**SQLite** 是一個輕量級的嵌入式資料庫,設計目的是簡單、高效、適合用於桌面應用和移動應用中。它缺少一些大型資料庫系統中的高級功能,因此不支援某些複雜的 SQL 語法和功能。
### 2. SQL 標準的實現差異
雖然所有資料庫系統都基於 SQL 標準,但每個系統對標準的實現方式有所不同,有些系統會擴展標準以提供額外的功能。例如:
- **MySQL** 和 **PostgreSQL** 支援窗口函數(window functions)、公共表表達式(CTE)和自定義函數。
- **Oracle** 支援層次查詢(hierarchical queries)、快照視圖(materialized views)等。
- **SQLite** 相對簡單,支援的 SQL 語法較少,不支援存儲過程、觸發器等高級功能。
### 3. 特定資料庫的優化和擴展
不同的資料庫系統會針對特定的應用場景進行優化和擴展,例如:
- **MySQL** 有自己的特定語法來處理自增列、全文檢索和分區。
- **PostgreSQL** 支援 JSON 數據類型和操作,提供豐富的擴展功能。
- **SQLite** 強調輕量級和嵌入式,不支援一些需要大量資源的高級功能。
### 例子
1. **CTE(Common Table Expressions)**:
- **MySQL / PostgreSQL** 支援:
```sql
WITH RECURSIVE cte AS (
SELECT 1 AS n
UNION ALL
SELECT n + 1 FROM cte WHERE n < 10
)
SELECT * FROM cte;
```
- **SQLite** 版本較早時不支援,3.8.3 以後版本開始支援 CTE。
2. **窗口函數**:
- **PostgreSQL** 支援:
```sql
SELECT department, employee, salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) as rank
FROM employees;
```
- **SQLite** 在 3.25.0 版本以後開始支援窗口函數。
3. **存儲過程**:
- **MySQL** 支援:
```sql
DELIMITER //
CREATE PROCEDURE SimpleProc (OUT param1 INT)
BEGIN
SELECT COUNT(*) INTO param1 FROM employees;
END //
DELIMITER ;
```
- **SQLite** 不支援存儲過程。
### 總結
不同的資料庫管理系統有不同的設計目標和實現方式,因此支援的 SQL 語法和功能也有所不同。在使用特定資料庫系統時,需要了解該系統支援的 SQL 語法和功能,並根據其特性進行開發。如果您需要跨多個資料庫系統進行開發,建議使用兼容性較好的標準 SQL 語法,並注意各系統之間的差異。
## SQL 中的子查詢
子查詢(Subquery) 是一個內部查詢,它嵌套在另一個查詢內部,可以返回單個值、單列或多列結果。子查詢通常用於篩選數據、計算聚合值、或與外部查詢結果進行比較。
```sql=
SELECT
column_name
FROM table_name
WHERE column_name = (SELECT column_name FROM another_table WHERE condition);
```
### Where subquery
```sql=
-- 獲取最高薪水
SELECT MAX(salary) FROM employees;
-- 找到最高薪水的員工
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);
```
```sql=
SELECT height, weight
FROM Students
WHERE height > (SELECT AVG(height)
FROM Students);
```
### From subquery
如何找到在比整體平均身高還高的學生中,BMI > 23 的學生?
```sql=
SELECT height, weight, BMI
FROM (SELECT height, wieght, (weight / SQUARE(height)) AS BMI
FROM Students
WHERE BMI > 23)
WHERE height > (SELECT AVG(height)
FROM Students);
```
### Join subquery
```sql=
SELECT id, BMI
FROM Students AS s
INNER JOIN (SELECT id, (weight / SQUARE(height)) AS BMI
FROM Students
WHERE BMI > 23) AS Sub
ON s.id = Sub.id
WHERE height > (SELECT AVG(height)
FROM Students);
```
## CTE
公共表表達式(Common Table Expressions,CTE) 是一種在 SQL 查詢中定義臨時結果集的方式,這些結果集可以在後續的語句中引用。CTE 提供了一種更清晰和更可讀的方式來編寫復雜的 SQL 查詢,特別是在需要重複使用中間結果或需要進行遞歸查詢的情況下。
### CTE 基本用法
```sql=
WITH cte_name (column1, column2, ...)
AS
(
-- 定義 CTE 的查詢
SELECT ...
)
-- 使用 CTE 的查詢
SELECT column1, column2, ...
FROM cte_name
WHERE ...;
```
### 範例
```sql=
-- 定義 CTE 的 名稱 和 欄位
WITH DeptAvgSalaries AS
(
SELECT
DEPTNO,
AVG(SAL) AS AvgSal
FROM employees
GROUP BY DEPTNO
)
SELECT
DEPTNO,
AvgSal
FROM DeptAvgSalaries
WHERE AvgSal > 2000;
```
### CTE 優點
1. 增強可讀性:CTE 使複雜的查詢更易於閱讀和維護,因為它們將查詢分解為更小、更易理解的部分。
2. 重用結果集:CTE 允許在單個查詢中多次引用相同的結果集,而不需要重複編寫相同的子查詢。
3. 支持遞歸查詢:CTE 支持遞歸查詢,這對於處理層次結構數據(例如組織結構或目錄結構)非常有用。
- [很好的 CTE 練習題目](https://learnsql.com/blog/practical-sql-cte-examples/)
## 創建資料庫
```sql=
CREATE DATABASE SchoolDB;
```
## 選擇和使用資料庫
```sql=
USE SchoolDB;
```
## 檢查資料庫
你可以檢查資料庫是否創建成功,並列出伺服器上的所有資料庫。
```sql=
SHOW DATABASES;
```
## 創建一個學生資料表
```sql=
-- 創建一個學生資料表
CREATE TABLE Students (
ID INT PRIMARY KEY,
Name VARCHAR(50),
Age INT,
Major VARCHAR(50)
);
```
### 語法結構
- CREATE TABLE Students: 這一行定義了資料表的名稱為 Students。
- (): 圓括號內定義了資料表的欄位。
### 欄位定義
`ID INT PRIMARY KEY`
- ID: 欄位名稱。
- INT: 資料類型,表示整數。
- PRIMARY KEY: 這是一個約束,表示該欄位是主鍵,主鍵要求此欄位的值唯一且不為空。
`Name VARCHAR(50)`
- Name: 欄位名稱。
- VARCHAR(50): 資料類型,表示可變長度的字元串,最多50個字元。
## MYSQL 資料型態
- [相關連結](https://www.itread01.com/study/mysql-data-types.html)
### 數值型資料類型
- **INT**: 整數型資料類型。用於儲存整數。變種包括 TINYINT, SMALLINT, MEDIUMINT, BIGINT。
- 範例: `INT`, `SMALLINT`
- **FLOAT**: 浮點數型資料類型。用於儲存小數。
- 範例: `FLOAT(7, 4)`(表示總共有7位數,其中4位小數)
- **DOUBLE**: 雙精度浮點數型資料類型。用於儲存高精度的小數。
- 範例: `DOUBLE(15, 8)`(表示總共有15位數,其中8位小數)
- **DECIMAL**: 精確數字型資料類型。用於儲存精確小數,常用於財務數據。
- 範例: `DECIMAL(10, 2)`(表示總共有10位數,其中2位小數)
### 字元型資料類型
- **CHAR**: 固定長度字元串。用於儲存固定長度的字元串。
- 範例: `CHAR(10)`(固定長度為10的字元串)
- **VARCHAR**: 可變長度字元串。用於儲存可變長度的字元串。
- 範例: `VARCHAR(255)`(最多255個字元)
- **TEXT**: 大量字元資料。用於儲存大段文字資料。
- 變種包括 `TINYTEXT`, `TEXT`, `MEDIUMTEXT`, `LONGTEXT`
### 日期型資料類型
- **DATE**: 日期型資料類型。用於儲存日期,格式為 `YYYY-MM-DD`。
- 範例: `DATE`
- **TIME**: 時間型資料類型。用於儲存時間,格式為 `HH:MI:SS`。
- 範例: `TIME`
- **DATETIME**: 日期和時間型資料類型。用於儲存日期和時間,格式為 `YYYY-MM-DD HH:MI:SS`。
- 範例: `DATETIME`
- **TIMESTAMP**: 自動更新的日期和時間型資料類型。用於儲存自動更新的日期和時間。
- 範例: `TIMESTAMP`
- **YEAR**: 年型資料類型。用於儲存年份。
- 範例: `YEAR`
#### 題目:創建員工資料表
```
請根據以下描述創建一個名為 Employees 的資料表。該資料表應包含以下欄位:
EmployeeID: 整數型欄位,作為主鍵(PRIMARY KEY)。
FirstName: 可變長度字元串(VARCHAR),最多50個字元。
LastName: 可變長度字元串(VARCHAR),最多50個字元。
BirthDate: 日期型欄位(DATE),用於儲存出生日期。
Salary: 精確數字型欄位(DECIMAL),總共有10位數,其中2位小數。
IsActive: 布林型欄位(BOOLEAN),用於表示員工是否在職。
```
### 插入數據
```sql=
INSERT INTO Students (ID, Name, Age)
VALUES (1, 'Alice', 20),
(2, 'Bob', 22);
```
#### 題目:插入資訊
```
請使用 INSERT INTO 語法,將上述三條記錄插入到 Employees 資料表中。確保每條記錄的數據完整且符合欄位定義
第一條記錄:
EmployeeID: 1
FirstName: Alice
LastName: Smith
BirthDate: 1990-05-12(1990年5月12日)
Salary: 78000.00(薪水75000.00)
IsActive: TRUE(在職)
第二條記錄:
EmployeeID: 2
FirstName: Bob
LastName: Johnson
BirthDate: 1985-08-23(1985年8月23日)
Salary: 80000.00(薪水80000.00)
IsActive: TRUE(在職)
第三條記錄:
EmployeeID: 3
FirstName: Carol
LastName: Williams
BirthDate: 1992-12-05(1992年12月5日)
Salary: 60000.00(薪水65000.00)
IsActive: FALSE(不在職)
```
## 更新 UPDATE 語法
UPDATE 語法用於修改資料表中現有記錄的數據。可以指定一個或多個欄位的值,以及一個條件來限制修改的範圍。
```sql=
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
```
- 舉例來說如果要更新員工的薪水
```sql=
UPDATE Employees
SET Salary = 78000.00
WHERE EmployeeID = 1;
```
```
練習
將高於平均值薪水的員工降低 5000 元的薪水
hint: 可以嘗試看看子查詢的方法來做看看
```
## 刪除
### 1. 基本刪除操作
刪除表中的所有記錄。這將會移除表內的所有資料,但不會刪除表本身。
```sql=
DELETE FROM employees;
```
### 2. 條件刪除
刪除符合特定條件的記錄。例如,刪除員工表中所有薪水低於30000的記錄。
```sql=
DELETE FROM employees WHERE salary < 30000;
```
### 3. 刪除特定資料
刪除具有特定 ID 的員工。這是更精確的刪除操作,通常用於有明確目標的情況。
```sql=
DELETE FROM employees WHERE employee_id = 10;
```
### 4. 利用子查詢進行刪除
刪除與子查詢條件匹配的記錄。例如,刪除所有沒有當前項目的員工。
```sql=
DELETE FROM employees
WHERE employee_id IN (
SELECT employee_id FROM projects WHERE end_date IS NOT NULL
);
```
## Drop
### 刪除資料表 (Drop Table)
如果您想要完全移除一個表及其所有的數據和表結構。
```sql=
DROP TABLE table_name;
```
這條語句會將名為 table_name 的表從資料庫中完全刪除。進行這一操作前,確保這是您想要的操作,因為一旦執行,所有存儲在該表中的數據都將永久丟失。
### 刪除資料庫 (Drop Database)
如果您需要刪除整個資料庫,包括其中的所有表和數據。
```sql=
DROP DATABASE database_name;
```
這條語句會完全刪除名為 database_name 的資料庫。這個操作會移除資料庫中的所有內容,包括所有表和數據,並釋放與該資料庫相關的資源。
```
UPDATE 語句問題
問題: 假設公司決定對所有在公司工作超過5年且薪資為低的員工進行薪資調整,將他們的薪資等級提升到中等。寫出相應的 SQL UPDATE 語句。
問題: 公司希望根據員工的最後一次評估和當前的滿意度來調整工時。如果員工的滿意度小於0.3且上次評估超過0.8,減少他們的每月平均工時數20小時。寫出相應的 SQL UPDATE 語句。
```
```
DELETE 語句問題
問題: 公司決定裁減所有在銷售部門工作且滿意度低於0.3的員工。寫出相應的 SQL DELETE 語句。
問題: 如果員工在過去五年內沒有獲得晉升且他們的每月平均工時數超過250小時,則需要刪除這些員工的記錄。考慮到這可能會影響到公司的多個部門,寫出一個 SQL DELETE 語句來執行此操作。
```