1.登錄
在黑框中輸入
net start mysql // 啟動mysql服務
net stop mysql // 停止mysql服務
1.MySQL數據模型
關系型數據庫:
關系型數據庫是建立在關系模型基礎上的數據庫,簡單說,關系型數據庫是由多張能互相連接的 二維表 組成的數據庫
如下圖,訂單信息表
和 客戶信息表
都是有行有列二維表我們將這樣的稱為關系型數據庫。
*關系數據庫的優點:
- 都是使用表結構,格式一致,易于維護。
- 使用通用的 SQL 語言操作,使用方便,可用于復雜查詢。
- 關系型數據庫都可以通過SQL進行操作,所以使用方便。
- 復雜查詢。現在需要查詢001號訂單數據,我們可以看到該訂單是1號客戶的訂單,而1號訂單是李聰這個客戶。以后也可以在一張表中進行統計分析等操作。
- 數據存儲在磁盤中,安全。
2.SQL
了解了數據模型后,接下來我們就學習SQL語句,通過SQL語句對數據庫、表、數據進行增刪改查操作。
- 英文:Structured Query Language,簡稱 SQL
- 結構化查詢語言,一門操作關系型數據庫的編程語言
- 定義操作所有關系型數據庫的統一標準
- 對于同一個需求,每一種數據庫操作的方式可能會存在一些不一樣的地方,我們稱為“方言”
2.1通過語法
- SQL語句可以單行或多行書寫,以分號結尾。
- MySQL 數據庫的 SQL 語句不區分大小寫,關鍵字建議使用大寫。
- 注釋:單行注釋: – 注釋內容 或 #注釋內容(MySQL 特有) 多行注釋: /* 注釋 */
2.2SQL分類
- DDL(Data Definition Language) : 數據定義語言,用來定義數據庫對象:數據庫,表,列等。DDL簡單理解就是用來操作數據庫,表等
- DML(Data Manipulation Language) 數據操作語言,用來對數據庫中表的數據進行增刪改。DML簡單理解就對表中數據進行增刪改
- DQL(Data Query Language) 數據查詢語言,用來查詢數據庫中表的記錄(數據)。DQL簡單理解就是對數據進行查詢操作。從數據庫表中查詢到我們想要的數據。
- DCL(Data Control Language) 數據控制語言,用來定義數據庫的訪問權限和安全級別,及創建用戶DML簡單理解就是對數據庫進行權限控制。比如我讓某一個數據庫表只能讓某一個用戶進行操作等。
以后我們最常用的是DML和DQL。
4,DDL:操作數據庫
1.查詢所有的數據庫
SHOW DATABASES;
2.創建數據庫
CREATE DATABASE
數據庫名稱;
CREATE DATABASE IF NOT EXISTS
數據庫名稱;
3.刪除數據庫
DROP DATABASE
數據庫名稱;
DROP DATABASE IF EXISTS
數據庫名稱;
4.使用數據庫
數據庫創建好了,要在數據庫中創建表,得先明確在哪兒個數據庫中操作,此時就需要使用數據庫。
- 使用數據庫
> USE 數據庫名稱;
- 查看當前使用的數據庫
SELECT DATABASE();
5,DDL:操作表
操作表也就是對表進行增(Create)刪(Retrieve)改(Update)查(Delete)。
5.1 查詢表
- 查詢當前數據庫下所有表名稱
SHOW TABLES;
查詢表結構
DESC 表名稱;
5.2 創建表
- 創建表
CREATE TABLE
表名 (
字段名1 數據類型1,
字段名2 數據類型2,
…
字段名n 數據類型n
);
5.3數據類型
char : 定長字符串。 優點:存儲性能高 缺點:浪費空間 eg : name char(10)
如果存儲的數據字符個數不足10個,也會占10個的空間 varchar : 變長字符串。 優點:節約空間 缺點:存儲性能底 eg :
name varchar(10) 如果存儲的數據字符個數不足10個,那就數據字符個數是幾就占幾個的空間
5.4 刪除表
- 刪除表
DROP TABLE 表名;
- 刪除表時判斷表是否存在
DROP TABLE IF EXISTS 表名;
5.5 修改表
- 修改表名
ALTER TABLE 表名 RENAME TO 新的表名;
– 將表名student修改為stu alter table student rename to stu;
- 再添一列
ALTER TABLE 表名 ADD 列名 數據類型;
– 給stu表添加一列address,該字段類型是varchar(50)
alter table stu add address varchar(50);
- 修改數據類型
ALTER TABLE 表名 MODIFY 列名 新數據類型;
– 將stu表中的address字段的類型改為 char(50)
alter table stu modify address char(50);
- 修改列名和數據類型
ALTER TABLE 表名 CHANGE 列名 新列名 新數據類型;
– 將stu表中的address字段名改為 addr,類型改為varchar(50)
alter table stu change address addr varchar(50);
- 刪除列
ALTER TABLE 表名 DROP 列名;
– 將stu表中的addr字段 刪除
alter table stu drop addr;
7.DML
DML主要是對數據進行增(insert)刪(delete)改(update)操作。
7.1 添加數據
- 給指定列添加數據
INSERT INTO 表名(列名1,列名2,…) VALUES(值1,值2,…);
- 給全部列添加數據
INSERT INTO 表名 VALUES(值1,值2,…);
- 批量添加數據
INSERT INTO 表名(列名1,列名2,…) VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…;
INSERT INTO 表名 VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…;
-- 給指定列添加數據
INSERT INTO stu (id, NAME) VALUES (1, '張三');
-- 給所有列添加數據,列名的列表可以省略的
INSERT INTO stu (id,NAME,sex,birthday,score,email,tel,STATUS) VALUES (2,'李四','男','1999-11-11',88.88,'lisi@itcast.cn','13888888888',1);INSERT INTO stu VALUES (2,'李四','男','1999-11-11',88.88,'lisi@itcast.cn','13888888888',1);-- 批量添加數據
INSERT INTO stu VALUES (2,'李四','男','1999-11-11',88.88,'lisi@itcast.cn','13888888888',1),(2,'李四','男','1999-11-11',88.88,'lisi@itcast.cn','13888888888',1),(2,'李四','男','1999-11-11',88.88,'lisi@itcast.cn','13888888888',1);
7.2 修改數據
- 修改表數據
UPDATE 表名 SET 列名1=值1,列名2=值2,… [WHERE 條件] ;
例如:
update stu set sex = '女' where name = '張三';
7.3 刪除數據
- 刪除數據
DELETE FROM 表名 [WHERE 條件] ;
-- 刪除張三記錄
delete from stu where name = '張三';-- 刪除stu表中所有的數據
delete from stu;
8,DQL:查詢
查詢的完整語法:
SELECT 字段列表
FROM 表名列表
WHERE 條件列表
GROUP BY分組字段
HAVING分組后條件
ORDER BY排序字段
LIMIT分頁限定
8.1 基礎查詢
8.1.1 語法
- 查詢多個字段
SELECT 字段列表 FROM 表名;SELECT * FROM 表名; -- 查詢所有數據* 最好具體到每個列名
- 去除重復記錄
SELECT DISTINCT 字段列表 FROM 表名;
- 起別名
AS: AS 也可以省略
8.2 條件查詢
8.2.1 語法
SELECT 字段列表 FROM 表名 WHERE 條件列表;
- 條件:
條件列表可以使用以下運算符
8.2.2 條件查詢練習
-
查詢年齡大于20歲的學員信息
select * from stu where age > 20;
-
查詢年齡大于等于20歲的學員信息
select * from stu where age >= 20;
-
查詢年齡大于等于20歲 并且 年齡 小于等于 30歲 的學員信息
select * from stu where age >= 20 && age <= 30; select * from stu where age >= 20 and age <= 30;
上面語句中 && 和 and 都表示并且的意思。建議使用 and 。
也可以使用 between … and 來實現上面需求
select * from stu where age BETWEEN 20 and 30;
-
查詢入學日期在’1998-09-01’ 到 ‘1999-09-01’ 之間的學員信息
select * from stu where hire_date BETWEEN '1998-09-01' and '1999-09-01';
-
查詢年齡等于18歲的學員信息
select * from stu where age = 18;
-
查詢年齡不等于18歲的學員信息
select * from stu where age != 18; select * from stu where age <> 18;
-
查詢年齡等于18歲 或者 年齡等于20歲 或者 年齡等于22歲的學員信息
select * from stu where age = 18 or age = 20 or age = 22; select * from stu where age in (18,20 ,22);
-
查詢英語成績為 null的學員信息
null值的比較不能使用 = 或者 != 。需要使用 is 或者 is not
select * from stu where english = null; -- 這個語句是不行的 select * from stu where english is null; select * from stu where english is not null;
8.2.3 模糊查詢練習
模糊查詢使用like關鍵字,可以使用通配符進行占位:
(1)_ : 代表單個任意字符
(2)% : 代表任意個數字符
-
查詢姓’馬’的學員信息
select * from stu where name like '馬%';
-
查詢第二個字是’花’的學員信息
select * from stu where name like '_花%';
-
查詢名字中包含 ‘德’ 的學員信息
select * from stu where name like '%德%';
8.3 排序查詢
8.3.1 語法
SELECT 字段列表 FROM 表名 ORDER BY 排序字段名1 [排序方式1],排序字段名2 [排序方式2] …;
上述語句中的排序方式有兩種,分別是:
- ASC : 升序排列 (默認值)
- DESC : 降序排列
注意:如果有多個排序條件,當前邊的條件值一樣時,才會根據第二條件進行排序
8.3.2 練習
-
查詢學生信息,按照年齡升序排列
select * from stu order by age ;
-
查詢學生信息,按照數學成績降序排列
select * from stu order by math desc ;
-
查詢學生信息,按照數學成績降序排列,如果數學成績一樣,再按照英語成績升序排列
select * from stu order by math desc , english asc ;
8.4 聚合函數
8.4.1 概念
將一列數據作為一個整體,進行縱向計算。
8.4.2 聚合函數分類
函數名 | 功能 |
---|---|
count(列名) | 統計數量(一般選用不為null的列) |
max(列名) | 最大值 |
min(列名) | 最小值 |
sum(列名) | 求和 |
avg(列名) | 平均值 |
8.4.3 聚合函數語法
SELECT 聚合函數名(列名) FROM 表;
注意:null 值不參與所有聚合函數運算
8.4.4 練習
-
統計班級一共有多少個學生
select count(id) from stu; select count(english) from stu;
上面語句根據某個字段進行統計,如果該字段某一行的值為null的話,將不會被統計。所以可以在count(*) 來實現。* 表示所有字段數據,一行中也不可能所有的數據都為null,所以建議使用 count(*)
select count(*) from stu;
-
查詢數學成績的最高分
select max(math) from stu;
-
查詢數學成績的最低分
select min(math) from stu;
-
查詢數學成績的總分
select sum(math) from stu;
-
查詢數學成績的平均分
select avg(math) from stu;
-
查詢英語成績的最低分
select min(english) from stu;
8.5 分組查詢
8.5.1 語法
SELECT 字段列表 FROM 表名 [WHERE 分組前條件限定] GROUP BY 分組字段名 [HAVING 分組后條件過濾];
注意:分組之后,查詢的字段為聚合函數和分組字段,查詢其他字段無任何意義
where 和 having 區別:
-
執行時機不一樣:where 是分組之前進行限定,不滿足where條件,則不參與分組,而having是分組之后對結果進行過濾。
-
可判斷的條件不一樣:where 不能對聚合函數進行判斷,having 可以。
8.6 分頁查詢
8.6.1 語法
SELECT 字段列表 FROM 表名 LIMIT 起始索引 , 查詢條目數;
8.6.2 練習
-
從0開始查詢,查詢3條數據
select * from stu limit 0 , 3;
-
每頁顯示3條數據,查詢第1頁數據
select * from stu limit 0 , 3;
-
每頁顯示3條數據,查詢第2頁數據
select * from stu limit 3 , 3;
-
每頁顯示3條數據,查詢第3頁數據
select * from stu limit 6 , 3;
從上面的練習推導出起始索引計算公式:
起始索引 = (當前頁碼 - 1) * 每頁顯示的條數
約束
-
約束是作用于表中列上的規則,用于限制加入表的數據
例如:我們可以給id列加約束,讓其值不能重復,不能為null值。
-
約束的存在保證了數據庫中數據的正確性、有效性和完整性
添加約束可以在添加數據的時候就限制不正確的數據,年齡是3000,數學成績是-5分這樣無效的數據,繼而保障數據的完整性。
分類:
- 非空約束: 關鍵字是 NOT NULL:保證列中所有的數據不能有null值。
- 唯一約束:關鍵字是 UNIQUE:保證列中所有數據各不相同。
- 主鍵約束: 關鍵字是 PRIMARY KEY:主鍵是一行數據的唯一標識,要求非空且唯一。一般我們都會給沒張表添加一個主鍵列用來唯一標識數據。
默認約束: 關鍵字是 DEFAULT:保存數據時,未指定值則采用默認值。 - 外鍵約束: 關鍵字是 FOREIGN KEY:外鍵用來讓兩個表的數據之間建立鏈接,保證數據的一致性和完整性。
外鍵約束:
- 添加外鍵約束:
-- 創建表時添加外鍵約束
CREATE TABLE 表名(列名 數據類型,…[CONSTRAINT] [外鍵名稱] FOREIGN KEY(外鍵列名) REFERENCES 主表(主表列名)
);
-- 建完表后添加外鍵約束
ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵字段名稱) REFERENCES 主表名稱(主表列名稱);
- 刪除外鍵約束
ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱;