基本SQL語句
阿新 • • 發佈:2021-07-30
# ========================= 資料庫操作 ====================================== # 建立一個練習用的資料庫,設定字符集和排序規則。 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 '\'';