mysql 基礎學習筆記

安裝

MacOShtml

Windows 10mysql

Centos 7web

SQL規範

  1. 不區分大小寫,可是建議大寫 關鍵詞,小寫 表名列名
  2. 每條SQL建議分號結尾
  3. 每條SQL根據須要進行換行縮進
  4. 註釋: 單行: # -- 多行: /* */

類型

數值:
    整型:
    小數:
        定點數
        浮點數
字符:
    短字符: char varcahr 
    長文本: text blob
日期:
    date        2020-02-03
    datetime    2020-02-02 02:02:02
    timesiamp   1594279093389
    time        02:02:02
    year        2020
複製代碼

經常使用SQL

use test; -- 選中 數據庫
show tables; -- 現實當前選中的庫的全部表  show tables from mysql; # 查詢mysql下的tables  SHOW INDEX FROM stuinfo; # 顯示當前的索引  select database(); # 查看當前庫  /* create table table1(  id int,  name varchar(24) ); */  desc table1; -- 查看錶結構  select * from table1;  insert into table1 (id,name) values(1,'測試'); -- 插入  update table1 set name='我靠' where name='ces'; -- 修改  update table1 set id=0 where name='我靠'; -- 修改  delete from table1 where name='我靠'; -- 刪除   複製代碼

常見函數

單行函數

處理sql

字符函數

SELECT LENGTH('我是誰'); -- 根據當前字符集 獲得當前字節長度
 SELECT CONCAT('我','是','誰呀'); -- 拼接字符串  SELECT UPPER('Abc'); -- 轉換成大寫字符  SELECT LOWER('Abc'); -- 轉換成小寫  SELECT SUBSTR('abc123一二三',4,3); -- 從4開始截取3個 包含4 索引從1開始  SELECT SUBSTRING('abc123一二三',4,3); -- 從4開始截取3個 包含4 索引從1開始  SELECT INSTR('01234556','234'); -- 查找字符串出現的位置 沒找到就是0  SELECT TRIM(' A B C D '); -- 去除先後空格  SELECT TRIM('a' FROM 'aaaaA B CaaaDaaaa' ); -- 去除先後的a  SELECT LPAD('abc123一二三',20,'*'); -- 左填充/保留左邊的 SELECT RPAD('abc123一二三',20,'*'); -- 右填充/保留左邊的  複製代碼

數學函數

SELECT ROUND(0.4); -- 四捨五入
SELECT ROUND(0.5); -- 四捨五入 SELECT ROUND(-0.4); -- 四捨五入 SELECT ROUND(-0.5); -- 四捨五入  SELECT CEIL(0.2); -- 向上取整 SELECT FLOOR(0.9); -- 向下取整  SELECT RAND(); -- 隨機數  SELECT TRUNCATE(0.2345,3); -- 保留多少位小數 不進行處理  SELECT MOD(10,3); -- 取餘  複製代碼

日期函數

SELECT NOW(); -- 返回當前的日期時間
 SELECT CURDATE(); -- 返回當前的日期  SELECT CURTIME(); -- 返回當前時間  SELECT YEAR(NOW()) as `year`, MONTH(NOW()) as `month`, DAY(NOW()) as date as `day`; -- 年/月/日  SELECT STR_TO_DATE('2020-03-23 22:32:12','%Y-%m-%d %H:%i:%s'); -- 將字符串解析成時間  SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s'); -- 格式化時間 複製代碼

其餘函數

SELECT VERSION(); -- 查看版本號
 SELECT DATABASE(); -- 查看當前的庫  SELECT USER(); -- 當前用戶 複製代碼

流程控制函數

SELECT IF(10<5,'大','小'); -- if
 SELECT `last_name`, IF(`commission_pct` IS NULL,TRUE,FALSE) AS isPct from `employees` ORDER BY `isPct` DESC; -- if 例子  # case  SELECT `salary`,`department_id`, CASE department_id  WHEN 80 THEN  salary * 1.2  WHEN 40 THEN  salary * 1.9  ELSE  salary * 0 END AS newMoney FROM `employees` ORDER BY department_id DESC;  複製代碼

統計函數

統計數據庫

SELECT COUNT(*) FROM `employees`; -- 數量統計
SELECT SUM(`salary`) FROM `employees`; -- 相加和 SELECT AVG(`salary`) FROM `employees`; -- 平均值 SELECT MAX(`salary`) FROM `employees`; -- 最大值 SELECT MIN(`salary`) FROM `employees`; -- 最小值  SELECT COUNT(*) AS `count`, SUM(`salary`) AS `sum`, AVG(`salary`) AS `avg`, MAX(`salary`) as `max`, MIN(`salary`) as `min` FROM `employees`;  # 注意 /*  */ 複製代碼

常見約束

一種限制,用於限制表中的數據,用來保證表中數據的準確和可靠性安全

函數

分類: 六大約束: NOT NULL: 非空,用於保證該字段的值不能爲空 DEFAULT: 默認值 PRIMARY KEY: 主鍵,用於保證該字段具備惟一性(非空) UNIQUE: 惟一(可空) CHECK: 檢查 (mysql 不支持) FOREIGN KEY: 外鍵,用於限制兩個表的關係,用於保證該字段必須來自關聯表的主鍵 添加約束的時機: 1. 建立表 2. 修改表 約束的添加分類: 列級約束: 六大約束語法上都支持,外鍵約束無效 表級約束: 除了非空和默認其餘都支持

主鍵和惟一的區別: 主鍵:惟1、非空、只能一個 惟一:惟1、可空、多個編輯器

複製代碼外鍵: 1. 從表設置外鍵關係 2. 主從表類型一致/兼容 3. 主表關聯鍵通常爲主鍵或惟一 4. 必須對應主表數據,刪除先刪除從表再刪除主表 複製代碼

DQL 數據查詢語言

常量、表達式、函數

SELECT 1; -- 常量值
SELECT 10*20; -- 表達式 SELECT VERSION(); -- 函數 複製代碼

別名

SELECT 1+2 as number;
複製代碼

去重

SELECT DISTINCT 
 `name` FROM  `table` 複製代碼

+號

SELECT 1+2; -- 數字相加
SELECT 1+'123'; -- 字符串會強轉成數字非數字轉爲0 SELECT 1 + Null; -- 與Null返回Null 複製代碼

字符串鏈接 concat

SELECT CONCAT('a','b','c'); -- 字符串拼接
SELECT CONCAT(`first_name`,`last_name`) as `name` FROM `employees`; -- 拼接字段 複製代碼

條件查詢

條件表達式

< > >= <= != <> <=>測試

# 等於
SELECT  CONCAT(`first_name`,`last_name`) as `name` FROM `employees` WHERE  `first_name`='Bruce';  # 安全等於 可查 Null  SELECT  CONCAT(`first_name`,`last_name`) as `name` FROM `employees` WHERE  `first_name`<=>'Bruce';  # 大於 SELECT  * FROM `employees` WHERE  `department_id` > 60;  # 小於 SELECT  * FROM `employees` WHERE  `department_id` <= 60;  # 不等於  # != 不建議 SELECT  * FROM `employees` WHERE  `department_id` <> 60; 複製代碼
邏輯表達式

&& || !
AND OR NOTui

# 且查詢
# 不建議 && SELECT CONCAT(`first_name`,`last_name`) as `name` FROM `employees` WHERE  `first_name`='Bruce'  AND  `last_name`='Ernst';  # 或 SELECT  CONCAT(`first_name`,`last_name`) as `name` FROM `employees` WHERE  `first_name`='Bruce'  OR  `last_name`='K_ing';  # 非 SELECT  CONCAT(`first_name`,`last_name`) as `name` FROM `employees` WHERE  NOT  `first_name`='Bruce' 複製代碼
模糊查詢
like 模糊查詢

%:任意多個字符 _: 任意單個字符 \: 轉義

# 包含 a
SELECT * FROM `employees` WHERE  `first_name` like '%a%';  # 定義轉義字符 SELECT * FROM `employees` WHERE  `last_name` like '%$_%' ESCAPE ' 
between and複製代碼 範圍

在什麼到什麼之間,包含先後

# 查找100 到200 之間的數據
SELECT * FROM `employees` WHERE  `employee_id` BETWEEN 100 AND 200; 複製代碼
in複製代碼 屬於

查詢是否屬於某些列表中的某一個

# 查詢是否屬於某些列表中的某一個
SELECT * FROM `employees` WHERE  `job_id` IN ('SH_CLERK','AD_ASST','AD_VP'); 複製代碼
is null複製代碼 or is not null複製代碼 是否爲Null
# 查詢字段爲空的
SELECT * FROM `employees` WHERE  `commission_pct` IS NULL;  # 查詢不爲空的 SELECT * FROM `employees` WHERE  NOT `commission_pct` IS NULL;  SELECT * FROM `employees` WHERE  `commission_pct` IS NOT NULL; 複製代碼
<=>複製代碼 安全等於

既能夠判斷NULL 又能夠判斷數值

SELECT * FROM `employees`
WHERE  `commission_pct` <=> NULL; 複製代碼
order by複製代碼 排序

ASC複製代碼升序 DESC複製代碼降序 默認 ASC複製代碼

SELECT * FROM `employees` ORDER BY `salary` ASC; -- 升序
SELECT * FROM `employees` ORDER BY `salary` DESC; -- 降序  SELECT `salary` * IFNULL(`commission_pct`,0) + IFNULL(manager_id,0) as money,`salary` FROM `employees` ORDER BY `money`; -- 表達式別名降序  SELECT LENGTH(`last_name`) as len FROM `employees` ORDER BY len; -- 按函數  SELECT * FROM `employees` ORDER BY `salary` DESC, `employee_id` ASC; -- 多個排序條件 複製代碼

分組查詢


# 每一個工種的總工資 SELECT SUM(`salary`) AS `money`,`job_id` FROM `employees` GROUP BY `job_id` ORDER BY `money`;  # 每一個工種的最高工資 SELECT MAX(`salary`) as `max`,`job_id` FROM `employees` GROUP BY `job_id` ORDER BY `max`;  # 查詢郵箱包含a的工種的最高工資 SELECT MAX(`salary`) as `max`, `job_id` FROM `employees` WHERE email LIKE '%a%' GROUP BY `job_id` ORDER BY `max`;  # 查詢郵箱包含a的工種的最高工資大於1萬的 HAVING SELECT MAX(`salary`) as `max`, `job_id` FROM `employees` WHERE email LIKE '%a%' GROUP BY `job_id` HAVING `max` > 10000 ORDER BY `max`;  # 查詢名稱長度同樣的大於5我的的數據 SELECT LENGTH(`first_name`) AS `name`, COUNT(1) AS `count` FROM `employees` GROUP BY `name` HAVING `count` > 5;  # 多字段分組 SELECT AVG(`salary`) AS `avg`,`department_id`,`job_id` FROM `employees` GROUP BY `department_id`,`job_id` ORDER BY `department_id`,`job_id` 複製代碼

鏈接查詢

分類:
    按年代劃分:
        sql92標準:只支持內鏈接
        sql99標準【推薦】:支持內鏈接+外來鏈接(左外、右外)+交叉鏈接
    按功能劃分:
        內鏈接:
            等值鏈接
            非等值鏈接
            自鏈接
        外鏈接:
            左外鏈接
            右外鏈接
            全外鏈接
        交叉鏈接
複製代碼

sql92標準

# 等值鏈接
SELECT e.`first_name`,j.`job_title`,`j`.`job_id` FROM `employees` as e,`jobs` as j WHERE `e`.`job_id` = `j`.`job_id`;  # 非等值鏈接  # 自鏈接 SELECT e.last_name,m.employee_id,e.manager_id,m.last_name FROM `employees` AS e, `employees` AS m WHERE `e`.employee_id = `m`.manager_id 複製代碼

sql99標準

# 等值鏈接
SELECT `last_name`,`department_name` FROM employees INNER JOIN departments ON employees.`department_id` = departments.`department_id`  # 複雜的等值鏈接 SELECT department_name,COUNT('*') AS count,MAX(`salary`) AS max,min(`salary`) AS min FROM employees INNER JOIN departments ON employees.department_id = departments.department_id WHERE last_name LIKE '%o%' GROUP BY department_name HAVING `count` BETWEEN 2 AND 10 ORDER BY `count`  # 多表等值鏈接 SELECT last_name,department_name,job_title FROM employees INNER JOIN departments ON departments.department_id =employees.department_id INNER JOIN jobs ON employees.job_id = jobs.job_id;  複製代碼

子查詢

分類:
    按出現位置:
        select 後面:
            只支持標量子查詢
        form 後面
            表子查詢
        where 和having後面 *
            標量子查詢  *
            列子查詢    *
            行子查詢
        exists後面
            表子查詢
按結果集的行列數不一樣:
    標量子查詢(結果集只有一行一列)
    列子查詢(結果集只有一列多行)
    行子查詢(結果集只有多列一行)
    表子查詢(結果集通常多行多列)
複製代碼
複製代碼

複製代碼

where 和having後面

特色: 1. 放在小括號內 2. 放在條件右側 3. 標量子查詢:配合單行操做符。列子查詢:配合多行操做符。


# 查詢工資比Abel高的人 SELECT * FROM employees WHERE salary > (  SELECT salary FROM employees  WHERE last_name = 'Abel' );  # job_id與141號員工同樣且工資大於143號員工的員工 SELECT last_name,salary,employee_id FROM employees WHERE job_id = (  SELECT job_id FROM employees WHERE employee_id = 141 ) AND salary > (  SELECT salary FROM employees WHERE employee_id = 143 )  # 查詢比50號部門最低工資高的部門的最低工資 SELECT department_id, COUNT(*),MIN(salary) AS minsalary FROM employees GROUP BY department_id HAVING minsalary > (SELECT MIN(salary) AS minsalary FROM employees WHERE department_id = 50) ORDER BY minsalary DESC; 複製代碼

分頁查詢

SELECT *
FROM `employees` LIMIT (page-1)*size,size;  SELECT * FROM `employees` LIMIT 10,10; 複製代碼

聯合查詢

# 無
複製代碼

DML 數據操做語言

插入

INSERT INTO jobs(job_id,job_title,min_salary,max_salary) VALUES('p_a','撿垃圾1',200,6000);
 INSERT INTO jobs VALUES('p_a1','撿垃圾1',200,6000), ('p_a2','撿垃圾2',200,6000);  INSERT INTO jobs SET job_id = 'ces',job_title="123"  INSERT INTO jobs SELECT 'ces1','444',200,6000 複製代碼

修改

# 簡單修改
UPDATE jobs SET job_title = '2222' WHERE job_id = 'ces1'  # 修改多表 UPDATE jobs INNER JOIN employees ON employees.job_id = jobs.job_id SET jobs.job_title = CONCAT(jobs.job_title,'22222'),employees.job_id = 'ces1' WHERE jobs.job_title = 'Public Accountant12322222' 複製代碼

刪除

# 單表刪除
DELETE FROM jobs WHERE job_id = 'ces'  # 清空整表 TRUNCATE TABLE ttt;  # 多表刪除 DELETE employees FROM employees INNER JOIN jobs ON jobs.job_id = employees.job_id WHERE jobs.job_id = 'SA_MAN' 複製代碼

DDL 數據定義語言

1. 庫的管理
    建立\修改\刪除
2. 表的管理
    建立\修改\刪除
複製代碼

建立: create 修改: alter 刪除: drop 複製代碼

庫管理

# 建立 IF NOT EXISTS 進行容錯 CHARACTER SET 字符集
CREATE DATABASE IF NOT EXISTS books CHARACTER SET utf8;  # 修改 不能該了 RENAME DATABASE books TO newbook;  # 更改字符集 ALTER DATABASE books CHARACTER SET gbk;  # 庫的刪除 DROP DATABASE IF EXISTS books;  複製代碼

表的管理

建立表

USE books;
# 表的建立 /* CREATE TABLE 表名(  列名 列類型([長度]) [約束],  列名 列類型([長度]) [約束],  ... ) */ CREATE TABLE book (  id INT,  b_name VARCHAR(20),  price DOUBLE,  author_id INT,  publish_date DATETIME );  DESC book;  CREATE TABLE author(  id INT,  au_name VARCHAR(20),  nation VARCHAR(10) );  DESC author; 複製代碼

表的修改

/* 修改列: ALTER TABLE 表名 [CHANGE|MODIFY|ADD|DROP] COLUMN 列名 類型|約束; 修改表名: ALTER TABLE 表名 RENAME TO 新表名; */ # 修改列名 ALTER TABLE book CHANGE COLUMN publish_date publishDate DATETIME; # 修改列類型約束 ALTER TABLE book MODIFY COLUMN publishDate TIMESTAMP; # 添加新列 ALTER TABLE author ADD COLUMN annual DOUBLE; # 刪除 ALTER TABLE author DROP COLUMN annual; # 修改表名 ALTER TABLE author RENAME TO authers; 複製代碼

表的刪除

DROP TABLE IF EXISTS authers;
複製代碼

表的複製

# 複製表結構
CREATE TABLE copy LIKE author;  # 複製整個表 CREATE TABLE copy2 SELECT * FROM author; 複製代碼

約束

添加表時添加約束

# 列級約束
CREATE TABLE stuinfo(  id INT PRIMARY KEY, # 主鍵  stu_name VARCHAR(20) NOT NULL, # 非空  gender CHAR(1) DEFAULT '男', # 默認  seat INT UNIQUE # 惟一 );  # 表級約束 CREATE TABLE stuinfo(  id INT, # 主鍵  stu_name VARCHAR(20), # 非空  gender CHAR(1) , # 默認  seat INT, # 惟一  majorid INT,   CONSTRAINT pk PRIMARY KEY(id),# 主鍵  CONSTRAINT uq UNIQUE(seat),# 惟一  CONSTRAINT fk_stuiinfo_major FOREIGN KEY(majorid) REFERENCES major(id)# 外鍵 );  # 通用建議約束 DROP TABLE IF EXISTS stuinfo; CREATE TABLE stuinfo(  id INT PRIMARY KEY, # 主鍵  stu_name VARCHAR(20) NOT NULL, # 非空  gender CHAR(1) DEFAULT '男', # 默認  seat INT UNIQUE, # 惟一  majorid INT,  -- 表級約束  CONSTRAINT fk_stuiinfo_major FOREIGN KEY(majorid) REFERENCES major(id)# 外鍵 );   複製代碼

修改表時的約束

# 修改列約束
ALTER TABLE stuinfo MODIFY COLUMN stu_name VARCHAR(20) NOT NULL; # 表級約束 ALTER TABLE stuinfo ADD PRIMARY KEY(id); ALTER TABLE stuinfo ADD FOREIGN KEY(majorid) REFERENCES major(id); # 刪除外鍵 # ALTER TABLE stuinfo DROP PRIMARY KEY; 複製代碼

標識列(自增加列)

AUTO_INCREMENT

CREATE TABLE stuinfo(
 id INT PRIMARY KEY AUTO_INCREMENT, # 主鍵  stu_name VARCHAR(20) NOT NULL, # 非空  gender CHAR(1) DEFAULT '男', # 默認  seat INT UNIQUE, # 惟一  majorid INT,  -- 表級約束  CONSTRAINT fk_stuiinfo_major FOREIGN KEY(majorid) REFERENCES major(id)# 外鍵 ); 複製代碼

TCL 事務控制語言

一個或一組sql語句組成一個執行單位,要麼所有執行,要麼所有失敗。

ACID: A: 原子性 C: 一致性 I: 隔離性 D: 持久性

# 提交表示完成,回滾表明異常
set autocommit = 0; -- 關閉自動事務 START TRANSACTION; -- 開始事務 UPDATE stuinfo SET stu_name = '12232' WHERE id = 3; SAVEPOINT a; -- 保存節點 UPDATE stuinfo SET stu_name = '12332' WHERE id = 5; ROLLBACK; -- 回滾事務 ROLLBACK TO a; -- 回滾事務到指定節點 COMMIT; -- 提交事務  複製代碼

本文使用 mdnice 排版

複製代碼between and複製代碼# 查找100 到200 之間的數據 SELECT * FROM `employees` WHERE `employee_id` BETWEEN 100 AND 200; 複製代碼in複製代碼# 查詢是否屬於某些列表中的某一個 SELECT * FROM `employees` WHERE `job_id` IN ('SH_CLERK','AD_ASST','AD_VP'); 複製代碼is null複製代碼is not null複製代碼# 查詢字段爲空的 SELECT * FROM `employees` WHERE `commission_pct` IS NULL; # 查詢不爲空的 SELECT * FROM `employees` WHERE NOT `commission_pct` IS NULL; SELECT * FROM `employees` WHERE `commission_pct` IS NOT NULL; 複製代碼<=>複製代碼SELECT * FROM `employees` WHERE `commission_pct` <=> NULL; 複製代碼order by複製代碼ASC複製代碼DESC複製代碼ASC複製代碼SELECT * FROM `employees` ORDER BY `salary` ASC; -- 升序 SELECT * FROM `employees` ORDER BY `salary` DESC; -- 降序 SELECT `salary` * IFNULL(`commission_pct`,0) + IFNULL(manager_id,0) as money,`salary` FROM `employees` ORDER BY `money`; -- 表達式別名降序 SELECT LENGTH(`last_name`) as len FROM `employees` ORDER BY len; -- 按函數 SELECT * FROM `employees` ORDER BY `salary` DESC, `employee_id` ASC; -- 多個排序條件 複製代碼# 每一個工種的總工資 SELECT SUM(`salary`) AS `money`,`job_id` FROM `employees` GROUP BY `job_id` ORDER BY `money`; # 每一個工種的最高工資 SELECT MAX(`salary`) as `max`,`job_id` FROM `employees` GROUP BY `job_id` ORDER BY `max`; # 查詢郵箱包含a的工種的最高工資 SELECT MAX(`salary`) as `max`, `job_id` FROM `employees` WHERE email LIKE '%a%' GROUP BY `job_id` ORDER BY `max`; # 查詢郵箱包含a的工種的最高工資大於1萬的 HAVING SELECT MAX(`salary`) as `max`, `job_id` FROM `employees` WHERE email LIKE '%a%' GROUP BY `job_id` HAVING `max` > 10000 ORDER BY `max`; # 查詢名稱長度同樣的大於5我的的數據 SELECT LENGTH(`first_name`) AS `name`, COUNT(1) AS `count` FROM `employees` GROUP BY `name` HAVING `count` > 5; # 多字段分組 SELECT AVG(`salary`) AS `avg`,`department_id`,`job_id` FROM `employees` GROUP BY `department_id`,`job_id` ORDER BY `department_id`,`job_id` 複製代碼分類: 按年代劃分: sql92標準:只支持內鏈接 sql99標準【推薦】:支持內鏈接+外來鏈接(左外、右外)+交叉鏈接 按功能劃分: 內鏈接: 等值鏈接 非等值鏈接 自鏈接 外鏈接: 左外鏈接 右外鏈接 全外鏈接 交叉鏈接 複製代碼# 等值鏈接 SELECT e.`first_name`,j.`job_title`,`j`.`job_id` FROM `employees` as e,`jobs` as j WHERE `e`.`job_id` = `j`.`job_id`; # 非等值鏈接 # 自鏈接 SELECT e.last_name,m.employee_id,e.manager_id,m.last_name FROM `employees` AS e, `employees` AS m WHERE `e`.employee_id = `m`.manager_id 複製代碼# 等值鏈接 SELECT `last_name`,`department_name` FROM employees INNER JOIN departments ON employees.`department_id` = departments.`department_id` # 複雜的等值鏈接 SELECT department_name,COUNT('*') AS count,MAX(`salary`) AS max,min(`salary`) AS min FROM employees INNER JOIN departments ON employees.department_id = departments.department_id WHERE last_name LIKE '%o%' GROUP BY department_name HAVING `count` BETWEEN 2 AND 10 ORDER BY `count` # 多表等值鏈接 SELECT last_name,department_name,job_title FROM employees INNER JOIN departments ON departments.department_id =employees.department_id INNER JOIN jobs ON employees.job_id = jobs.job_id; 複製代碼分類: 按出現位置: select 後面: 只支持標量子查詢 form 後面 表子查詢 where 和having後面 * 標量子查詢 * 列子查詢 * 行子查詢 exists後面 表子查詢
按結果集的行列數不一樣:
    標量子查詢(結果集只有一行一列)
    列子查詢(結果集只有一列多行)
    行子查詢(結果集只有多列一行)
    表子查詢(結果集通常多行多列)
複製代碼
複製代碼按結果集的行列數不一樣: 標量子查詢(結果集只有一行一列) 列子查詢(結果集只有一列多行) 行子查詢(結果集只有多列一行) 表子查詢(結果集通常多行多列) 複製代碼複製代碼# 查詢工資比Abel高的人 SELECT * FROM employees WHERE salary > ( SELECT salary FROM employees WHERE last_name = 'Abel' ); # job_id與141號員工同樣且工資大於143號員工的員工 SELECT last_name,salary,employee_id FROM employees WHERE job_id = ( SELECT job_id FROM employees WHERE employee_id = 141 ) AND salary > ( SELECT salary FROM employees WHERE employee_id = 143 ) # 查詢比50號部門最低工資高的部門的最低工資 SELECT department_id, COUNT(*),MIN(salary) AS minsalary FROM employees GROUP BY department_id HAVING minsalary > (SELECT MIN(salary) AS minsalary FROM employees WHERE department_id = 50) ORDER BY minsalary DESC; 複製代碼SELECT * FROM `employees` LIMIT (page-1)*size,size; SELECT * FROM `employees` LIMIT 10,10; 複製代碼# 無 複製代碼INSERT INTO jobs(job_id,job_title,min_salary,max_salary) VALUES('p_a','撿垃圾1',200,6000); INSERT INTO jobs VALUES('p_a1','撿垃圾1',200,6000), ('p_a2','撿垃圾2',200,6000); INSERT INTO jobs SET job_id = 'ces',job_title="123" INSERT INTO jobs SELECT 'ces1','444',200,6000 複製代碼# 簡單修改 UPDATE jobs SET job_title = '2222' WHERE job_id = 'ces1' # 修改多表 UPDATE jobs INNER JOIN employees ON employees.job_id = jobs.job_id SET jobs.job_title = CONCAT(jobs.job_title,'22222'),employees.job_id = 'ces1' WHERE jobs.job_title = 'Public Accountant12322222' 複製代碼# 單表刪除 DELETE FROM jobs WHERE job_id = 'ces' # 清空整表 TRUNCATE TABLE ttt; # 多表刪除 DELETE employees FROM employees INNER JOIN jobs ON jobs.job_id = employees.job_id WHERE jobs.job_id = 'SA_MAN' 複製代碼1. 庫的管理 建立\修改\刪除 2. 表的管理 建立\修改\刪除 複製代碼建立: create 修改: alter 刪除: drop 複製代碼# 建立 IF NOT EXISTS 進行容錯 CHARACTER SET 字符集 CREATE DATABASE IF NOT EXISTS books CHARACTER SET utf8; # 修改 不能該了 RENAME DATABASE books TO newbook; # 更改字符集 ALTER DATABASE books CHARACTER SET gbk; # 庫的刪除 DROP DATABASE IF EXISTS books; 複製代碼USE books; # 表的建立 /* CREATE TABLE 表名( 列名 列類型([長度]) [約束], 列名 列類型([長度]) [約束], ... ) */ CREATE TABLE book ( id INT, b_name VARCHAR(20), price DOUBLE, author_id INT, publish_date DATETIME ); DESC book; CREATE TABLE author( id INT, au_name VARCHAR(20), nation VARCHAR(10) ); DESC author; 複製代碼/* 修改列: ALTER TABLE 表名 [CHANGE|MODIFY|ADD|DROP] COLUMN 列名 類型|約束; 修改表名: ALTER TABLE 表名 RENAME TO 新表名; */ # 修改列名 ALTER TABLE book CHANGE COLUMN publish_date publishDate DATETIME; # 修改列類型約束 ALTER TABLE book MODIFY COLUMN publishDate TIMESTAMP; # 添加新列 ALTER TABLE author ADD COLUMN annual DOUBLE; # 刪除 ALTER TABLE author DROP COLUMN annual; # 修改表名 ALTER TABLE author RENAME TO authers; 複製代碼DROP TABLE IF EXISTS authers; 複製代碼# 複製表結構 CREATE TABLE copy LIKE author; # 複製整個表 CREATE TABLE copy2 SELECT * FROM author; 複製代碼# 列級約束 CREATE TABLE stuinfo( id INT PRIMARY KEY, # 主鍵 stu_name VARCHAR(20) NOT NULL, # 非空 gender CHAR(1) DEFAULT '男', # 默認 seat INT UNIQUE # 惟一 ); # 表級約束 CREATE TABLE stuinfo( id INT, # 主鍵 stu_name VARCHAR(20), # 非空 gender CHAR(1) , # 默認 seat INT, # 惟一 majorid INT, CONSTRAINT pk PRIMARY KEY(id),# 主鍵 CONSTRAINT uq UNIQUE(seat),# 惟一 CONSTRAINT fk_stuiinfo_major FOREIGN KEY(majorid) REFERENCES major(id)# 外鍵 ); # 通用建議約束 DROP TABLE IF EXISTS stuinfo; CREATE TABLE stuinfo( id INT PRIMARY KEY, # 主鍵 stu_name VARCHAR(20) NOT NULL, # 非空 gender CHAR(1) DEFAULT '男', # 默認 seat INT UNIQUE, # 惟一 majorid INT, -- 表級約束 CONSTRAINT fk_stuiinfo_major FOREIGN KEY(majorid) REFERENCES major(id)# 外鍵 ); 複製代碼# 修改列約束 ALTER TABLE stuinfo MODIFY COLUMN stu_name VARCHAR(20) NOT NULL; # 表級約束 ALTER TABLE stuinfo ADD PRIMARY KEY(id); ALTER TABLE stuinfo ADD FOREIGN KEY(majorid) REFERENCES major(id); # 刪除外鍵 # ALTER TABLE stuinfo DROP PRIMARY KEY; 複製代碼CREATE TABLE stuinfo( id INT PRIMARY KEY AUTO_INCREMENT, # 主鍵 stu_name VARCHAR(20) NOT NULL, # 非空 gender CHAR(1) DEFAULT '男', # 默認 seat INT UNIQUE, # 惟一 majorid INT, -- 表級約束 CONSTRAINT fk_stuiinfo_major FOREIGN KEY(majorid) REFERENCES major(id)# 外鍵 ); 複製代碼# 提交表示完成,回滾表明異常 set autocommit = 0; -- 關閉自動事務 START TRANSACTION; -- 開始事務 UPDATE stuinfo SET stu_name = '12232' WHERE id = 3; SAVEPOINT a; -- 保存節點 UPDATE stuinfo SET stu_name = '12332' WHERE id = 5; ROLLBACK; -- 回滾事務 ROLLBACK TO a; -- 回滾事務到指定節點 COMMIT; -- 提交事務 複製代碼
;
between and 範圍

在什麼到什麼之間,包含先後

# 查找100 到200 之間的數據
SELECT * FROM `employees` 
WHERE 
    `employee_id` BETWEEN 100 AND 200;
複製代碼
in 屬於

查詢是否屬於某些列表中的某一個

# 查詢是否屬於某些列表中的某一個
SELECT * FROM `employees` 
WHERE 
    `job_id` IN ('SH_CLERK','AD_ASST','AD_VP');
複製代碼
is null or is not null 是否爲Null
# 查詢字段爲空的
SELECT * FROM `employees`
WHERE
    `commission_pct` IS NULL;

# 查詢不爲空的
SELECT * FROM `employees`
WHERE
    NOT `commission_pct` IS NULL;

SELECT * FROM `employees`
WHERE
    `commission_pct` IS NOT NULL;
複製代碼
<=> 安全等於

既能夠判斷NULL 又能夠判斷數值

SELECT * FROM `employees`
WHERE
    `commission_pct` <=> NULL;
複製代碼
order by 排序

ASC升序 DESC降序 默認 ASC

SELECT * FROM `employees` ORDER BY `salary` ASC-- 升序
SELECT * FROM `employees` ORDER BY `salary` DESC-- 降序

SELECT `salary` * IFNULL(`commission_pct`,0) + IFNULL(manager_id,0as money,`salary`  FROM `employees` ORDER BY `money`-- 表達式別名降序

SELECT LENGTH(`last_name`as len FROM `employees` ORDER BY len-- 按函數

SELECT * FROM `employees` ORDER BY `salary` DESC`employee_id` ASC-- 多個排序條件
複製代碼

分組查詢


# 每一個工種的總工資
SELECT SUM(`salary`AS `money`,`job_id` FROM `employees` GROUP BY `job_id` ORDER BY `money`;

# 每一個工種的最高工資
SELECT MAX(`salary`as `max`,`job_id` FROM `employees` GROUP BY `job_id` ORDER BY `max`;

# 查詢郵箱包含a的工種的最高工資
SELECT MAX(`salary`as `max``job_id`
FROM `employees`
WHERE email LIKE '%a%' 
GROUP BY `job_id` 
ORDER BY `max`;

# 查詢郵箱包含a的工種的最高工資大於1萬的   HAVING
SELECT MAX(`salary`as `max``job_id` 
FROM `employees`
WHERE email LIKE '%a%' 
GROUP BY `job_id`
HAVING `max` > 10000
ORDER BY `max`;

# 查詢名稱長度同樣的大於5我的的數據
SELECT LENGTH(`first_name`AS `name`COUNT(1AS `count`
FROM `employees`
GROUP BY `name`
HAVING `count` > 5;

# 多字段分組
SELECT AVG(`salary`AS `avg`,`department_id`,`job_id`
FROM `employees`
GROUP BY `department_id`,`job_id`
ORDER BY `department_id`,`job_id`
複製代碼

鏈接查詢

分類:
    按年代劃分:
        sql92標準:只支持內鏈接
        sql99標準【推薦】:支持內鏈接+外來鏈接(左外、右外)+交叉鏈接
    按功能劃分:
        內鏈接:
            等值鏈接
            非等值鏈接
            自鏈接
        外鏈接:
            左外鏈接
            右外鏈接
            全外鏈接
        交叉鏈接
複製代碼

sql92標準

# 等值鏈接
SELECT e.`first_name`,j.`job_title`,`j`.`job_id`
FROM `employees` as e,`jobs` as j
WHERE `e`.`job_id` = `j`.`job_id`;

# 非等值鏈接

# 自鏈接
SELECT e.last_name,m.employee_id,e.manager_id,m.last_name 
FROM `employees` AS e, `employees` AS m
WHERE `e`.employee_id = `m`.manager_id
複製代碼

sql99標準

# 等值鏈接
SELECT `last_name`,`department_name`
FROM employees
INNER JOIN departments
ON employees.`department_id` = departments.`department_id`

# 複雜的等值鏈接
SELECT department_name,COUNT('*'AS count,MAX(`salary`AS max,min(`salary`AS min
FROM employees
INNER JOIN departments
ON employees.department_id = departments.department_id
WHERE last_name LIKE '%o%'
GROUP BY department_name
HAVING `count` BETWEEN 2 AND 10
ORDER BY `count`

# 多表等值鏈接
SELECT last_name,department_name,job_title
FROM employees
INNER JOIN departments
ON departments.department_id =employees.department_id
INNER JOIN jobs
ON employees.job_id = jobs.job_id;

複製代碼

子查詢

分類: 按出現位置: select 後面: 只支持標量子查詢 form 後面 表子查詢 where 和having後面 * 標量子查詢 * 列子查詢 * 行子查詢 exists後面 表子查詢
按結果集的行列數不一樣:
    標量子查詢(結果集只有一行一列)
    列子查詢(結果集只有一列多行)
    行子查詢(結果集只有多列一行)
    表子查詢(結果集通常多行多列)
複製代碼
複製代碼按結果集的行列數不一樣: 標量子查詢(結果集只有一行一列) 列子查詢(結果集只有一列多行) 行子查詢(結果集只有多列一行) 表子查詢(結果集通常多行多列) 複製代碼複製代碼

where 和having後面

特色: 1. 放在小括號內 2. 放在條件右側 3. 標量子查詢:配合單行操做符。列子查詢:配合多行操做符。


# 查詢工資比Abel高的人
SELECT * FROM employees 
WHERE salary > (
 SELECT salary FROM employees 
 WHERE last_name = 'Abel'
);

# job_id與141號員工同樣且工資大於143號員工的員工
SELECT last_name,salary,employee_id FROM employees
WHERE job_id = (
 SELECT job_id FROM employees WHERE employee_id = 141
AND salary > (
 SELECT salary FROM employees WHERE employee_id = 143
)

# 查詢比50號部門最低工資高的部門的最低工資
SELECT department_id, COUNT(*),MIN(salary) AS minsalary FROM employees 
GROUP BY department_id
HAVING minsalary > (SELECT MIN(salary) AS minsalary FROM employees WHERE department_id = 50)
ORDER BY minsalary DESC;
複製代碼

分頁查詢

SELECT *
FROM `employees` 
LIMIT (page-1)*size,size;

SELECT *
FROM `employees` 
LIMIT 10,10;
複製代碼

聯合查詢

# 無
複製代碼

DML 數據操做語言

插入

INSERT INTO jobs(job_id,job_title,min_salary,max_salary) VALUES('p_a','撿垃圾1',200,6000);

INSERT INTO jobs 
VALUES('p_a1','撿垃圾1',200,6000),
('p_a2','撿垃圾2',200,6000);

INSERT INTO jobs SET job_id = 'ces',job_title="123"

INSERT INTO jobs SELECT 'ces1','444',200,6000
複製代碼

修改

# 簡單修改
UPDATE jobs
SET job_title = '2222'
WHERE job_id = 'ces1'

# 修改多表
UPDATE jobs
INNER JOIN employees
ON employees.job_id = jobs.job_id
SET jobs.job_title = CONCAT(jobs.job_title,'22222'),employees.job_id = 'ces1'
WHERE jobs.job_title = 'Public Accountant12322222'
複製代碼

刪除

# 單表刪除
DELETE FROM jobs
WHERE job_id = 'ces'

# 清空整表
TRUNCATE TABLE ttt;

# 多表刪除
DELETE employees
FROM employees
INNER JOIN jobs
ON jobs.job_id = employees.job_id
WHERE jobs.job_id = 'SA_MAN'
複製代碼

DDL 數據定義語言

1. 庫的管理 建立\修改\刪除 2. 表的管理 建立\修改\刪除 複製代碼建立: create 修改: alter 刪除: drop 複製代碼

庫管理

# 建立 IF NOT EXISTS 進行容錯 CHARACTER SET  字符集
CREATE DATABASE IF NOT EXISTS books CHARACTER SET utf8;

# 修改 不能該了
RENAME DATABASE books TO newbook;

# 更改字符集
ALTER DATABASE books CHARACTER SET gbk;

# 庫的刪除
DROP DATABASE IF EXISTS books;

複製代碼

表的管理

建立表

USE books;
# 表的建立
/*
CREATE TABLE 表名(
 列名 列類型([長度]) [約束],
 列名 列類型([長度]) [約束],
 ...
)
*/

CREATE TABLE book (
 id INT,
 b_name VARCHAR(20),
 price DOUBLE,
 author_id INT,
 publish_date DATETIME
);

DESC book;

CREATE TABLE author(
 id INT,
 au_name VARCHAR(20),
 nation VARCHAR(10)
);

DESC author;
複製代碼

表的修改

/*
修改列:
ALTER TABLE 表名 [CHANGE|MODIFY|ADD|DROP] COLUMN 列名 類型|約束;
修改表名:
ALTER TABLE 表名 RENAME TO 新表名;
*/

# 修改列名
ALTER TABLE book CHANGE COLUMN publish_date publishDate DATETIME;
# 修改列類型約束
ALTER TABLE book MODIFY COLUMN publishDate TIMESTAMP;
# 添加新列
ALTER TABLE author ADD COLUMN annual DOUBLE;
# 刪除
ALTER TABLE author DROP COLUMN annual;
# 修改表名
ALTER TABLE author RENAME TO authers;
複製代碼

表的刪除

DROP TABLE IF EXISTS authers;
複製代碼

表的複製

# 複製表結構
CREATE TABLE copy LIKE author;

# 複製整個表
CREATE TABLE copy2 
SELECT * FROM author;
複製代碼

約束

添加表時添加約束

# 列級約束
CREATE TABLE stuinfo(
 id INT PRIMARY KEY# 主鍵
 stu_name VARCHAR(20NOT NULL# 非空
 gender CHAR(1DEFAULT '男'# 默認
 seat INT UNIQUE # 惟一
);

# 表級約束
CREATE TABLE stuinfo(
 id INT# 主鍵
 stu_name VARCHAR(20), # 非空
 gender CHAR(1) , # 默認
 seat INT# 惟一
 majorid INT,
 
 CONSTRAINT pk PRIMARY KEY(id),# 主鍵
 CONSTRAINT uq UNIQUE(seat),# 惟一
 CONSTRAINT fk_stuiinfo_major FOREIGN KEY(majorid) REFERENCES major(id)# 外鍵
);

# 通用建議約束
DROP TABLE  IF EXISTS stuinfo;
CREATE TABLE stuinfo(
 id INT PRIMARY KEY# 主鍵
 stu_name VARCHAR(20NOT NULL# 非空
 gender CHAR(1DEFAULT '男'# 默認
 seat INT UNIQUE# 惟一
 majorid INT,
 -- 表級約束
 CONSTRAINT fk_stuiinfo_major FOREIGN KEY(majorid) REFERENCES major(id)# 外鍵
);


複製代碼

修改表時的約束

# 修改列約束
ALTER TABLE stuinfo MODIFY COLUMN stu_name VARCHAR(20NOT NULL
# 表級約束
ALTER TABLE stuinfo ADD PRIMARY KEY(id);
ALTER TABLE stuinfo ADD FOREIGN KEY(majorid) REFERENCES major(id);
# 刪除外鍵
# ALTER TABLE stuinfo DROP PRIMARY KEY;
複製代碼

標識列(自增加列)

AUTO_INCREMENT

CREATE TABLE stuinfo(
 id INT PRIMARY KEY AUTO_INCREMENT, # 主鍵
 stu_name VARCHAR(20NOT NULL# 非空
 gender CHAR(1DEFAULT '男'# 默認
 seat INT UNIQUE# 惟一
 majorid INT,
 -- 表級約束
 CONSTRAINT fk_stuiinfo_major FOREIGN KEY(majorid) REFERENCES major(id)# 外鍵
);
複製代碼

TCL 事務控制語言

一個或一組sql語句組成一個執行單位,要麼所有執行,要麼所有失敗。

ACID: A: 原子性 C: 一致性 I: 隔離性 D: 持久性

# 提交表示完成,回滾表明異常
set autocommit = 0-- 關閉自動事務
START TRANSACTION-- 開始事務
UPDATE stuinfo SET stu_name = '12232' WHERE id = 3;
SAVEPOINT a; -- 保存節點
UPDATE stuinfo SET stu_name = '12332' WHERE id = 5;
ROLLBACK-- 回滾事務
ROLLBACK TO a; -- 回滾事務到指定節點
COMMIT-- 提交事務 
複製代碼

本文使用 mdnice 排版

相關文章
相關標籤/搜索