-
找到Mysql安裝路徑,查看版本
-
同時按快捷鍵win+R會彈出一個框,在框中輸入cmd
-
點擊確定后會出現一個黑框,這是命令框,我們的操作要在這命令框中進行。
-
現在查看你的Mysql服務是否啟動,如若未啟動,有兩種啟動方式:
-
第一種:同時按Ctrl+Shift+Esc快捷鍵,然后按下圖中提示的部分操作,最后看到MySQL服務狀態未正在運行即可
-
第二種:輸入net start mysql80(80是對應的MySQL版本如果是其他版本則輸入對應的版本號,如5.7版本輸入net start mysql57),然后按回車鍵,若顯示服務已啟動,則服務啟動成功。(根據電腦情況而定,我的電腦輸入net start mysql命令即可),可能在此會出現一個問題,有的電腦在命令框中輸入后會出現拒絕訪問或服務錯誤,如果這樣的話,就用管理員的身份啟動命令框,按下圖操作,完成后再輸入上面的命令:
-
-
MySQL服務啟動成功后,在命令框中輸入mysql -u root -p,按回車鍵,輸入你的密碼,敲回車,登陸成功進入MYSQL。
二、數據庫基本操作
查看數據庫
show databases;
操作演示:
創建數據庫
create database 數據庫名;
操作演示:
使用數據庫
use 數據庫名;
操作演示:
刪除數據庫
drop database 數據庫名;
三、數據庫中表的基本操作
創建表
創建數據表:
create table 數據表名 (屬性1 類型, 屬性2 類型,);
類型后邊可以加限定條件:primary key(主鍵)、not null(不能為空)、unique(唯一的)、foreign key(外鍵)、default(定義初值)、
-
primary key:主鍵是一個表的特殊字段,可以唯一標識表的每條信息,主鍵的目的是為了快速查找表中的某條信息,主鍵必須是唯一的,主鍵值是非空的,主鍵可以是單一字段也可以是多個字段組合。
-
foreign key(外鍵):外鍵表是一個特殊的字段,設置外鍵原則,必須依賴於數據庫已存在的父表的主鍵,外鍵可以為空值,建立改表與其父表的關聯關系。foreign key(父表主鍵屬性) references 外鍵名(同父表相同的屬性)
-
not null:字段不能有空值,保證所有記錄該字段都有值
-
unique:所有記錄該字段的值不能重復出現
-
auto_increment:用於為表插入的新紀錄自動生成唯一的id,一個表只能有一個字段使用該約束,必須為主鍵的一部分,約束字段可以是任何整數類型,默認值從一開始自增
-
default:創建表時指定該字段的默認值,當插入一條型記錄沒有為該字段賦值時,系統會自動為該字段插入默認值
刪除表
drop table 數據表名;
修改表
alter table 修改表名,修改字段數據類型,條件約束...等等
1.修改表名:alter table 舊表名 rename 新表名;
2.修改字段的數據類型:alter table 表名 modify 屬性名 數據類型;
3.修改字段名:alter table 表名 change 舊屬性名 新屬性名 新數據類型;
4.增加字段:alter table 表名 add 屬性1 數據類型 (完整約束)first | after 屬性名2; 若不設置位置,默認加到最后的位置
5.刪除字段:alter table 表名 drop 屬性名;
6.修改字段排列位置:alter table 表名 modify 屬性1 數據類型 first | after 屬性名2;
7.修改數據引擎:alter table 表名 engine = 儲備引擎名;
8.刪除表的外鍵約束:alter table 表名 drop foreign key 外鍵別名;
9.刪除表的主鍵約束:alter table 表名 drop primary key;
10.刪除表:drop table (if exists) 表名;
查詢表
-
查看表結構:desc 數據表名;
-
查看表的詳細定義:show create table 數據表名;
索引
索引是由數據表中一列或多列組合而成,作用提高對表中數據的查詢速度。
優點:提高檢索數據的速度,對於有依賴關系的父表和子表之間的聯合查詢,可以提高查詢速度使用分組和排序子句進行查詢時,節省查詢中分組和排序時間。
缺點:創建和維護索引需要浪費時間,耗費時間數量隨數據量增加而增加,索引需要占用物理空間,增加,刪除,修改數據時,要動態維護索引
索引的創建方式:
create table 表名 (屬性名 數據類型 [完整約束],屬性名 數據類型 [完整約束],[unique] index 索引名(屬性名 [(長度)] [asc | desc]);
1.普通索引:這是最基本的索引,它沒有任何限制。
2.唯一性索引:它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種創建方式
3.全文索引:全文索引只設置在char、varchar、text類型字段上,查詢數據量較大的字符串時可以提高查找效率
4.單列索引:在表中單個字段上創建索引
5.多列索引:在表中多個字段上創建一個索引
6.空間索引
在存在的表上創建索引
create [unique | fulltext | spatial] index 索引名 on 表名 (屬性名 [(長度)] [asc | desc]);
alter table 創建索引
alter table 表名 add [unique | fulltext | spatial] index 索引名 (屬性名 [(長度)] [asc | desc]);
刪除索引
drop index 索引名 on 表名;
alter table 表名 drop index 索引名;
案例演示
CREATE DATABASE IF NOT EXISTS king DEFAULT CHARACTER SET 'UTF8';
USE king;
CREATE TABLE IF NOT EXISTS user(
id INT UNSIGNED AUTO_INCREMENT KEY COMMENT '編號',
username VARCHAR(20) NOT NULL UNIQUE COMMENT '用戶名',
age TINYINT UNSIGNED DEFAULT 18 COMMENT '年齡',
email VARCHAR(50) NOT NULL DEFAULT 'abc@qq.com' COMMENT '郵箱'
)ENGINE=INNODB CHARSET=UTF8;
四、MySQL數據操作
添加記錄
insert [into] 表名[(字段名稱,...)] {value|values}(值,...)
-
不指定字段名稱:
insert 表名 value(值,...)
需要按照建表時的字段順序給每一個字段賦值
INSERT user VALUE(1,'張三',21,'110@qq.com');
INSERT user VALUES(NULL,'李四',22,'lisi@qq.com');
INSERT user VALUES(DEFAULT,'王麻子',23,'wmz@qq.com'); -
列出指定字段:
insert 表名(字段名稱,...) values (值,...)
INSERT user(username,email) VALUES('小明','xiaoming@qq.com');
-
一次添加多條記錄:
insert 表名[(字段名稱,...)] values (值,...),(值,...),(值,...)
INSERT user VALUES(NULL,'小花',DEFAULT,DEFAULT),(NULL,'小草',24,'xiaocao@qq.com'),(NULL,'小天',25,'xiaotian@qq.com');
-
INSERT ... SET的形式:
INSERT 表名 SET 字段名稱=值,...;
INSERT user SET username='諸葛亮',age=26,email='zhugeliang@qq.com';
-
INSERT ... SELECT
INSERT 表名[(字段名稱...)] SELECT 字段名稱,...FROM 表名[WHERE 條件]
修改記錄
UPDATE 表名 SET 字段名稱=值,字段名稱=值[WHERE 條件]
如果不添加條件,整個表中的記錄都會被更新
-- 測試更新語句
-- 修改第一個用戶的信息 id=1
UPDATE user SET age=29 WHERE id=1;
-- 修改id=3的用戶,username age email
UPDATE user SET age=47,email='lilys@qq.com',username='lilys' WHERE id=3;
-- 所有用戶年齡+10
UPDATE user SET age=age+10;
-- 將id<=5的用戶年齡改為-20,將郵箱改為默認值
UPDATE user SET age=age-20,email=DEFAULT WHERE id<=5;
刪除記錄
DELETE FROM 表名[WHERE 條件]
如果不添加條件,表中所有記錄都會被刪除
-- 測試刪除語句
-- 刪除用戶名為lilys
DELETE FROM user WHERE username='lilys';
-- 刪除年齡為36的用戶
DELETE FROM user WHERE age=36;
-- 刪除表中所有記錄
DELETE FROM user;
修改AUTO_INCREMENT的值
DELETE清空數據表的時候不會重置AUTO_INCREMENT的值,可以通過ALTER語句將其重置為1,詳見如下:
清空表后再插入兩條記錄,發現id是從9開始增長的,
INSERT user VALUES(NULL,'queen',25,'queen@qq.com');
INSERT user VALUES(DEFAULT,'lily',26,'lily@qq.com');
先用下面的語句查看自增長值
SHOW CREATE TABLE user;
再次清空數據表
如何讓自增長值從1開始:
ALTER TABLE user AUTO_INCREMENT=1;
徹底清空數據表
TRUNCATE[TABLE] 表名;
這有兩項功能:
一是清除表中所有記錄
二是會重置AUTO_INCREMENT的值
查詢記錄
SELECT 字段名稱或表達式,... FROM 表名
[WHERE 條件]
[GROUP BY {字段名稱|位置} HAVING 二次篩選]
[ORDER BY{字段名稱|位置|表達式}[ASC|DESC]]
[LIMIT 限制結果集的顯示條數]
整個語句的含義為:根據 WHERE 子句的條件表達式,從 FROM 子句指定的基本表中找出滿足條件的記錄,在按照 SELECT 子句中的目標列表達式,選出記錄中的屬性值形成結果表。
-
查詢表中所有記錄
SELECT * FROM 表名;
*代表所有字段
-
指定字段的信息
SELECT 字段名稱,...FROM 表名
-
庫名.表名
SELECT 字段名稱,... FROM 庫名.表名;
-
給字段起別名
SELECT 字段名稱 [AS] 別名名稱,... FROM 庫名.表名;
-
給數據表起別名
SELECT 字段名稱,... FROM 表名[AS] 別名;
-
表名.字段名
SELECT 表名.字段名,... FROM 表名;
-
WHERE 條件
篩選出符合條件的記錄
-
比較運算符
-
IS [NOT] NULL:檢測值是否為NULL或者NOT NULL
-
指定范圍:[NOT] BETWEEN v1 AND v2 : [不] 在 v1 至 v2 之間(包含 v1,v2)
-
指定集合:[NOT] IN (v1,v2..vn) : [不] 在范圍內
-
邏輯運算符
-
匹配字符(模糊查詢):[NOT] LIKE
WHERE常用運算符:
-
比較運算符
【>,< , = (<=>), != (< >), >= , <=】
=和(<=>)的區別:(<=>):可以檢測NULL值
-
邏輯運算符 NOT ( ! ) 邏輯非 OR( || ) 邏輯或 AND ( && ) 邏輯與
模糊查詢 LIKE 像 % (百分號) 任意個字符 通配符: _ (下划線) 任意一個字符
-
-
GROUP BY 分組
-
把值相同的放到一個組中,最終查詢出來的結果只會顯示組中一條記錄。
-
分組配合GROUP_CONCAT()查看組中某個字段的詳細信息
-
配合聚合函數使用
-
COUNT():統計記錄總數
-
如果寫的是COUNT(字段名稱),字段中的值為NULL,不統計進來
-
如果寫COUNT(*)會統計NULL值
-
-
SUM():求和
-
MAX():求最大值
-
MIN():求最小值
-
AVG():求平均值
-
-
配合WITH ROLLUP 關鍵字使用
會在記錄末尾添加一條記錄,是上面所有記錄的總和
-
HAVING子句對分組結果進行二次篩選
-
-
ORDER BY 排序
ORDER BY 字段名稱 ASC|DESC
-
LIMIT 限制結果集顯示條數
-
LIMIT值:顯示結果集的前幾條記錄
-
LIMIT offset,row_count:從offset開始,顯示row_count條記錄,offset從0開始
-
查詢案例演示
再建一張user1表
-- 測試查詢操作
CREATE TABLE user1(
id INT UNSIGNED AUTO_INCREMENT KEY,
username VARCHAR(20) NOT NULL UNIQUE COMMENT '編號',
age TINYINT UNSIGNED NOT NULL DEFAULT 18 COMMENT '年齡',
sex ENUM('男','女','保密') NOT NULL DEFAULT '保密' COMMENT '性別',
addr VARCHAR(20) NOT NULL DEFAULT '北京',
married TINYINT(1) NOT NULL DEFAULT 0 COMMENT '0代表未結婚,1代表已婚',
salary FLOAT(8,2) NOT NULL DEFAULT 0 COMMENT '薪水'
)ENGINE=INNODB CHARSET=UTF8;
INSERT user1 VALUES(1,'king',23,'男','北京',1,50000);
INSERT user1(username,age,sex,addr,married,salary) VALUES('queen',27,'女','上海',0,25000);
INSERT user1 SET username='imooc',age=31,sex='女',addr='北京',salary=40000;
INSERT user1 VALUES(NULL,'張三',38,'男','上海',0,15000),
(NULL,'張三風',38,'男','上海',0,15000),
(NULL,'張子怡',39,'女','北京',1,85000),
(NULL,'汪峰',42,'男','深圳',1,95000),
(NULL,'劉德華',58,'男','廣州',0,115000),
(NULL,'吳亦凡',28,'男','北京',0,75000),
(NULL,'奶茶妹',18,'女','北京',1,65000),
(NULL,'劉嘉玲',36,'女','廣州',0,15000);
-- 查詢表中所有記錄
SELECT * FROM user1;
-- username,addr,age
SELECT username,addr,age FROM user1;
-- 查詢king數據庫下user1表中的所有記錄
SELECT * FROM king.user1;
-- 查詢user1表中的id 編號 username 用戶名 sex 性別
SELECT id AS '編號',username AS '用戶名', sex AS '性別'
FROM user1;
SELECT id age,age id,username FROM user1;
-- 給表起別名
SELECT id,username FROM user1 AS u;
-- 測試表名.字段名
SELECT user1.id,user1.username,user1.age FROM user1 ;
SELECT u.id,u.username,u.addr,u.sex FROM user1 AS u;
-- 測試WHERE 條件的比較運算符
-- 查詢id,username,age id=5的用戶
SELECT id,username,age FROM user1
WHERE id=5;
SELECT id,username,age FROM user1
WHERE id=50;
-- 添加desc字段 VARCHAR(100)
ALTER TABLE user1
ADD userDesc VARCHAR(100);
-- 更新id<=9的用戶 userDesc='this is a test'
UPDATE user1 SET userDesc='this is a test'
WHERE id<=9;
-- 查詢用戶userDesc 為NULL的用戶
SELECT id,username,age,userDesc FROM user1
WHERE userDesc=NULL;
-- 檢測NULL值
SELECT id,username,age,userDesc FROM user1
WHERE userDesc<=>NULL;
-- IS [NOT] NULL檢測NULL值
SELECT id,username,age,userDesc FROM user1
WHERE userDesc IS NULL;
查詢NULL值用下面這種方法查詢不出來,要用別的方法查詢。
-- 測試范圍BETWEEN AND
-- 查詢年齡在18~30之間的用戶
SELECT id,username,age,sex FROM user1
WHERE age BETWEEN 18 AND 30;
-- 查詢薪水在10000~50000之間的用戶
SELECT id,username,age,salary FROM user1
WHERE salary BETWEEN 10000 AND 50000;
SELECT id,username,age,salary FROM user1
WHERE salary NOT BETWEEN 10000 AND 50000;

-- 測試指定集合 IN
-- 查詢編號為1,3,5,7,9
SELECT id,username,age FROM user1
WHERE id IN(1,3,5,7,9,29,45,78);
SELECT id,username,age FROM user1
WHERE username IN('king','queen','lily','rose');
-- 測試邏輯運算符
-- 查詢性別為男並且年齡>=20的用戶
SELECT id,username,age,sex FROM user1
WHERE sex='男' AND age>=20;
-- id>=5 && age<=30
SELECT id,username,age,sex FROM user1
WHERE id>=5 AND age<=30;
SELECT id,username,age,sex FROM user1
WHERE id>=5 AND age<=30 AND sex='男';
-- 要求sex='女' 並且 addr='北京'
SELECT id,username,age,sex,addr FROM user1
WHERE sex='女' AND addr='北京';
-- 查詢薪水范圍在60000~10000並且性別為男 addr='北京'
SELECT id,username,age,sex,salary,addr FROM user1
WHERE salary BETWEEN 60000 AND 100000 AND sex='男' AND addr='北京';
-- 查詢id=1 或者 用戶名為queen
SELECT id,username,age FROM user1
WHERE id=1 OR username='queen';
-- 測試模糊查詢
SELECT id,username,age FROM user1
WHERE username='king';
SELECT id,username,age FROM user1
WHERE username LIKE 'king';
-- 要求用戶名中包含三
SELECT id,username,age,sex FROM user1
WHERE username LIKE '%三%';
-- 用戶名中包含in
SELECT id,username,age FROM user1
WHERE username LIKE '%in%';
-- 要求查詢出姓張的用戶
SELECT id,username,age FROM user1
WHERE username LIKE '張%';
-- 查詢以風結尾的用戶
SELECT id,username,age FROM user1
WHERE username LIKE '%風';
-- 用戶名長度為三位的用戶
SELECT id,username,age,sex FROM user1
WHERE username LIKE '___';
SELECT id,username,age,sex FROM user1
WHERE username LIKE '張_';
SELECT id,username,age,sex FROM user1
WHERE username LIKE '張_%';
-- 測試分組
-- 按照性別分組sex
SELECT id,username,age,sex FROM user1
GROUP BY sex;
-- 按照addr分組
SELECT username,age,sex,addr FROM user1
GROUP BY addr;
-- 按照性別分組,查詢組中的用戶名有哪些
SELECT GROUP_CONCAT(username),age,sex,addr FROM user1
GROUP BY sex;
SELECT GROUP_CONCAT(username),age,sex,GROUP_CONCAT(addr) FROM user1 GROUP BY sex;
-- 測試COUNT()
SELECT COUNT(*) FROM user1;
SELECT COUNT(id) FROM user1;
-- 按照addr分組,得到用戶名的詳情,總人數,得到組中年齡的總和,年齡的最大值、最小值、平均值和
SELECT addr,
GROUP_CONCAT(username) AS usersDetail,
COUNT(*) AS totalUsers,
SUM(age) AS sum_age,
MAX(age) AS max_age,
MIN(age) AS min_age,
AVG(age) AS avg_age
FROM user1
GROUP BY addr;

-- 按照sex分組,統計組中總人數、用戶名詳情,得到薪水總和,薪水最大值、最小值、平均值
SELECT sex,
GROUP_CONCAT(username) AS usersDetail,
COUNT(*) AS totalUsers,
SUM(salary) AS sum_salary,
MAX(salary) AS max_salary,
MIN(salary) AS min_salary,
AVG(salary) AS avg_salary
FROM user1
GROUP BY sex;
SELECT GROUP_CONCAT(username) AS usersDetail,
COUNT(*) AS totalUsers
FROM user1
GROUP BY sex
WITH ROLLUP;
-- 按照字段的位置來分組
SELECT id,sex,
GROUP_CONCAT(username) AS usersDetail,
COUNT(*) AS totalUsers,
SUM(salary) AS sum_salary,
MAX(salary) AS max_salary,
MIN(salary) AS min_salary,
AVG(salary) AS avg_salary
FROM user1
GROUP BY 2;
-- 查詢age>=30的用戶並且按照sex分組
SELECT sex,GROUP_CONCAT(username) AS usersDetail,
COUNT(*) AS totalUsers
FROM user1
WHERE age>=30
GROUP BY sex;
-- 按照addr分組,統計總人數
SELECT addr,
GROUP_CONCAT(username) AS usersDetail,
COUNT(*) AS totalUsers
FROM user1
GROUP BY addr;
-- 對於分組結果進行二次篩選,條件是組中總人數>=3
SELECT addr,
GROUP_CONCAT(username) AS usersDetail,
COUNT(*) AS totalUsers
FROM user1
GROUP BY addr
HAVING COUNT(*)>=3;
SELECT addr,
GROUP_CONCAT(username) AS usersDetail,
COUNT(*) AS totalUsers
FROM user1
GROUP BY addr
HAVING totalUsers>=3;
-- 按照addr分組,
SELECT addr,
GROUP_CONCAT(username) AS usersDetail,
COUNT(*) AS totalUsers,
SUM(salary) AS sum_salary,
MAX(salary) AS max_salary,
MIN(salary) AS min_salary,
AVG(salary) AS avg_salary
FROM user1
GROUP BY addr;
-- 要求平均薪水>=40000
SELECT addr,
GROUP_CONCAT(username) AS usersDetail,
COUNT(*) AS totalUsers,
SUM(salary) AS sum_salary,
MAX(salary) AS max_salary,
MIN(salary) AS min_salary,
AVG(salary) AS avg_salary
FROM user1
GROUP BY addr
HAVING avg_salary>=40000;
-- 測試排序
-- 按照id降序排列
SELECT id,username,age
FROM user1
ORDER BY id DESC;
-- 按照age升序
SELECT id,username,age
FROM user1
ORDER BY age ;
-- 按照多個字段排序
SELECT id,username,age
FROM user1
ORDER BY age ASC,id ASC;
-- 測試條件+排序
SELECT id,username,age
FROM user1
WHERE age>=30;
SELECT id,username,age
FROM user1
WHERE age>=30
ORDER BY age DESC;
-- 實現隨機記錄
SELECT id,username,age
FROM user1
ORDER BY RAND();
-- 測試LIMIT語句
-- 顯示結果集的前5條記錄
SELECT id,username,age,sex
FROM user1
LIMIT 5;
SELECT id,username,age,sex
FROM user1
LIMIT 0,5;
-- 顯示前3條記錄
SELECT id,username,age,sex
FROM user1
LIMIT 0,3;
SELECT id,username,age,sex
FROM user1
LIMIT 3,3;
-- 更新前3條記錄,將age+5
UPDATE user1 SET age=age+5 LIMIT 3;
-- 按照id降序排列,更新前三條記錄,將age-10
UPDATE user1 SET age=age-10 ORDER BY id DESC LIMIT 3;
-- 刪除前三條記錄
DELETE FROM user1
LIMIT 3;
DELETE FROM user1
ORDER BY id DESC
LIMIT 3;
-- 測試完整SELECT 語句的形式
SELECT addr,
GROUP_CONCAT(username) AS usersDetail,
COUNT(*) AS totalUsers,
SUM(age) AS sum_age,
MAX(age) AS max_age,
MIN(age) AS min_age,
AVG(age) AS avg_age
FROM user1
WHERE id>=2
GROUP BY addr;
SELECT addr,
GROUP_CONCAT(username) AS usersDetail,
COUNT(*) AS totalUsers,
SUM(age) AS sum_age,
MAX(age) AS max_age,
MIN(age) AS min_age,
AVG(age) AS avg_age
FROM user1
WHERE id>=2
GROUP BY addr
HAVING totalUsers>=2;
SELECT addr,
GROUP_CONCAT(username) AS usersDetail,
COUNT(*) AS totalUsers,
SUM(age) AS sum_age,
MAX(age) AS max_age,
MIN(age) AS min_age,
AVG(age) AS avg_age
FROM user1
WHERE id>=2
GROUP BY addr
HAVING totalUsers>=1
ORDER BY totalUsers ASC;
SELECT addr,
GROUP_CONCAT(username) AS usersDetail,
COUNT(*) AS totalUsers,
SUM(age) AS sum_age,
MAX(age) AS max_age,
MIN(age) AS min_age,
AVG(age) AS avg_age
FROM user1
WHERE id>=2
GROUP BY addr
HAVING totalUsers>=1
ORDER BY totalUsers ASC
LIMIT 0,2;
*****************************************************************************************************
我的博客園地址:https://www.cnblogs.com/zyx110/