MySQL基本命令總結及深入


MySQL基本命令

進入mysql:

-- 下載mysql數據庫網址:(MySQL Community Server)
https://dev.mysql.com/downloads/mysql/
-- 進入到安裝MySQL目錄下的bin目錄 使用命令:
mysql -uroot -p ⏎;
-- 輸入密碼
-- 顯示數據庫列表
show databases; 
-- 使用數據庫並顯示其中所有表
use 數據庫名; show tables;
  • Navicat工具可以使用命令行模式來進行操作

准備工作

本次SQL語句的學習,將使用數據庫:“wmjMysql”,數據表:"user"、"admin",以及創建出基本的測試數據來進行學習。

基本sql語句的記錄;

-- 刪除數據庫
DROP DATABASE wmjMysql;
-- 創建數據庫
CREATE DATABASE ;
-- 使用數據庫
USE wmjMysql;
-- 刪除數據表
DROP TABLE user;
DROP TABLE admin;
-- 查看表結構
DESC user;
-- 查看表的詳細定義
SHOW CREATE TABLE user;
-- 創建數據表	
-- 創建用戶表  關聯admin表
CREATE TABLE user(
	uid    INT  AUTO_INCREMENT,
	name	VARCHAR(50),
	birthday DATE,
	sex		VARCHAR(10),
	CONSTRAINT pk_uid  PRIMARY KEY(aid)
);
CREATE TABLE admin(
	aid    INT  AUTO_INCREMENT,
	name	VARCHAR(50),
	CONSTRAINT pk_aid  PRIMARY KEY(uid)
);
-- 增加測試數據
INSERT INTO user(name,birthday,sex)  VALUES ('張三','1995-11-11','男');
INSERT INTO user(name,birthday,sex)  VALUES ('李四','1995-12-12','女');
INSERT INTO user(name,birthday,sex)  VALUES ('王五','1996-10-15','男');
INSERT INTO user(name,birthday,sex)  VALUES ('趙六','1997-05-27','女');
INSERT INTO user(name,birthday,sex)  VALUES ('韓七','1998-12-19','男');
INSERT INTO user(name,birthday,sex)  VALUES ('彭八','1998-11-24','女');
INSERT INTO user(name,birthday,sex)  VALUES ('wmj','1995-12-19','男');
INSERT INTO user(name,birthday,sex)  VALUES ('ZHANGSAN','1995-12-19','男');
INSERT INTO user(name,birthday,sex)  VALUES ('aaa','1998-11-24','女');

INSERT INTO admin(name)  VALUES ('張三');
INSERT INTO admin(name)  VALUES ('李四');
INSERT INTO admin(name)  VALUES ('王五');
INSERT INTO admin(name)  VALUES ('趙六');
INSERT INTO admin(name)  VALUES ('韓七');
INSERT INTO admin(name)  VALUES ('彭八');
-- 事務提交
COMMIT;
-- 查詢所有
SELECT * FROM user;
SELECT * FROM admin;

user表

image-20191009135109747

admin表

image-20191009135027559

注釋

  • mysql的注釋為:“-- ...” or "#..." or "/.../" oracle的注釋為:"--"
  • 缺省,可理解為“省略的值為默認值”,直譯; 如果是意譯的話則應該為:"默認值"

sql語句

列操作與表操作

-- 創建學生表 用來測試列操作和表操作
CREATE TABLE student(
	sid    INT  AUTO_INCREMENT,
	name	VARCHAR(50),
	sex		VARCHAR(10),
	birthday DATE,
	createTime1 TIME,
	createTime2 DATETIME,
	createTime3 TIMESTAMP,
	CONSTRAINT pk_sid  PRIMARY KEY(sid)
);
-- 增加測試數據
INSERT INTO student(name,sex,birthday,createTime1,createTime2,createTime3)  VALUES ('1001','女','1998-11-24',CURTIME(),'2019-10-08',NOW());
INSERT INTO student(name,sex,birthday,createTime1,createTime2,createTime3)  VALUES ('1001','女',CURDATE(),CURTIME(),NOW(),NOW());
INSERT INTO student(name,sex,birthday,createTime1,createTime2,createTime3)  VALUES ('1003','男','1998-11-24','14:14:14','2019-10-08','2019-10-08');

  • student表

    image-20191009140120278

  • 列和表的基本操作

-- 修改表名
ALTER TABLE 表名 RENAME TO 新表
ALTER TABLE student RENAME TO student1;
-- 給表添加列
ALTER TABLE 表名 ADD 列名 列的類型 [屬性約束];
ALTER TABLE 表名 ADD 列名 列的類型 [屬性約束] FIRST; /*放在第一位*/
ALTER TABLE 表名 ADD 列名 列的類型 AFTER 列名; /*放在某字段后面*/
ALTER TABLE student ADD createTime0 DATE AFTER birthday;
-- 修改已有列的數據類型,約束 
-- 默認值,DATE,TIME不能使用函數默認值。DATETIME與TIMESTAMP可以使用NOW()函數默認值
ALTER TABLE 表名 MODIFY 列名 列的類型 [屬性約束]
ALTER TABLE student MODIFY createTime2 DATE NOT NULL;
ALTER TABLE student MODIFY createTime2 DATETIME NULL;
ALTER TABLE student MODIFY createTime2 DATETIME NOT NULL DEFAULT NOW();
-- 刪除列
ALTER TABLE 表名 DROP 列;
ALTER TABLE student DROP createTime0;
-- 修改列名和類型
ALTER TABLE 表名 CHANGE 列名 新_列名 列的類型 [屬性約束]; -- 列名不一定要新的
ALTER TABLE student ADD createTime DATE AFTER birthday;
ALTER TABLE student CHANGE createTime createTime0 DATE NULL;
ALTER TABLE student CHANGE createTime createTime0 DATE DEFAULT '2019-10-08';
-- 設置/刪除 DEFAULT
ALTER TABLE 表名 ALTER 列名 SET DEFAULT 默認值
ALTER TABLE 表名 ALTER 列名 DROP DEFAUL
ALTER TABLE student ALTER createTime0 SET DEFAULT '2019-10-07';
ALTER TABLE student ALTER createTime0 DROP DEFAULT;
-- 唯一約束
CREATE TABLE student1(id INT UNIQUE, sex CHAR(2));
CREATE TABLE student1(id INT, sex CHAR(2), UNIQUE(id)); -- 第二種寫法

基本的sql查詢語句

 -- 查詢所有
SELECT * FROM user;
-- 查詢指定的字段
SELECT name,birthday,sex FROM user;
-- 查詢指定的字段
SELECT uid,name FROM user;
-- 去重復
SELECT DISTINCT sex FROM user;
-- 使用限定查詢  選用邏輯運算符
    -- 與(and),可以連接多條 ; 或(or),可以連接多個條件; 非(not)取反操作
    SELECT name,birthday,sex FROM user where uid=1 and sex = '男';
    SELECT name,birthday,sex FROM user where uid=1 or sex = '女';
    SELECT uid,name,birthday,sex FROM user where not sex = '女';
    
    -- 關系運算符   >, <, >=, <=, =, !=, <>(不等於),
    SELECT uid,name,birthday,sex FROM user where uid > 2;
    SELECT uid,name,birthday,sex FROM user where uid < 2;
    SELECT uid,name,birthday,sex FROM user where uid = 2;
    SELECT uid,name,birthday,sex FROM user where uid != 2;
    SELECT uid,name,birthday,sex FROM user where uid <> 2;
    
    -- 范圍查詢
    -- 兩種實現方式  1、and  2、between  最小值  and 最大值   建議使用第二種  效率高點
    SELECT uid,name,birthday,sex FROM user where birthday >= '1996-10-15' and birthday <= '1998-12-19';
    SELECT uid,name,birthday,sex FROM user where birthday BETWEEN '1996-10-15' and  '1998-12-19';
    
    -- 列表范圍以及模糊查詢
        -- 列表范圍查詢  關鍵字 in 
        SELECT uid,name,birthday,sex FROM user where uid in(1,3,5);
        SELECT uid,name,birthday,sex FROM user where uid not in(1,3,5);
        -- 使用模糊查詢  %表示匹配任意長度、任意類型  _表示匹配一個字符的位置
        SELECT uid,name,birthday,sex FROM user where name LIKE '%三%';
        SELECT uid,name,birthday,sex FROM user where name LIKE '_三%';
        SELECT uid,name,birthday,sex FROM user where name NOT LIKE '_三%';
    -- 排序操作 使用order by 進行排序 默認的排序方式ASC 升序操作   DESC 降序(由大到小)
    SELECT uid,name,birthday,sex FROM user  ORDER BY  birthday;
    SELECT uid,name,birthday,sex FROM user  ORDER BY  birthday  DESC;
-- mysql中函數的使用
    -- 字符函數  接受數據返回具體的字符信息
    -- 實現大小寫轉換
    INSERT INTO user(name,birthday,sex)  VALUES ('wmj','1995-12-19','男');
    INSERT INTO user(name,birthday,sex)  VALUES ('ZHANGSAN','1995-12-19','男');
    SELECT name,UPPER(name) FROM user;
    SELECT name,LOWER(name) FROM user;
    -- 取得字符串中的長度
    SELECT name,LENGTH(name) FROM user;
    -- 字符串截取操作
    SELECT name,SUBSTR(name,1,2) FROM user; -- mysql中的角標從1開始
    -- 數字函數 對日期進行處理  ROUND(數字,[保留小數位])
    -- 將uid改變 用來測試
    SELECT ROUND(uid+999.1234) uidafter FROM user; -- 不保留小數位,
    SELECT ROUND(uid+999.1234,1) uidafter FROM user; -- 保留小數位,
    SELECT ROUND(uid+999.666333,3) uidafter FROM user; -- 四舍五入
    SELECT ROUND(uid+999.55255,3) uidafter FROM user;
    -- 日期函數 對日起進行格式轉換操作
    -- 取得當前日期    
    -- 日期 - 數字 = 日期    日期 + 數字 = 日期   日期 - 日期 = 數字(天數)
    SELECT NOW();
    SELECT SYSDATE();
    SELECT SYSDATE()+3;
    SELECT DATE_FORMAT(SYSDATE()+3,'%Y-%m-%d');
    -- 轉換函數 日期、字符、數字進行相互轉換
    SELECT CURRENT_TIME;
    SELECT CURRENT_DATE;
    SELECT CURRENT_TIMESTAMP;
    -- 日期字符串轉換為日期
    SELECT DATE('1995-12-19');
    -- 日期字符串轉換為字符串
    SELECT CHAR('1995-12-19');
    SELECT CHAR(curdate());

sql高級查詢

  • teacher表

    image-20191009135235144

-- 統計全部數據量
SELECT COUNT(*) FROM teacher;
-- 求平均值、和、最大值、最小值
SELECT COUNT(*) FROM teacher;
SELECT SUM(salary) FROM teacher;
SELECT AVG(salary) FROM teacher;
SELECT ROUND(AVG(salary),2) FROM teacher; -- 保留兩位小數
SELECT MAX(salary) FROM teacher;
SELECT MIN(salary) FROM teacher;

-- 單字段分組統計  定義分組時需要找到字段中共同的屬性,便可實現分組操作
-- 根據性別統計人數
SELECT sex,COUNT(*) FROM teacher GROUP BY sex;
-- 根據性別判斷平均工資
SELECT sex,AVG(salary) FROM teacher GROUP BY sex;
-- 求男女工資總和
SELECT sex,SUM(salary) FROM teacher GROUP BY sex;
-- 總和、平均工資、最高工資、最低工資
SELECT sex,SUM(salary),AVG(salary),MAX(salary),MIN(salary) FROM teacher GROUP BY sex;
-- HAVING子句的使用 一般在group by語句之后對數據再次進行過濾
-- 查詢平均工資大於2500的信息
SELECT sex,AVG(salary) FROM teacher GROUP BY sex HAVING AVG(salary)>'2500';
-- 子查詢指的就是在一個查詢之中嵌套了其他的若干查詢。
-- 查詢工資最低的人員信息
SELECT * FROM teacher WHERE salary = (SELECT MIN(salary) FROM teacher); 
-- 分頁查詢和模糊查詢混合使用
SELECT * FROM teacher WHERE name LIKE '王%' LIMIT 0,2;

多表查詢

-- 認識多表查詢
SELECT * FROM admin,user; -- 54條數據 笛卡爾積
SELECT * FROM admin; -- 6條數據
SELECT * FROM user; -- 9條數據
SELECT * FROM admin,user WHERE admin.`name` = `user`.`name`; -- 6條數據
SELECT count(*) FROM admin; -- 6條數據
-- 外連接
-- 左外連接
SELECT * FROM user u LEFT OUTER JOIN admin a ON (u.`name` = a.`name`);
-- 右外連接
SELECT * FROM user u RIGHT OUTER JOIN admin a ON (u.`name` = a.`name`);

聚合函數

函數 作用
COUNT();AVG();SUM();MAX();MIN() 統計;平均值;求和;最大值;最小值

日期類型函數

  • 查看函數效果時可以使用:select func(); 可以來查看函數效果。
相關日期函數 功能
NOW 當前時間 2017-08-06 22:33:39
YEAR、MONTH、 DAY、HOUR、MINUTE、SECOND 年、月、日、時、分、秒
CURRENT_DATE 年-月-日 2019-10-07
CURRENT_TIME 時:分:秒 16:29:41
DATE_ADD/DATE_SUB 增加/相減
DATEDIFF 日期差
  • 日期SQL

    -- 2019-10-07 16:27:44
    SELECT NOW(); 
    -- 2019
    SELECT YEAR(NOW()); 
    -- 10
    SELECT MONTH(NOW()); 
    -- 7
    SELECT DAY(NOW()); 
    -- HOUT MINUTE SECOND 用法同上
    -- 2019-10-07 簡寫CURDATE()
    SELECT CURRENT_DATE(); 
    -- 16:29:41 簡寫CURTIME()
    SELECT CURRENT_TIME();
    -- 2019-10-07 16:30:01
    SELECT CURRENT_TIMESTAMP();
    -- 2019-10-31
    SELECT LAST_DAY(NOW()); 
    -- 2019-10-31
    SELECT LAST_DAY(str_to_date('2019-12-01 00:00:00','%Y-%m-%d %H:%i:%s'));
    -- 2019-10-09 16:32:28
    SELECT DATE_ADD(NOW(),INTERVAL 2 DAY); 
    -- 2019-10-07 13:33:03
    SELECT DATE_SUB(NOW(),INTERVAL 3 HOUR);
    -- 24   (7號-->31號)
    SELECT DATEDIFF(LAST_DAY(NOW()),NOW());
    

轉換函數

轉換函數 函數作用
FORMAT 數字到字符串的轉化
DATE_FORMAT 時間到字符串
STR_TO_DATE 字符串到時間
  • 相關sql
-- 673,646,728.31
SELECT FORMAT(673646728.314177926,2);
-- 2019-10-07 17:39:10
SELECT SYSDATE();
-- 20191007173913  加上數字后相當於在秒的后面添加數字
SELECT SYSDATE()+3;
-- Oct 07 2019 05:32 PM
SELECT DATE_FORMAT(NOW(),'%b %d %Y %h:%i %p');
-- 10-07-2019
SELECT DATE_FORMAT(NOW(),'%m-%d-%Y');
-- 2019-12-01 00:00:00
SELECT STR_TO_DATE('2019-12-01 00:00:00','%Y-%m-%d %H:%i:%s');

  • DATE_FORMAT 轉換函數的各項含義
%S, %s 兩位數字形式的秒( 00,01, . . ., 59) 
%i 兩位數字形式的分( 00,01, . . ., 59) 
%H 兩位數字形式的小時,24 小時(00,01, . . ., 23) 
%h, %I 兩位數字形式的小時,12 小時(01,02, . . ., 12) 
%k 數字形式的小時,24 小時(0,1, . . ., 23) 
%l 數字形式的小時,12 小時(1, 2, . . ., 12) 
%T 24 小時的時間形式(hh : mm : s s) 
%r 12 小時的時間形式(hh:mm:ss AM 或hh:mm:ss PM) 
%p AM 或P M 
%W 一周中每一天的名稱( Sunday, Monday, . . ., Saturday) 
%a 一周中每一天名稱的縮寫( Sun, Mon, . . ., Sat) 
%d 兩位數字表示月中的天數( 00, 01, . . ., 31) 
%e 數字形式表示月中的天數( 1, 2, . . ., 31) 
%D 英文后綴表示月中的天數( 1st, 2nd, 3rd, . . .) 
%w 以數字形式表示周中的天數( 0 = Sunday, 1=Monday, . . ., 6=Saturday) 
%j 以三位數字表示年中的天數( 001, 002, . . ., 366) 
%U 周(0, 1, 52),其中Sunday 為周中的第一天 
%u 周(0, 1, 52),其中Monday 為周中的第一天 
%M 月名(January, February, . . ., December) 
%b 縮寫的月名( January, February, . . ., December) 
%m 兩位數字表示的月份( 01, 02, . . ., 12) 
%c 數字表示的月份( 1, 2, . . ., 12) 
%Y 四位數字表示的年份 
%y 兩位數字表示的年份 
%% 直接值“%”

空值判斷

  • 在空值判斷中注意以下幾點:

    • 空值不等於零或空格
    • 空值是指不可用、未分配的值,空值相當於沒有值。
    • 空字符串和字符串為null的區別
    • 任何類型的字段都可以允許空值作為值的存在
    • 包括空值的任何算術表達式都等於空,使用IFNULL(expr1,expr2)來處理, expr1為NULL就用expr2替代。
    -- 查詢teacher表中所有name字段不為空的所有信息
    SELECT * FROM teacher WHERE name IS NOT NULL;
    -- 計算 薪水salary的所占百分比 = salary/SUM(salary),薪水為NULL的按0算
    SELECT IFNULL(salary,0)/(SELECT SUM(salary) FROM teacher) per FROM teacher;
    

DML和DDL的區別

  • DDL(data definition language):

    • 數據定義語言,用於定義和管理 SQL 數據庫中的所有對象的語言;
    CREATE(創建);ALTER(修改);DROP(刪除);TRUNCATE();COMMENT(注釋);
    
  • DML(data manipulation language):

    • 數據操作語言,SQL中處理數據等操作統稱為數據操縱語言;
    SELECT(查詢);UPDATE(更新);INSERT(插入);DELETE(刪除)
    
  • DCL

    • 數據控制語言DCL用來授予或回收訪問數據庫的某種特權,並控制數據庫操縱事務發生的時間及效果,對數據庫實行監視等。
    GRANT(授權);REVOKE(撤銷授權);ROLLBACK(回滾);COMMIT(提交);
    

提交數據的類型

  • 顯式提交、隱式提交及自動提交

    • 顯式提交:使用COMMIT命令提交。 在數據庫的UPDATE(更新);INSERT(插入);DELETE(刪除)操作時,只有當事務在提交到數據庫時才算完成。

      mysql>COMMIT;
      
    • 隱式提交:用SQL命令間接完成的提交

      ALTER;AUDIT;COMMENT;CONNECT;CREATE;DISCONNECT;
      DROP;EXIT;GRANT;NOAUDIT;QUIT;REVOKE;RENAME。
      
    • 自動提交:把AUTOCOMMIT設置為ON,則在插入、修改、刪除語句執行后,系統將自動進行提交,這就是自動提交。

      mysql>SET AUTOCOMMIT ON;
      

刪除表操作三種方式比較

  • DROPTRUNCATEDELETE
    • DROP (刪除表):刪除內容和定義,釋放空間。相當於執行操作后這個表消失。
    • TRUNCATE (清空表中數據):刪除內容、釋放空間但不刪除定義(保留表的數據結構)。一次將所有數據刪除,不能單獨刪除一行數據。
    • DELETE (刪除表中的數據):用於刪除表中的行數據。每次從表中刪除一行,並且同時將該行的刪除操作作為事務記錄在日志中保存 ,以便進行進行回滾操作。
    • 從功能上看:TRUNCATE TABLE 與不帶 WHERE 子句的 DELETE 語句相同:都是刪除表中的全部行。但TRUNCATE速度快,而且效率高、使用的系統和事務日志資源少。
      • 使用DELETE語句執行操作時,每次刪除一行,都要在事務日志中為所刪除的每行記錄一項。
      • 使用TRUNCATE通過釋放存儲表數據所用的數據頁來刪除數據,並且只在事務日志中記錄頁的釋放。
      • TRUNCATE TABLE 刪除表中的所有行,但表結構及其列、約束、索引等保持不變。並且將新行標識所用的計數值重置。如果需要保留標識計數值,使用 DELETE。如果要刪除表定義及其數據,請使用DROP。

MySQL系列的各類知識點總結,用於回顧;其中知識點來源於網絡、視頻、書籍等各個途徑,如有引用但沒標注出,在此致歉!
原創不易,歡迎轉載,轉載時請注明出處,謝謝!
作者:瀟~蕭下
原文鏈接:[https://www.cnblogs.com/manongxiao/p/11644050.html]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM