參考網站:https://www.fooish.com/sql/
# 登入與退出MY SQL
```
mysql -u 使用者帳號 -p 密碼
exit
```
# 資料庫操作
```
show databases;#查看全部資料庫
create database name;#新建資料庫
use database name;#使用資料庫
select database();#查詢當前資料庫
drop database name;#刪除資料庫
```
# 資料表操作
資料表名稱:users
欄位:name,join_date
資料型態:varchar(10),date
```
create table users(name varchar(10), join_date date);#建立資料表
DROP table users;#刪除資料表
DELETE FROM users#清空資料表資料
ALTER TABLE users MODIFY name varchar(20);修改資料表欄位特性
ALTER TABLE users CHANGE name names varchar(10);#變更欄位名稱
ALTER TABLE users RENAME user;#變更資料表名稱
```
# CRUD
insert [C 新增資料內容]
select [R 讀取資料內容]
update [U 更新資料]
delete [D 刪除資料]
```
INSERT INTO table_name (column1, column2, column3...)
VALUES (value1, value2, value3...);
SELECT table_column1, table_column2, table_column3...
FROM table_name
WHERE some_column=some_value;
//update
UPDATE table_name
SET column1=value1, column2=value2, column3=value3···
WHERE some_column=some_value;
//delete
DELETE FROM table_name
WHERE column_name operator value;
```
# 查詢優化
## DISTINCT 不重複資料
```
SELECT DISTINCT table_column1, table_column2...
FROM table_name;
```
## IN 欄位裡面有無資料
```
SELECT table_column1,...
FROM table_name
WHERE column_name
IN (value1, value2, value3...);
```
## BETWEEN 兩者中間
```
SELECT table_column1,...
FROM table_name
WHERE column_name
BETWEEN value1 AND value2;
```
## LIKE 字串查詢
```
SELECT table_column1, table_column2, table_column3...
FROM table_name
WHERE column_name LIKE pattern;
%-比對字串
//找出開頭為台北的資料
SELECT * FROM customers WHERE Address LIKE '台北%'
//找出開頭為台,結尾為北的資料
SELECT * FROM customers WHERE Address LIKE '台%北'
//找出結尾為台北的資料
SELECT * FROM customers WHERE Address LIKE '%台北'
[ ]-指定範圍或集合內的任何單一字元
//找出開頭為m,第二個字母為n-z的資料
SELECT * FROM customers WHERE Address LIKE 'm[n-z]%'
_-符合單一字元
//找出開頭為m,第三個字母為d,的資料
SELECT name FROM sys.databases WHERE name LIKE 'm_d%';
//找出三個字母且結尾是 an 的資料
SELECT name FROM sys.databases WHERE name LIKE '_an';
```
## join 連接不同資料表之間欄位
```
inner join-內部鏈接(必需指定等值連接的條件)
SELECT table_column1, table_column2...
FROM table_name1 INNER JOIN table_name2
USING (column_name);
//左右外部鏈接差別就在 join的左邊/右邊所有記錄都會加入到查詢結果,就算左側/右側資料表中的
連接欄位沒有符合的值也一樣
left join-左外部鏈接
SELECT table_column1, table_column2...
FROM table_name1 LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name;
right join-右外部鏈接
SELECT table_column1, table_column2...
FROM table_name1 RIGHT JOIN table_name2
ON table_name1.column_name=table_name2.column_name;
```
## UNION SQL 查詢結果合併
```
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2;
//改成UNION ALL將會顯示重複資料
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2;
```
## SQL Subquery 子查詢
```
SELECT table_column1, table_column2, table_column3...
FROM table_name
WHERE 欄位名稱 比較運算子 (SELECT 子查詢);
//找出台灣銷售,但是中國沒有銷售的產品
SELECT Product_Name FROM products_taiwan
WHERE Product_Name NOT IN
(SELECT Product_Name FROM products_china);
```
# 動態SQL查詢(Dynamic SQL Query)
這個很簡單就是在where的開始先打上1=1,由於WHERE 1 = 1的結果為true,因此在撰寫時可以忽略第一個條件
,這樣做在增加查詢條件的時候在後面加上and就可,不需要可以注銷掉。
這樣在開發、維護比較方便,API加入條件,撰寫也較為其實
```
SELECT *
FROM custom
WHERE 1=1
AND custom_id = 3
//AND buyamount > 50000;
```
```
var sql="";
sql += "SELECT * ";
switch(x){
1:sql += "SELECT * ";
2:sql += "SELECt custom_id"
}
sql += "FROM custom ";
sql += "WHERE 1=1 ";
if(x>0)
sql += "AND custom_id=1 ";
else
sql +="AND custom_id=1";
```
# 死結
Oracle如何刪除被鎖定(locked)的session
1. 查詢出要刪除的Lock Session ID
```
select a.sid||','||a.serial#,a.machine
from v$session a,DBA_DML_LOCKS b
where a.sid = b.session_id
group by a.sid||','||a.serial#,a.machine;
```
2. 刪除Session ID
```
alter system kill session 'xxx,yyyy' immediate;
(其中, 'xxx,yyy'為第1步查到的資料)
```
* v$session : 使用中session資料
* DBA_DML_LOCKS : Lock Session資料