---
# System prepended metadata

title: 登入與退出MY SQL

---

參考網站: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資料