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