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表
admin表
注釋
- 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表
-
列和表的基本操作
-- 修改表名
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表
-- 統計全部數據量
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;
-
刪除表操作三種方式比較
- DROP、TRUNCATE、DELETE。
- DROP (刪除表):刪除內容和定義,釋放空間。相當於執行操作后這個表消失。
- TRUNCATE (清空表中數據):刪除內容、釋放空間但不刪除定義(保留表的數據結構)。一次將所有數據刪除,不能單獨刪除一行數據。
- DELETE (刪除表中的數據):用於刪除表中的行數據。每次從表中刪除一行,並且同時將該行的刪除操作作為事務記錄在日志中保存 ,以便進行進行回滾操作。
- 從功能上看:TRUNCATE TABLE 與不帶 WHERE 子句的 DELETE 語句相同:都是刪除表中的全部行。但TRUNCATE速度快,而且效率高、使用的系統和事務日志資源少。
- 使用DELETE語句執行操作時,每次刪除一行,都要在事務日志中為所刪除的每行記錄一項。
- 使用TRUNCATE通過釋放存儲表數據所用的數據頁來刪除數據,並且只在事務日志中記錄頁的釋放。
- TRUNCATE TABLE 刪除表中的所有行,但表結構及其列、約束、索引等保持不變。並且將新行標識所用的計數值重置。如果需要保留標識計數值,使用 DELETE。如果要刪除表定義及其數據,請使用DROP。
MySQL系列的各類知識點總結,用於回顧;其中知識點來源於網絡、視頻、書籍等各個途徑,如有引用但沒標注出,在此致歉!
原創不易,歡迎轉載,轉載時請注明出處,謝謝!
作者:瀟~蕭下
原文鏈接:[https://www.cnblogs.com/manongxiao/p/11644050.html]