2025-03-24

創建資料庫

創建一個保存員工信息的資料庫
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<=M<=255,0<=D<=30,默認M+D<=6
DOUBLE(M,D) 雙精度。D<=M<=255,0<=D<=30,默認M+D<=15
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表示。可使用SET語句來設置用戶變量:
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語句的別名。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *