創建數據庫
創建一個保存員工信息的數據庫
create database employees;
相關其他命令
show?databases;
查看當前所有數據庫
????use?employees;
“使用”一個數據庫,使其作為當前數據庫
命名規則
? ?數據庫名不得超過30個字符,變量名限制為29個
? ?必須只能包含 A–Z, a–z, 0–9, _共63個字符
? ?不能在對象名的字符間留空格
? ?必須不能和用戶定義的其他對象重名
? ?必須保證你的字段沒有和保留字、數據庫系統或常用方法沖突
? ?保持字段名和類型的一致性,在命名字段并為其指定數據類型的時候一定要保證一致性。假如數據類型在一個表里是整數,那在另一個表里可就別變成字符型了
CREATE TABLE 語句
? ?必須具備:
? ? ? ?CREATE TABLE權限
? ? ? ?存儲空間
? ?必須指定:
? ? ? ?表名
? ? ? ?列名, 數據類型, 尺寸
? ? ? ?CREATE TABLE [schema.]table
? ? ? ? ? ? ? ? ? ? ?(column datatype [DEFAULT expr][, …]);
創建表
? ?語法
? ? ? ?CREATE TABLE dept
? ? ? ? ? ? ? ? ? ?(deptno ? ? INT(2),
? ? ? ? ? ? ? ? ? ?dname ? VARCHAR(14),
? ? ? ? ? ? ? ? ? ?loc ? ? VARCHAR(13));
? ?確認
? ? ? ?DESCRIBE dept
常用數據類型
? ?INT ? ? ? ? ? ? 使用4個字節保存整數數據
? ?CHAR(size) ? ? ?定長字符數據。若未指定,默認為1個字符,最大長度255
? ?VARCHAR(size) ? ? ? 可變長字符數據,根據字符串實際長度保存,必須指定長度
? ?FLOAT(M,D) ? ? ?單精度,M=整數位+小數位,D=小數位。 D ? ?DOUBLE(M,D) ? ? ? ? 雙精度。D ? ?DATE ? ? ? ? ? ?日期型數據,格式’YYYY-MM-DD’
? ?BLOB ? ? ? ? ? ?二進制形式的長文本數據,最大可達4G
? ?TEXT ? ? ? ? ? ?長文本數據,最大可達4G
**創建表** CREATE TABLE emp ( #int類型,自增 emp_id INT AUTO_INCREMENT, #最多保存20個中英文字符 emp_name CHAR (20), #總位數不超過15位 salary DOUBLE, #日期類型 birthday DATE, #主鍵 PRIMARY KEY (emp_id) ) ;
使用子查詢創建表
使用 AS subquery 選項,將創建表和插入數據結合起來
指定的列和子查詢中的列要一一對應
通過列名和默認值定義列
CREATE?TABLE?table???????? ????????[(column,?column...)]????AS?subquery;
使用子查詢創建表舉例
CREATE?TABLE????dept80?? ????????AS????? ????????????SELECT??employee_id,?last_name,???????????? ????????????salary*12?ANNSAL,?????????????hire_date???? ????????????FROM????employees???? ????????????WHERE???department_id?=?80;
ALTER TABLE 語句
使用 ALTER TABLE 語句可以實現:
向已有的表中添加列
ALTER?TABLE?dept80? ????????ADD?job_id?varchar(15);` **修改現有表中的列** 可以修改列的數據類型,?尺寸和默認值 對默認值的修改只影響今后對表的修改 ``ALTER?TABLE?dept80 ????????????????MODIFY??????(last_name?VARCHAR(30));
ALTER TABLE dept80 MODIFY (salary double(9,2) default 1000);
丟棄現有表中的列
? ? ? ?使用 DROP COLUMN 子句丟棄不再需要的列.
????ALTER?TABLE??dept80????????????DROP?COLUMN??job_id;
重命名現有表中的列
? ? ? ?使用 CHANGE ?old_column ?new_column ?dataType子句重命名列
ALTER TABLE dept80 *CHANGE department_name dept_name varchar(15);
丟棄表*
? ?數據和結構都被刪除
? ?所有正在運行的相關事務被提交
? ?所有相關索引被刪除
? ?DROP TABLE 語句不能回滾
? ? ? ?DROP TABLE dept80;
清空表
? ?TRUNCATE TABLE 語句:
? ? ? ?刪除表中所有的數據
? ? ? ?釋放表的存儲空間
? ? ? ?TRUNCATE TABLE detail_dept;
? ?TRUNCATE語句不能回滾
? ?可以使用 DELETE 語句刪除數據,可以回滾
? ?對比:
? ? ? ?delete from emp2;
? ? ? ?select * from emp2;
? ? ? ?rollback;
? ? ? ?select * from emp2;
改變對象的名稱
執行RENAME語句改變表, 視圖的名稱
必須是對象的擁有者
? ?ALTER table dept
? ?RENAME TO detail_dept;
數據處理之增刪改
數據操縱語言
DML(Data Manipulation Language – 數據操縱語言) 可以在下列條件下執行:
? ?向表中插入數據
? ?修改現存數據
? ?刪除現存數據
事務是由完成若干項工作的DML語句組成的
插入數據
使用 INSERT 語句向表中插入數據。 INSERT INTO table [(column [, column...])] VALUES (value [, value...]); 為每一列添加一個新值。 按列的默認順序列出各個列的值。 在 INSERT 子句中隨意列出列名和他們的值。 字符和日期型數據應包含在單引號中。
INSERT?INTO?departments(department_id,??????????????????department_name,??????????????????? ????manager_id,? ????location_id)????????????VALUES??????(70,?'Public?Relations',?100,?1700);
INSERT INTO employees(employee_id,last_name,email,hire_date,job_id)
向表中插入空值
? ? ? ?隱式方式: 在列名表中省略該列的值。
? ? ? ? ? ?INSERT INTO departments (department_id, department_name ? ?)
? ? ? ? ? ?VALUES ? ? ?(30, ‘Purchasing’);
? ? ? ?顯示方式: 在VALUES 子句中指定空值。
? ? ? ? ? ?INSERT INTO departments
? ? ? ? ? ?VALUES ? ? ?(100, ‘Finance’, NULL, NULL);
? ?插入指定的值
? ? ? ?NOW()函數:記錄當前系統的日期和時間。
? ? ? ? ? ?INSERT INTO employees (employee_id,
? ? ? ? ? ? ? ? ? ? ? ? ? ?first_name, last_name,
? ? ? ? ? ? ? ? ? ? ? ? ? ?email, phone_number,
? ? ? ? ? ? ? ? ? ? ? ? ? ?hire_date, job_id, salary,
? ? ? ? ? ? ? ? ? ? ? ? ? ?commission_pct, manager_id,
? ? ? ? ? ? ? ? ? ? ? ? ? ?department_id)
? ? ? ? ? ?VALUES ? ? ? ? (113,
? ? ? ? ? ? ? ? ? ? ? ? ? ‘Louis’, ‘Popp’,
? ? ? ? ? ? ? ? ? ? ? ? ? ‘LPOPP’, ‘515.124.4567’,
? ? ? ? ? ? ? ? ? ? ? ? ? NOW(), ‘AC_ACCOUNT’, 6900,
? ? ? ? ? ? ? ? ? ? ? ? ? NULL, 205, 100);
從其它表中拷貝數據
? ? ? ?在 INSERT 語句中加入子查詢。 ?
? ? ? ?不必書寫 VALUES 子句。 ?
? ? ? ?子查詢中的值列表應與 INSERT 子句中的列名對應
INSERT INTO emp2 SELECT * FROM employees WHERE department_id = 90; INSERT INTO sales_reps(id, name, salary, commission_pct) SELECT employee_id, last_name, salary, commission_pct FROM employees WHERE job_id LIKE '%REP%';
*更新數據*
UPDATE 語句語法 使用 UPDATE 語句更新數據。 UPDATE table SET column = value [, column = value, ...] [WHERE condition];
可以一次更新多條數據。
? ? ? ?如果需要回滾數據,需要保證在DML前,進行設置:SET AUTOCOMMIT = FALSE;
? ? ? ?使用 WHERE 子句指定需要更新的數據。
UPDATE employees SET department_id = 70 WHERE employee_id = 113;
如果省略 WHERE 子句,則表中的所有數據都將被更新。
? ? ? ? ? ?UPDATE ?copy_emp
? ? ? ? ? ?SET ? ? department_id = 110;
更新中的數據完整性錯誤
UPDATE employees SET department_id = 55 WHERE department_id = 110; 不存在 55 號部門
刪除數據
使用 DELETE 語句從表中刪除數據。 DELETE FROM table [WHERE condition];
使用 WHERE 子句刪除指定的記錄。
DELETE FROM departments WHERE department_name = 'Finance';
如果省略 WHERE 子句,則表中的全部數據將被刪除
? ? ? ? ? ?DELETE FROM ?copy_emp;
? ?刪除中的數據完整性錯誤
DELETE FROM departments WHERE department_id = 60; 不存在60號部門
數據庫處理之查詢
1—基本select語句
SELECT ? 標識選擇哪些列。
FROM ? ? 標識從哪個表中選擇。
// 查詢 select * from 表名;// 查詢表中的所有數據, 查詢所有列 // 虛表的列由select后面from前面的內容 select manager_id, manager_id, department_name from departments;
注 ?意:
? ?SQL 語言大小寫不敏感。 ?
? ?SQL 可以寫在一行或者多行
? ?關鍵字不能被縮寫也不能分行
? ?各子句一般要分行寫。
? ?使用縮進提高語句的可讀性。
列的別名:
重命名一個列。
便于計算。緊跟列名,也可以在列名和別名之間加入關鍵字‘AS’,別名使用雙引號,以便在別名中包含空格或特殊的字符并區分大小寫。
? ?// 列的別名
select manager_id as manager, manager_id, department_name "dept name" from departments;
字符串可以是 SELECT 列表中的一個字符,數字,日期。
日期和字符只能在單引號中出現。
每當返回一行時,字符串被輸出一次。
使用 DESCRIBE 命令,表示表結構
2—過濾和排序數據
使用WHERE 子句,將不滿足條件的行過濾掉。 WHERE 子句緊隨 FROM 子句。 SELECT employee_id, last_name, job_id, department_id FROM employees WHERE department_id = 90 ;
(1)比較運算
? ?賦值使用 := 符號
SELECT last_name, salary FROM employees WHERE salary <= 3000;
(2)其它比較運算
SELECT last_name, salary FROM employeesWHERE salary BETWEEN 2500 AND 3500;
使用 IN運算顯示列表中的值。
SELECT employee_id, last_name, salary, manager_id FROM employees WHERE manager_id IN (100, 101, 201);
使用 LIKE 運算選擇類似的值
? ?選擇條件可以包含字符或數字:
? ? ? ?% 代表零個或多個字符(任意個字符)。
? ? ? ?_ 代表一個字符。
SELECT first_name FROM employees WHERE first_name LIKE 'S%';
‘%’和‘-’可以同時使用。
SELECT last_name FROM employees WHERE last_name LIKE '_o%';
使用 IS (NOT) NULL 判斷空值。
SELECT last_name, manager_id FROM employees WHERE manager_id IS NULL;
(3)邏輯運算
AND 要求并的關系為真。
SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary >=10000 AND job_id LIKE '%MAN%';
OR 要求或關系為真。
SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary >= 10000 OR job_id LIKE '%MAN%'; NOT SELECT last_name, job_id FROM employees WHERE job_id NOT IN ('IT_PROG', 'ST_CLERK', 'SA_REP');
ORDER BY子句
? ?使用 ORDER BY 子句排序
? ? ? ?ASC(ascend): 升序(默認方式)
? ? ? ?DESC(descend): 降序
? ?ORDER BY 子句在SELECT語句的結尾。
SELECT last_name, job_id, department_id, hire_date FROM employees ORDER BY hire_date ;
降序排序
SELECT last_name, job_id, department_id, hire_date FROM employees ORDER BY hire_date DESC ;
按別名排序
SELECT employee_id, last_name, salary*12 annsal FROM employees ORDER BY annsal;
多個列排序:按照ORDER BY 列表的順序排序。可以使用不在SELECT 列表中的列排序。
SELECT last_name, department_id, salary FROM employees ORDER BY department_id, salary DESC;
3 — 多表查詢
? ?從多個表中獲取數據
? ?笛卡爾集
? ?笛卡爾集會在下面條件下產生:
? ? ? ?省略連接條件
? ? ? ?連接條件無效
? ? ? ?所有表中的所有行互相連接
? ?為了避免笛卡爾集, 可以在 WHERE 加入有效的連接條件。
使用連接在多個表中查詢數據。
? ?在 WHERE 子句中寫入連接條件。
? ?在表中有相同列時,在列名之前加上表名前綴
? ?SELECT ?table1.column, table2.column
? ?FROM ? ?table1, table2
? ?WHERE ? table1.column1 = table2.column2;
等值連接
SELECT employees.employee_id, employees.last_name, employees.department_id, departments.department_id, departments.location_id FROM employees, departments WHERE employees.department_id = departments.department_id;
多個連接條件與 AND 操作符 ?
區分重復的列名
? ?使用表名前綴在多個表中區分相同的列。
? ?在不同表中具有相同列名的列可以用表的別名加以區分。
表的別名
? ?使用別名可以簡化查詢。
SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id FROM employees e , departments d WHERE e.department_id = d.department_id;
連接多個表
? ?連接 n個表,至少需要 n-1個連接條件。 例如:連接三個表,至少需要兩個連接條件。
使用ON 子句創建連接
? ?自然連接中是以具有相同名字的列為連接條件的。
? ?可以使用 ON 子句指定額外的連接條件。
? ?這個連接條件是與其它條件分開的。
? ?ON 子句使語句具有更高的易讀性。
SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_idF ROM employees e JOIN departments d ON (e.department_id = d.department_id);
使用 ON 子句創建多表連接
SELECT employee_id, city, department_name FROM employees e JOIN departments d ON d.department_id = e.department_id JOIN locations l ON d.location_id = l.location_id;
4 — 單行函數
? ?大小寫控制函數:這類函數改變字符的大小寫。
字符控制函數:這類函數控制字符
數字函數 ?
? ?ROUND: 四舍五入ROUND(45.926, 2) ? ? ? ? 45.93
? ?TRUNCATE: ? ?截斷TRUNC(45.926, 2) ? ? 45.92
? ?MOD: 求余MOD(1600, 300) ? ? ? ? ? ? ? ? ? ? ? 100
條件表達式(了解)
? ?在 SQL 語句中使用IF-THEN-ELSE 邏輯
? ?使用方法:
? ? ? ?CASE 表達式
5 — 分組函數
? ?分組函數作用于一組數據,并對一組數據返回一個值。
組函數類型
? ?AVG() COUNT() MAX() MIN() SUM()
組函數語法
? ?SELECT ?[column,] group_function(column), …
? ?FROM ? ? ? ?table
? ?[WHERE ?condition]
? ?[GROUP BY ? column]
? ?[ORDER BY ? column];
AVG(平均值)和 SUM (合計)函數
可以對數值型數據使用AVG 和 SUM 函數。
SELECT AVG(salary), MAX(salary), MIN(salary), SUM(salary) FROM employees WHERE job_id LIKE '%REP%';
MIN(最小值)和 MAX(最大值)函數
可以對任意數據類型的數據使用 MIN 和 MAX 函數。
SELECT MIN(hire_date), MAX(hire_date) FROM employees;
COUNT(計數)函數
COUNT(*) 返回表中記錄總數,適用于任意數據類型。
SELECT COUNT(*) FROM employees WHERE department_id = 50;
COUNT(expr) 返回expr不為空的記錄總數。
SELECT COUNT(commission_pct) FROM employees WHERE department_id = 50;
分組數據: ?GROUP BY 子句語法
可以使用GROUP BY子句將表中的數據分成若干組
明確:WHERE一定放在FROM后面
SELECT column, group_function(column) FROM table [WHERE condition] [GROUP BY group_by_expression] [ORDER BY column];
在SELECT 列表中所有未包含在組函數中的列都應該包含在 GROUP BY 子句中。
SELECT department_id, AVG(salary) FROM employees GROUP BY department_id ;
包含在 GROUP BY 子句中的列不是必須包含在SELECT 列表中
SELECT AVG(salary) FROM employees GROUP BY department_id ;
在GROUP BY子句中包含多個列
SELECT department_id dept_id, job_id, SUM(salary) FROM employees GROUP BY department_id, job_id ;
非法使用組函數
不能在 WHERE 子句中使用組函數。
可以在 HAVING 子句中使用組函數。
SELECT department_id, AVG(salary) FROM employees WHERE AVG(salary) > 8000 GROUP BY department_id; WHERE AVG(salary) > 8000; ERROR at line 3: ORA-00934: group function is not allowed here
過濾分組: HAVING 子句
使用 HAVING 過濾分組:
1. ?行已經被分組。
2. ?使用了組函數。
3. ?滿足HAVING 子句中條件的分組將被顯示。
SELECT??column,?group_function????FROM????????table ????[WHERE??condition] ????[GROUP?BY???group_by_expression] ????[HAVING?group_condition] ????[ORDER?BY???column];
SELECT department_id, MAX(salary) FROM employees GROUP BY department_id HAVING MAX(salary)>10000 ;
6—子查詢
子查詢語法
SELECT select_listF ROM table WHERE expr operator (SELECT select_list FROM table);
子查詢 (內查詢) 在主查詢之前一次執行完成。
子查詢的結果被主查詢(外查詢)使用 。
SELECT last_name FROM employees WHERE salary > (SELECT salary FROM employees WHERE last_name = 'Abel');
注意事項:
? ?子查詢要包含在括號內。
? ?單行操作符對應單行子查詢,多行操作符對應多行子查詢。
子查詢類型
單行子查詢:子查詢返回給主查詢的結果為一個值。
? ?只返回一行。
? ?使用單行比較操作符。
題目:返回job_id與141號員工相同,salary比143號員工多的員工姓名,job_id 和工資
SELECT last_name, job_id, salary FROM employees WHERE job_id = (SELECT job_id FROM employees WHERE employee_id = 141) AND salary > (SELECT salary FROM employees WHERE employee_id = 143);
在子查詢中使用組函數
SELECT last_name, job_id, salary FROM employees WHERE salary = (SELECT MIN(salary) FROM employees);
子查詢中的 HAVING 子句
? ?首先執行子查詢。向主查詢中的HAVING 子句返回結果。
? ?題目:查詢最低工資大于50號部門最低工資的部門id和其最低工資
SELECT department_id, MIN(salary) FROM employees GROUP BY department_id HAVING MIN(salary) > (SELECT MIN(salary) FROM employees WHERE department_id = 50);
非法使用子查詢
SELECT employee_id, last_name FROM employees WHERE salary in (SELECT MIN(salary) FROM employees GROUP BY department_id);
多行子查詢使用單行比較符
? ?子查詢中的空值問題
SELECT last_name, job_id FROM employees WHERE job_id = (SELECT job_id FROM employees WHERE last_name = 'Haas');
子查詢不返回任何行
多行子查詢:子查詢返回給主查詢的結果多與一個值。
? ?返回多行。
? ?使用多行比較操作符。
在多行子查詢中使用 ANY 操作符
? ?題目:返回其它部門中比job_id為‘IT_PROG’部門任一工資低的員工的員工號、姓名、job_id 以及salary
SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary < ANY (SELECT salary FROM employees WHERE job_id = 'IT_PROG') AND job_id <> 'IT_PROG';
在多行子查詢中使用 ALL 操作符
? ?題目:返回其它部門中比job_id為‘IT_PROG’部門所有工資都低的員工的員工號、姓名、job_id 以及salary
SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary < ALL (SELECT salary FROM employees WHERE job_id = 'IT_PROG') AND job_id <> 'IT_PROG';
子查詢中的空值問題
SELECT emp.last_name FROM employees emp WHERE emp.employee_id NOT IN (SELECT mgr.manager_id FROM employees mgr); no rows selected
**
數據庫事務
**
? ?事務:一組邏輯操作單元,使數據從一種狀態變換到另一種狀態。
? ?數據庫事務由以下的部分組成:
? ? ? ?一個或多個DML 語句
? ? ? ?一個 DDL(Data Definition Language – 數據定義語言) 語句
? ? ? ?一個 DCL(Data Control Language – 數據控制語言) 語句
? ?在數據庫編程語言中,事務是將一個數據處理執行步驟的集合作為一個單元來處理。
? ?也就是說,執行這些步驟就好像是執行一個單個的命令一樣。
設置提交狀態:SET AUTOCOMMIT = FALSE;
? ?或者顯式的執行 start transaction或 begin
? ?以第一個 DML 語句的執行作為開始
? ?以下面的其中之一作為結束:
? ? ? ?COMMIT 或 ROLLBACK 語句
? ? ? ?DDL 語句(自動提交)
? ? ? ?用戶會話正常結束
? ? ? ?系統異常終止
? ?COMMIT和ROLLBACK語句的優點
? ? ? ?使用COMMIT 和 ROLLBACK語句,我們可以:
? ? ? ? ? ?確保數據完整性。
? ? ? ? ? ?數據改變被提交之前預覽。
? ? ? ? ? ?將邏輯上相關的操作分組。
使用預處理語句
? ?MySQL服務器支持預處理語句。當想要執行多個查詢,而每個查詢之間只有很小的差別時,預處理語句將會非常有用。
? ?例如,可以預備一條語句,然后多次執行它,而每次只是數據值不同。
? ?除了提供執行的方便外,預處理語句還能提高性能。
? ?可以在mysql命令行客戶端定義與使用預處理語句來測試與調試程序。
用戶定義變量
? ? ? ?用戶可以保存一個值到用戶定義的變量中(也稱為用戶變量),然后在以后執行預處理語句時使用它。
? ? ? ?用戶變量用@var_name表示??墒褂肧ET語句來設置用戶變量:
? ? ? ?SET @var_name = expr [, @var_name = expr] …
? ?下列示例預備了一條語句:
? ? ? ?確定一個給定國家有多少種語言被使用
? ? ? ?然后使用用戶定義的變量來執行它多次,并顯示結果:
PREPARE my_stmt FROM ' SELECT COUNT(*) FROM CountryLanguage WHERE CountryCode= ? '; SET @code = 'ESP'; EXECUTE my_stmt USING @code; SET @code = 'RUS'; EXECUTE my_stmt USING @code; DEALLOCATE PREPARE my_stmt;
可使用PREPARE語句定義一條SQL語句,用以在以后執行。
? ?語句可以是不完整的,在預備時的未知數據值可以由問號(?)來表示,它作為參數標記。
? ?在語句被執行時,可以為語句的每個參數指定一個數據值。服務器將會用數據值來替換標記符號以完成該語句。
? ?語句在每次執行時可以使用不同的值。
? ? ? ?如果PREPARE語句使用的名稱已經存在,服務器將丟棄該名稱原有的預處理語句,然后預備一個新的語句。
釋放預處理語句 ?
? ?當預處理語句被重新定義,或與服務器的連接被中斷后,預處理語句將被自動刪除。
? ?可使用DEALLOCATE PREPARE語句來釋放語句:
? ? ? ? DEALLOCATE PREPARE namepop;
? ?MySQL還提供了DROP PREPARE作為DEALLOCATE PREPARE語句的別名。 ?
總 ?結
通過本章學習, 您應學會如何使用DML語句改變數據和事務控制
創建數據庫
創建一個保存員工信息的數據庫
create database employees;
相關其他命令
show?databases;
查看當前所有數據庫
????use?employees;
“使用”一個數據庫,使其作為當前數據庫
命名規則
? ?數據庫名不得超過30個字符,變量名限制為29個
? ?必須只能包含 A–Z, a–z, 0–9, _共63個字符
? ?不能在對象名的字符間留空格
? ?必須不能和用戶定義的其他對象重名
? ?必須保證你的字段沒有和保留字、數據庫系統或常用方法沖突
? ?保持字段名和類型的一致性,在命名字段并為其指定數據類型的時候一定要保證一致性。假如數據類型在一個表里是整數,那在另一個表里可就別變成字符型了
CREATE TABLE 語句
? ?必須具備:
? ? ? ?CREATE TABLE權限
? ? ? ?存儲空間
? ?必須指定:
? ? ? ?表名
? ? ? ?列名, 數據類型, 尺寸
? ? ? ?CREATE TABLE [schema.]table
? ? ? ? ? ? ? ? ? ? ?(column datatype [DEFAULT expr][, …]);
創建表
? ?語法
? ? ? ?CREATE TABLE dept
? ? ? ? ? ? ? ? ? ?(deptno ? ? INT(2),
? ? ? ? ? ? ? ? ? ?dname ? VARCHAR(14),
? ? ? ? ? ? ? ? ? ?loc ? ? VARCHAR(13));
? ?確認
? ? ? ?DESCRIBE dept
常用數據類型
? ?INT ? ? ? ? ? ? 使用4個字節保存整數數據
? ?CHAR(size) ? ? ?定長字符數據。若未指定,默認為1個字符,最大長度255
? ?VARCHAR(size) ? ? ? 可變長字符數據,根據字符串實際長度保存,必須指定長度
? ?FLOAT(M,D) ? ? ?單精度,M=整數位+小數位,D=小數位。 D ? ?DOUBLE(M,D) ? ? ? ? 雙精度。D ? ?DATE ? ? ? ? ? ?日期型數據,格式’YYYY-MM-DD’
? ?BLOB ? ? ? ? ? ?二進制形式的長文本數據,最大可達4G
? ?TEXT ? ? ? ? ? ?長文本數據,最大可達4G
**創建表** CREATE TABLE emp ( #int類型,自增 emp_id INT AUTO_INCREMENT, #最多保存20個中英文字符 emp_name CHAR (20), #總位數不超過15位 salary DOUBLE, #日期類型 birthday DATE, #主鍵 PRIMARY KEY (emp_id) ) ;
使用子查詢創建表
使用 AS subquery 選項,將創建表和插入數據結合起來
指定的列和子查詢中的列要一一對應
通過列名和默認值定義列
CREATE?TABLE?table???????? ????????[(column,?column...)]????AS?subquery;
使用子查詢創建表舉例
CREATE?TABLE????dept80?? ????????AS????? ????????????SELECT??employee_id,?last_name,???????????? ????????????salary*12?ANNSAL,?????????????hire_date???? ????????????FROM????employees???? ????????????WHERE???department_id?=?80;
ALTER TABLE 語句
使用 ALTER TABLE 語句可以實現:
向已有的表中添加列
ALTER?TABLE?dept80? ????????ADD?job_id?varchar(15);` **修改現有表中的列** 可以修改列的數據類型,?尺寸和默認值 對默認值的修改只影響今后對表的修改 ``ALTER?TABLE?dept80 ????????????????MODIFY??????(last_name?VARCHAR(30));
ALTER TABLE dept80 MODIFY (salary double(9,2) default 1000);
丟棄現有表中的列
? ? ? ?使用 DROP COLUMN 子句丟棄不再需要的列.
????ALTER?TABLE??dept80????????????DROP?COLUMN??job_id;
重命名現有表中的列
? ? ? ?使用 CHANGE ?old_column ?new_column ?dataType子句重命名列
ALTER TABLE dept80 *CHANGE department_name dept_name varchar(15);
丟棄表*
? ?數據和結構都被刪除
? ?所有正在運行的相關事務被提交
? ?所有相關索引被刪除
? ?DROP TABLE 語句不能回滾
? ? ? ?DROP TABLE dept80;
清空表
? ?TRUNCATE TABLE 語句:
? ? ? ?刪除表中所有的數據
? ? ? ?釋放表的存儲空間
? ? ? ?TRUNCATE TABLE detail_dept;
? ?TRUNCATE語句不能回滾
? ?可以使用 DELETE 語句刪除數據,可以回滾
? ?對比:
? ? ? ?delete from emp2;
? ? ? ?select * from emp2;
? ? ? ?rollback;
? ? ? ?select * from emp2;
改變對象的名稱
執行RENAME語句改變表, 視圖的名稱
必須是對象的擁有者
? ?ALTER table dept
? ?RENAME TO detail_dept;
數據處理之增刪改
數據操縱語言
DML(Data Manipulation Language – 數據操縱語言) 可以在下列條件下執行:
? ?向表中插入數據
? ?修改現存數據
? ?刪除現存數據
事務是由完成若干項工作的DML語句組成的
插入數據
使用 INSERT 語句向表中插入數據。 INSERT INTO table [(column [, column...])] VALUES (value [, value...]); 為每一列添加一個新值。 按列的默認順序列出各個列的值。 在 INSERT 子句中隨意列出列名和他們的值。 字符和日期型數據應包含在單引號中。
INSERT?INTO?departments(department_id,??????????????????department_name,??????????????????? ????manager_id,? ????location_id)????????????VALUES??????(70,?'Public?Relations',?100,?1700);
INSERT INTO employees(employee_id,last_name,email,hire_date,job_id)
向表中插入空值
? ? ? ?隱式方式: 在列名表中省略該列的值。
? ? ? ? ? ?INSERT INTO departments (department_id, department_name ? ?)
? ? ? ? ? ?VALUES ? ? ?(30, ‘Purchasing’);
? ? ? ?顯示方式: 在VALUES 子句中指定空值。
? ? ? ? ? ?INSERT INTO departments
? ? ? ? ? ?VALUES ? ? ?(100, ‘Finance’, NULL, NULL);
? ?插入指定的值
? ? ? ?NOW()函數:記錄當前系統的日期和時間。
? ? ? ? ? ?INSERT INTO employees (employee_id,
? ? ? ? ? ? ? ? ? ? ? ? ? ?first_name, last_name,
? ? ? ? ? ? ? ? ? ? ? ? ? ?email, phone_number,
? ? ? ? ? ? ? ? ? ? ? ? ? ?hire_date, job_id, salary,
? ? ? ? ? ? ? ? ? ? ? ? ? ?commission_pct, manager_id,
? ? ? ? ? ? ? ? ? ? ? ? ? ?department_id)
? ? ? ? ? ?VALUES ? ? ? ? (113,
? ? ? ? ? ? ? ? ? ? ? ? ? ‘Louis’, ‘Popp’,
? ? ? ? ? ? ? ? ? ? ? ? ? ‘LPOPP’, ‘515.124.4567’,
? ? ? ? ? ? ? ? ? ? ? ? ? NOW(), ‘AC_ACCOUNT’, 6900,
? ? ? ? ? ? ? ? ? ? ? ? ? NULL, 205, 100);
從其它表中拷貝數據
? ? ? ?在 INSERT 語句中加入子查詢。 ?
? ? ? ?不必書寫 VALUES 子句。 ?
? ? ? ?子查詢中的值列表應與 INSERT 子句中的列名對應
INSERT INTO emp2 SELECT * FROM employees WHERE department_id = 90; INSERT INTO sales_reps(id, name, salary, commission_pct) SELECT employee_id, last_name, salary, commission_pct FROM employees WHERE job_id LIKE '%REP%';
*更新數據*
UPDATE 語句語法 使用 UPDATE 語句更新數據。 UPDATE table SET column = value [, column = value, ...] [WHERE condition];
可以一次更新多條數據。
? ? ? ?如果需要回滾數據,需要保證在DML前,進行設置:SET AUTOCOMMIT = FALSE;
? ? ? ?使用 WHERE 子句指定需要更新的數據。
UPDATE employees SET department_id = 70 WHERE employee_id = 113;
如果省略 WHERE 子句,則表中的所有數據都將被更新。
? ? ? ? ? ?UPDATE ?copy_emp
? ? ? ? ? ?SET ? ? department_id = 110;
更新中的數據完整性錯誤
UPDATE employees SET department_id = 55 WHERE department_id = 110; 不存在 55 號部門
刪除數據
使用 DELETE 語句從表中刪除數據。 DELETE FROM table [WHERE condition];
使用 WHERE 子句刪除指定的記錄。
DELETE FROM departments WHERE department_name = 'Finance';
如果省略 WHERE 子句,則表中的全部數據將被刪除
? ? ? ? ? ?DELETE FROM ?copy_emp;
? ?刪除中的數據完整性錯誤
DELETE FROM departments WHERE department_id = 60; 不存在60號部門
數據庫處理之查詢
1—基本select語句
SELECT ? 標識選擇哪些列。
FROM ? ? 標識從哪個表中選擇。
// 查詢 select * from 表名;// 查詢表中的所有數據, 查詢所有列 // 虛表的列由select后面from前面的內容 select manager_id, manager_id, department_name from departments;
注 ?意:
? ?SQL 語言大小寫不敏感。 ?
? ?SQL 可以寫在一行或者多行
? ?關鍵字不能被縮寫也不能分行
? ?各子句一般要分行寫。
? ?使用縮進提高語句的可讀性。
列的別名:
重命名一個列。
便于計算。緊跟列名,也可以在列名和別名之間加入關鍵字‘AS’,別名使用雙引號,以便在別名中包含空格或特殊的字符并區分大小寫。
? ?// 列的別名
select manager_id as manager, manager_id, department_name "dept name" from departments;
字符串可以是 SELECT 列表中的一個字符,數字,日期。
日期和字符只能在單引號中出現。
每當返回一行時,字符串被輸出一次。
使用 DESCRIBE 命令,表示表結構
2—過濾和排序數據
使用WHERE 子句,將不滿足條件的行過濾掉。 WHERE 子句緊隨 FROM 子句。 SELECT employee_id, last_name, job_id, department_id FROM employees WHERE department_id = 90 ;
(1)比較運算
? ?賦值使用 := 符號
SELECT last_name, salary FROM employees WHERE salary <= 3000;
(2)其它比較運算
SELECT last_name, salary FROM employeesWHERE salary BETWEEN 2500 AND 3500;
使用 IN運算顯示列表中的值。
SELECT employee_id, last_name, salary, manager_id FROM employees WHERE manager_id IN (100, 101, 201);
使用 LIKE 運算選擇類似的值
? ?選擇條件可以包含字符或數字:
? ? ? ?% 代表零個或多個字符(任意個字符)。
? ? ? ?_ 代表一個字符。
SELECT first_name FROM employees WHERE first_name LIKE 'S%';
‘%’和‘-’可以同時使用。
SELECT last_name FROM employees WHERE last_name LIKE '_o%';
使用 IS (NOT) NULL 判斷空值。
SELECT last_name, manager_id FROM employees WHERE manager_id IS NULL;
(3)邏輯運算
AND 要求并的關系為真。
SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary >=10000 AND job_id LIKE '%MAN%';
OR 要求或關系為真。
SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary >= 10000 OR job_id LIKE '%MAN%'; NOT SELECT last_name, job_id FROM employees WHERE job_id NOT IN ('IT_PROG', 'ST_CLERK', 'SA_REP');
ORDER BY子句
? ?使用 ORDER BY 子句排序
? ? ? ?ASC(ascend): 升序(默認方式)
? ? ? ?DESC(descend): 降序
? ?ORDER BY 子句在SELECT語句的結尾。
SELECT last_name, job_id, department_id, hire_date FROM employees ORDER BY hire_date ;
降序排序
SELECT last_name, job_id, department_id, hire_date FROM employees ORDER BY hire_date DESC ;
按別名排序
SELECT employee_id, last_name, salary*12 annsal FROM employees ORDER BY annsal;
多個列排序:按照ORDER BY 列表的順序排序??梢允褂貌辉赟ELECT 列表中的列排序。
SELECT last_name, department_id, salary FROM employees ORDER BY department_id, salary DESC;
3 — 多表查詢
? ?從多個表中獲取數據
? ?笛卡爾集
? ?笛卡爾集會在下面條件下產生:
? ? ? ?省略連接條件
? ? ? ?連接條件無效
? ? ? ?所有表中的所有行互相連接
? ?為了避免笛卡爾集, 可以在 WHERE 加入有效的連接條件。
使用連接在多個表中查詢數據。
? ?在 WHERE 子句中寫入連接條件。
? ?在表中有相同列時,在列名之前加上表名前綴
? ?SELECT ?table1.column, table2.column
? ?FROM ? ?table1, table2
? ?WHERE ? table1.column1 = table2.column2;
等值連接
SELECT employees.employee_id, employees.last_name, employees.department_id, departments.department_id, departments.location_id FROM employees, departments WHERE employees.department_id = departments.department_id;
多個連接條件與 AND 操作符 ?
區分重復的列名
? ?使用表名前綴在多個表中區分相同的列。
? ?在不同表中具有相同列名的列可以用表的別名加以區分。
表的別名
? ?使用別名可以簡化查詢。
SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id FROM employees e , departments d WHERE e.department_id = d.department_id;
連接多個表
? ?連接 n個表,至少需要 n-1個連接條件。 例如:連接三個表,至少需要兩個連接條件。
使用ON 子句創建連接
? ?自然連接中是以具有相同名字的列為連接條件的。
? ?可以使用 ON 子句指定額外的連接條件。
? ?這個連接條件是與其它條件分開的。
? ?ON 子句使語句具有更高的易讀性。
SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_idF ROM employees e JOIN departments d ON (e.department_id = d.department_id);
使用 ON 子句創建多表連接
SELECT employee_id, city, department_name FROM employees e JOIN departments d ON d.department_id = e.department_id JOIN locations l ON d.location_id = l.location_id;
4 — 單行函數
? ?大小寫控制函數:這類函數改變字符的大小寫。
字符控制函數:這類函數控制字符
數字函數 ?
? ?ROUND: 四舍五入ROUND(45.926, 2) ? ? ? ? 45.93
? ?TRUNCATE: ? ?截斷TRUNC(45.926, 2) ? ? 45.92
? ?MOD: 求余MOD(1600, 300) ? ? ? ? ? ? ? ? ? ? ? 100
條件表達式(了解)
? ?在 SQL 語句中使用IF-THEN-ELSE 邏輯
? ?使用方法:
? ? ? ?CASE 表達式
5 — 分組函數
? ?分組函數作用于一組數據,并對一組數據返回一個值。
組函數類型
? ?AVG() COUNT() MAX() MIN() SUM()
組函數語法
? ?SELECT ?[column,] group_function(column), …
? ?FROM ? ? ? ?table
? ?[WHERE ?condition]
? ?[GROUP BY ? column]
? ?[ORDER BY ? column];
AVG(平均值)和 SUM (合計)函數
可以對數值型數據使用AVG 和 SUM 函數。
SELECT AVG(salary), MAX(salary), MIN(salary), SUM(salary) FROM employees WHERE job_id LIKE '%REP%';
MIN(最小值)和 MAX(最大值)函數
可以對任意數據類型的數據使用 MIN 和 MAX 函數。
SELECT MIN(hire_date), MAX(hire_date) FROM employees;
COUNT(計數)函數
COUNT(*) 返回表中記錄總數,適用于任意數據類型。
SELECT COUNT(*) FROM employees WHERE department_id = 50;
COUNT(expr) 返回expr不為空的記錄總數。
SELECT COUNT(commission_pct) FROM employees WHERE department_id = 50;
分組數據: ?GROUP BY 子句語法
可以使用GROUP BY子句將表中的數據分成若干組
明確:WHERE一定放在FROM后面
SELECT column, group_function(column) FROM table [WHERE condition] [GROUP BY group_by_expression] [ORDER BY column];
在SELECT 列表中所有未包含在組函數中的列都應該包含在 GROUP BY 子句中。
SELECT department_id, AVG(salary) FROM employees GROUP BY department_id ;
包含在 GROUP BY 子句中的列不是必須包含在SELECT 列表中
SELECT AVG(salary) FROM employees GROUP BY department_id ;
在GROUP BY子句中包含多個列
SELECT department_id dept_id, job_id, SUM(salary) FROM employees GROUP BY department_id, job_id ;
非法使用組函數
不能在 WHERE 子句中使用組函數。
可以在 HAVING 子句中使用組函數。
SELECT department_id, AVG(salary) FROM employees WHERE AVG(salary) > 8000 GROUP BY department_id; WHERE AVG(salary) > 8000; ERROR at line 3: ORA-00934: group function is not allowed here
過濾分組: HAVING 子句
使用 HAVING 過濾分組:
1. ?行已經被分組。
2. ?使用了組函數。
3. ?滿足HAVING 子句中條件的分組將被顯示。
SELECT??column,?group_function????FROM????????table ????[WHERE??condition] ????[GROUP?BY???group_by_expression] ????[HAVING?group_condition] ????[ORDER?BY???column];
SELECT department_id, MAX(salary) FROM employees GROUP BY department_id HAVING MAX(salary)>10000 ;
6—子查詢
子查詢語法
SELECT select_listF ROM table WHERE expr operator (SELECT select_list FROM table);
子查詢 (內查詢) 在主查詢之前一次執行完成。
子查詢的結果被主查詢(外查詢)使用 。
SELECT last_name FROM employees WHERE salary > (SELECT salary FROM employees WHERE last_name = 'Abel');
注意事項:
? ?子查詢要包含在括號內。
? ?單行操作符對應單行子查詢,多行操作符對應多行子查詢。
子查詢類型
單行子查詢:子查詢返回給主查詢的結果為一個值。
? ?只返回一行。
? ?使用單行比較操作符。
題目:返回job_id與141號員工相同,salary比143號員工多的員工姓名,job_id 和工資
SELECT last_name, job_id, salary FROM employees WHERE job_id = (SELECT job_id FROM employees WHERE employee_id = 141) AND salary > (SELECT salary FROM employees WHERE employee_id = 143);
在子查詢中使用組函數
SELECT last_name, job_id, salary FROM employees WHERE salary = (SELECT MIN(salary) FROM employees);
子查詢中的 HAVING 子句
? ?首先執行子查詢。向主查詢中的HAVING 子句返回結果。
? ?題目:查詢最低工資大于50號部門最低工資的部門id和其最低工資
SELECT department_id, MIN(salary) FROM employees GROUP BY department_id HAVING MIN(salary) > (SELECT MIN(salary) FROM employees WHERE department_id = 50);
非法使用子查詢
SELECT employee_id, last_name FROM employees WHERE salary in (SELECT MIN(salary) FROM employees GROUP BY department_id);
多行子查詢使用單行比較符
? ?子查詢中的空值問題
SELECT last_name, job_id FROM employees WHERE job_id = (SELECT job_id FROM employees WHERE last_name = 'Haas');
子查詢不返回任何行
多行子查詢:子查詢返回給主查詢的結果多與一個值。
? ?返回多行。
? ?使用多行比較操作符。
在多行子查詢中使用 ANY 操作符
? ?題目:返回其它部門中比job_id為‘IT_PROG’部門任一工資低的員工的員工號、姓名、job_id 以及salary
SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary < ANY (SELECT salary FROM employees WHERE job_id = 'IT_PROG') AND job_id <> 'IT_PROG';
在多行子查詢中使用 ALL 操作符
? ?題目:返回其它部門中比job_id為‘IT_PROG’部門所有工資都低的員工的員工號、姓名、job_id 以及salary
SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary < ALL (SELECT salary FROM employees WHERE job_id = 'IT_PROG') AND job_id <> 'IT_PROG';
子查詢中的空值問題
SELECT emp.last_name FROM employees emp WHERE emp.employee_id NOT IN (SELECT mgr.manager_id FROM employees mgr); no rows selected
**
數據庫事務
**
? ?事務:一組邏輯操作單元,使數據從一種狀態變換到另一種狀態。
? ?數據庫事務由以下的部分組成:
? ? ? ?一個或多個DML 語句
? ? ? ?一個 DDL(Data Definition Language – 數據定義語言) 語句
? ? ? ?一個 DCL(Data Control Language – 數據控制語言) 語句
? ?在數據庫編程語言中,事務是將一個數據處理執行步驟的集合作為一個單元來處理。
? ?也就是說,執行這些步驟就好像是執行一個單個的命令一樣。
設置提交狀態:SET AUTOCOMMIT = FALSE;
? ?或者顯式的執行 start transaction或 begin
? ?以第一個 DML 語句的執行作為開始
? ?以下面的其中之一作為結束:
? ? ? ?COMMIT 或 ROLLBACK 語句
? ? ? ?DDL 語句(自動提交)
? ? ? ?用戶會話正常結束
? ? ? ?系統異常終止
? ?COMMIT和ROLLBACK語句的優點
? ? ? ?使用COMMIT 和 ROLLBACK語句,我們可以:
? ? ? ? ? ?確保數據完整性。
? ? ? ? ? ?數據改變被提交之前預覽。
? ? ? ? ? ?將邏輯上相關的操作分組。
使用預處理語句
? ?MySQL服務器支持預處理語句。當想要執行多個查詢,而每個查詢之間只有很小的差別時,預處理語句將會非常有用。
? ?例如,可以預備一條語句,然后多次執行它,而每次只是數據值不同。
? ?除了提供執行的方便外,預處理語句還能提高性能。
? ?可以在mysql命令行客戶端定義與使用預處理語句來測試與調試程序。
用戶定義變量
? ? ? ?用戶可以保存一個值到用戶定義的變量中(也稱為用戶變量),然后在以后執行預處理語句時使用它。
? ? ? ?用戶變量用@var_name表示??墒褂肧ET語句來設置用戶變量:
? ? ? ?SET @var_name = expr [, @var_name = expr] …
? ?下列示例預備了一條語句:
? ? ? ?確定一個給定國家有多少種語言被使用
? ? ? ?然后使用用戶定義的變量來執行它多次,并顯示結果:
PREPARE my_stmt FROM ' SELECT COUNT(*) FROM CountryLanguage WHERE CountryCode= ? '; SET @code = 'ESP'; EXECUTE my_stmt USING @code; SET @code = 'RUS'; EXECUTE my_stmt USING @code; DEALLOCATE PREPARE my_stmt;
可使用PREPARE語句定義一條SQL語句,用以在以后執行。
? ?語句可以是不完整的,在預備時的未知數據值可以由問號(?)來表示,它作為參數標記。
? ?在語句被執行時,可以為語句的每個參數指定一個數據值。服務器將會用數據值來替換標記符號以完成該語句。
? ?語句在每次執行時可以使用不同的值。
? ? ? ?如果PREPARE語句使用的名稱已經存在,服務器將丟棄該名稱原有的預處理語句,然后預備一個新的語句。
釋放預處理語句 ?
? ?當預處理語句被重新定義,或與服務器的連接被中斷后,預處理語句將被自動刪除。
? ?可使用DEALLOCATE PREPARE語句來釋放語句:
? ? ? ? DEALLOCATE PREPARE namepop;
? ?MySQL還提供了DROP PREPARE作為DEALLOCATE PREPARE語句的別名。 ?
總 ?結
通過本章學習, 您應學會如何使用DML語句改變數據和事務控制
以上就是MySQL數據庫、表的管理,數據庫的增刪改查的內容,更多相關內容請關注PHP中文網(www.php.cn)!