1. 程式人生 > 其它 >基本SQL語句

基本SQL語句

# =========================  資料庫操作  ======================================
# 建立一個練習用的資料庫,設定字符集和排序規則。
CREATE DATABASE db_practice CHARACTER SET utf8 COLLATE `utf8_general_ci`;

# 檢視所有庫
SHOW DATABASES;

# 選擇資料庫
USE db_practice;

# 刪除資料庫
DROP DATABASE db_practice;


# =========================  表操作  ========================================
# 建立表
CREATE TABLE IF NOT EXISTS  tab_student(
    `Sno` INT(3) NOT NULL AUTO_INCREMENT COMMENT '學號',
    `Sname` VARCHAR(10) NOT NULL DEFAULT '匿名' COMMENT '姓名',
    `Ssex` VARCHAR(3) NOT NULL DEFAULT '男' COMMENT '性別',
    `bornday` DATE DEFAULT NULL COMMENT '出生日期',
    `address` VARCHAR(50) DEFAULT '未填寫' COMMENT '家庭地址',
    `email` VARCHAR(30) DEFAULT '未填寫' COMMENT '電子郵箱',
    `password` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密碼',
    CONSTRAINT `pk_Sno` PRIMARY KEY (`Sno`) 
)ENGINE=INNODB DEFAULT CHARSET=utf8;

# 查看錶屬性
DESCRIBE tab_student;

# 查看錶詳細定義
SHOW CREATE TABLE t_employee;

# 刪除表
DROP TABLE tab_student;

# 修改表屬性
ALTER TABLE tab_student RENAME tab_stu;  -- 修改表名
ALTER TABLE tab_stu RENAME tab_student;

ALTER TABLE tab_student                  -- 刪除多個欄位
DROP Sno,
DROP`password`,
DROP`bornday`;

ALTER TABLE tab_student                                   -- 新增多個欄位;
ADD  Sno INT(3) NOT NULL COMMENT '學號' FIRST,            -- 用first新增在最前;
ADD  bornday DATE DEFAULT NULL COMMENT '生日' AFTER Ssex, -- 用after新增在某欄位後;
ADD  `password` VARCHAR(10) NOT NULL DEFAULT '123456';    -- 沒有介詞時新增到最後;

# 修改欄位屬性
ALTER TABLE tab_student MODIFY Sno CHAR(3);               -- 只修改資料型別
ALTER TABLE tab_student CHANGE Sno id CHAR(3);            -- 只修改欄位名
ALTER TABLE tab_student CHANGE id Sno INT(3);             -- 同時修改欄位名和資料型別
ALTER TABLE tab_student MODIFY Sno INT(3) AFTER Sname;    -- 移動欄位的位置
ALTER TABLE tab_student MODIFY Sno INT(3) FIRST;          -- 將欄位置頂


# ================================  索引  =============================================
# 用建立的方式新增索引,關鍵字create index
CREATE INDEX index_name 
ON t_employee(`name` ASC);             -- 普通索引(預設升序)

CREATE UNIQUE INDEX index_id           -- 唯一索引(預設升序)
ON t_employee(`id`);

# 用修改表的方式新增索引
ALTER TABLE t_employee                 -- 多列索引
ADD INDEX index_id_name(id, `name`);

# 刪除索引,關鍵字drop index
DROP INDEX index_name
ON t_employee;
DROP INDEX index_id
ON t_employee;

# 檢視查詢操作時索引是否生效
EXPLAIN
SELECT * FROM t_employee WHERE `name`='Smith';


# ==========================  資料操作 ===============================================
# 插入記錄
INSERT INTO tab_student(Sno,Sname,Ssex,bornday)
VALUE (1,'張小使','男','1985-9-5'),
      (2,'王曉紅','女','1997-11-09'),
      (3,'李曉明','女','1996-09-22');
     
# 插入查詢結果
INSERT INTO tab_student(Sname,Ssex)
SELECT Sname, Ssex
FROM tab_student
WHERE Sname='李曉明';

# 更新所有記錄
UPDATE tab_student
SET email='[email protected]';

# 更新特定記錄
UPDATE tab_student
SET address = '廣東省廣州市珠江新城'
WHERE Sname = '王曉紅';

# 刪除記錄
DELETE FROM tab_student        -- 刪除特定記錄
WHERE Sname='張小使';

TRUNCATE tab_student;          -- 刪除所有記錄


# ===========================  單表查詢  ===========================================
# 簡單查詢,關鍵字select from
SELECT *                           -- 查詢所有欄位
FROM t_employee;

SELECT `name`,`job`,`salary`       -- 查詢指定欄位
FROM t_employee;

SELECT DISTINCT job                -- 去重查詢
FROM t_employee;

SELECT `name`AS'姓名', salary*12 AS '年薪', ROUND(salary/26,2) AS '日薪'   -- 數學運算查詢
FROM t_employee;                   

SELECT CONCAT(`name`,'員工的年薪為:',salary*12) AS '年薪',                -- 顯示格式的查詢
       CONCAT(`name`,'員工的日薪為:',ROUND(salary/26, 2)) AS '日薪'
FROM t_employee;

# 條件查詢,關鍵字where
SELECT *                   
FROM t_employee
WHERE job='salesman' AND salary >= 800;       -- 比較運算和邏輯運算匹配條件

SELECT *
FROM t_employee
WHERE NOT job = 'salesman';                   -- 取反查詢,關鍵字not

SELECT *                                      
FROM t_employee
WHERE salary BETWEEN 3000 AND 6000;           -- 範圍查詢,關鍵字between and

SELECT *
FROM t_employee
WHERE leader IS NULL;                         -- 空值查詢,關鍵字is null

SELECT *
FROM t_employee
WHERE job IN('salesman', 'clerk', 'analyst'); -- 集合查詢,關鍵字in(……)

SELECT *
FROM t_employee
WHERE `name` LIKE '_a%';                      -- 模糊查詢,關鍵字like,萬用字元‘_’,'%'

# 排序查詢結果,關鍵字order by
SELECT *
FROM t_employee
ORDER BY job ASC, `name` DESC;                -- 分兩級排序,asc升序(預設),desc降序

# 限制查詢結果數(用於分頁),關鍵字limit
SELECT *
FROM t_employee
ORDER BY salary DESC
LIMIT 5;                                      -- 僅指定結果數,不指定起始位置

SELECT *
FROM t_employee
ORDER BY salary DESC
LIMIT 5, 5;                                   -- 跳過5條記錄,再顯示5條記錄

# 用統計函式查詢(聚合函式)
SELECT COUNT(`name`) '人數', AVG(salary) '平均工資',
       MIN(age) '最小年齡', MAX(age) '最大年齡',
       SUM(salary) '總薪金'
FROM t_employee;

# 分組查詢,關鍵字group by
SELECT job, GROUP_CONCAT(`name`) mumber, COUNT(`name`) `mount`
FROM t_employee
GROUP BY job;                             -- 分組查詢的欄位必須是聚合函式或被分組的欄位,否則會報錯。

SELECT dpmtID, job, GROUP_CONCAT(`name`) mumber, COUNT(`name`) mount
FROM t_employee
GROUP BY dpmtID, job;                                             -- 多級分組查詢

SELECT job, AVG(salary) '平均工資', COUNT(`name`) '人數'                  
FROM t_employee
GROUP BY job
HAVING AVG(salary) < 2000;                                        -- 分組下的條件查詢,關鍵字having
                                                 

# ============================  多表查詢  ========================================
# 單表自連線
SELECT e.name '員工', e.job '職務', l.name '上級'          -- ANSI語法的連線
FROM t_employee AS e 
INNER JOIN t_employee AS l
ON e.leader = l.id;

SELECT e.name '員工', e.job '職務', l.name '上級'          -- 查詢語法的連線
FROM t_employee AS e , t_employee AS l
WHERE e.leader = l.id; 

# 內連線,關鍵字inner join on
SELECT e.name '員工', e.job '職務', d.name '部門', d.locate '地址'
FROM t_employee AS e
INNER JOIN t_dpmt AS d
ON e.dpmtID = d.dpmtID;  

SELECT e.name '員工', e.job '職務', d.name '部門', d.locate '地址'
FROM t_employee AS e, t_dpmt AS d
WHERE e.dpmtID = d.dpmtID;

# 外連線
SELECT e.name '員工', e.job '職務', d.name '部門', d.locate '地址'
FROM t_employee AS e
LEFT JOIN t_dpmt AS d                                         -- 左外連線,關鍵字left join on
ON e.dpmtID = d.dpmtID;

SELECT e.name '員工', e.job '職務', d.name '部門', d.locate '地址'
FROM t_employee AS e
RIGHT JOIN t_dpmt AS d                                        -- 右外連線,關鍵字lright join on
ON e.dpmtID = d.dpmtID;

# 不等值連線
SELECT e.name '員工', e.job '職務', l.name '上級'         
FROM t_employee AS e 
INNER JOIN t_employee AS l
ON e.leader = l.id AND e.id > l.id;     

# 三表連線
SELECT e.name '員工', e.job '職務', l.name '上級', d.name '部門', d.locate '地址'
FROM t_employee AS e 
INNER JOIN t_employee AS l
ON e.leader = l.id
LEFT JOIN t_dpmt AS d
ON e.dpmtID = d.dpmtID;

# 合併查詢結果,關鍵字union
SELECT `name`
FROM t_dpmt
UNION
SELECT `name`
FROM t_employee;

# 子查詢(巢狀查詢)
SELECT e.name, e.job, e.salary        -- from子句的子查詢,需要給子查詢起別名
FROM (
    SELECT *
    FROM t_employee
    WHERE job = 'salesman'
)AS e
WHERE e.salary > 1000;

SELECT *                              -- where子句的集合子查詢,有IN(),ANY(),ALL(),EXISTS()
FROM t_employee
WHERE dpmtID IN(                     
    SELECT dpmtID
    FROM t_dpmt
)


# =============================  檢視  =======================================
# 建立檢視
CREATE VIEW v_emp_dpmt AS
SELECT e.name '姓名', e.job '職務', a.name '主管'
FROM t_employee AS e
INNER JOIN t_employee AS a
WHERE e.leader = a.id;

# 檢視檢視
SHOW TABLE STATUS FROM db_practice;       -- 檢視庫表詳情
SHOW CREATE VIEW v_emp_dpmt;              -- 檢視檢視的定義資訊
DESCRIBE v_emp_dpmt;                      -- 檢視檢視屬性
                      
# 修改檢視
CREATE OR REPLACE VIEW v_emp_dpmt AS                                 -- 用替換語句實現
SELECT e.name '員工', e.job '職務', d.name '部門', d.locate '地址'
FROM t_employee AS e
RIGHT JOIN t_dpmt AS d 
ON e.dpmtID = d.dpmtID;                     

ALTER VIEW v_emp_dpmt AS                                             -- 用更改語句實現
SELECT e.name '員工', e.job '職務', l.name '上級', d.name '部門', d.locate '地址'
FROM t_employee AS e 
INNER JOIN t_employee AS l
ON e.leader = l.id
LEFT JOIN t_dpmt AS d
ON e.dpmtID = d.dpmtID;

# 刪除檢視
DROP VIEW v_emp_dpmt;


# ===============================  使用者管理 =====================================
# 建立普通使用者
CREATE USER '陳奕迅'@'localhost' 
IDENTIFIED BY '123456';                              -- create user語句,identified by語句會自動加密
FLUSH PRIVILEGES;

INSERT INTO `user`(`host`,`User`,`authentication_string`,   -- insert into語句新增使用者記錄到user表
    ssl_cipher, x509_issuer, x509_subject)                  -- 該語法必須設定這3個安全欄位的預設值
VALUE ('localhost','張學友',PASSWORD('123456'),'','','');   -- 新版本不用Password欄位。
FLUSH PRIVILEGES;

# 使用者授權
GRANT INSERT, SELECT 
ON db_practice.tab_student
TO '陳奕迅'@'localhost';                                    -- 給普通使用者新增許可權,注意使用者名稱的寫法。
FLUSH PRIVILEGES;

GRANT ALL PRIVILEGES 
ON db_practice.tab_student                               -- 建立新使用者並授權,all privileges全部許可權
TO '鄧紫棋'@'localhost' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;

# 檢視使用者許可權
SELECT `User`,`Table_priv`,`Db`                         -- 檢視某使用者的表許可權(系統表)
FROM tables_priv
WHERE `User`='鄧紫棋';

# 修改root使用者密碼
SET PASSWORD = PASSWORD("654321");                      -- 當前登入使用者set password修改

UPDATE `user` 
SET authentication_string = PASSWORD("888888")          -- 更新user表的方式修改密碼
WHERE `User`='root' AND `host`='localhost';

`mysqladmin -uroot -p原密碼 password '新密碼'`          -- dos視窗執行mysqladmin命令

# 超級使用者修改普通使用者密碼
SET PASSWORD FOR '陳奕迅'@'localhost'=PASSWORD("888888");
FLUSH PRIVILEGES;                                       -- 用set password for語句修改

UPDATE `user`
SET authentication_string = PASSWORD("888888")          -- 更新user表的方向修改密碼
WHERE `User`='張學友' AND `host`='localhost';
FLUSH PRIVILEGES;

# 刪除使用者
DROP USER '陳奕迅'@'localhost';                           -- drop user語句直接刪除

DELETE FROM `user`
WHERE `User` IN('鄧紫棋','張學友');                       -- 在user表刪除


# ============================= 備份與還原 ==============================
# 備份資料庫(dos視窗)
`mysqldump -u root -p db_practice t_dpmt t_employee            
> C:\Users\Administrator\Desktop\sql練習\t_company_backup.sql` -- 備份單個數據庫的表

`mysqldump -u root -p --databases
db_practice mysql
> C:\Users\Administrator\Desktop\sql練習\databases_backup.sql` -- 備份多個數據庫

`mysqldump -u root -p --all-databases
> D:\Environment\mysql-5.7.23-winx64\all_backup.sql`       -- 備份所有資料庫

# 還原資料庫
`mysql -u root -p  
< C:\Users\Administrator\Desktop\sql練習\databases_backup.sql` -- 還原資料庫

`mysql -u root -p db_test
< C:\Users\Administrator\Desktop\sql練習\t_company_backup.sql` -- 還原表到某資料庫

# 匯出到文字
SELECT *
FROM tab_student
INTO OUTFILE 'C:\Users\Administrator\Desktop\sql練習\t_student.txt'
FIELDS ESCAPED BY '\\'
LINES STARTING BY '>'
LINES TERMINATED BY '<\n'
ENCLOSED BY '-'
TERMINATED BY '|'
OPTIONALLY ENCLOSED BY '\'';