MySQL數據庫
1.1 MySQL簡介
- Mysql是最流行的RDBMS(Relational Database Management System:關係數據庫管理系統),特別是在WEB應用方面。
- 數據庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫,
- 每個數據庫都有一個或多個不同的API用於創建,訪問,管理,搜索和複製所保存的數據。
- 所謂的關係型數據庫,是建立在關係模型基礎上的數據庫,藉助於集合代數等數學概念和方法來處理數據庫中的數據。
- RDBMS即關係數據庫管理系統(Relational Database Management System)的特點:
- 1.數據以表格的形式出現
- 2.每行爲各種記錄名稱
- 3.每列爲記錄名稱所對應的數據域
- 4.許多的行和列組成一張表單
- 5.若干的表單組成database
- 在我們開始學習MySQL 數據庫前,讓我們先了解下RDBMS的一些術語:
數據庫: 數據庫是一些關聯表的集合。.
數據表: 表是數據的矩陣。在一個數據庫中的表看起來像一個簡單的電子表格。
列: 一列(數據元素) 包含了相同的數據, 例如郵政編碼的數據。
行:一行(=元組,或記錄)是一組相關的數據,例如一條用戶訂閱的數據。
冗餘:存儲兩倍數據,冗餘降低了性能,但提高了數據的安全性。
主鍵:主鍵是唯一的。一個數據表中只能包含一個主鍵。你可以使用主鍵來查詢數據。
外鍵:外鍵用於關聯兩個表。
複合鍵:複合鍵(組合鍵)將多個列作爲一個索引鍵,一般用於複合索引。
索引:使用索引可快速訪問數據庫表中的特定信息。索引是對數據庫表中一列或多列的值進行排序的一種結構。類似於書籍的目錄。
參照完整性: 參照的完整性要求關係中不允許引用不存在的實體。與實體完整性是關係模型必須滿足的完整性約束條件,目的是保證數據的一致性。
SQL:
- SQL: 結構化查詢語言(Structured Query Language)簡稱SQL,是最重要的關係數據庫操作語言.
- 有上百種數據庫產品都支持SQL,如:MySQL、DB2、ORACLE、INGRES、SYBASE、SQLSERVER…
- 結構化查詢語言包含6個部分:
1. 數據查詢語言(DQL:Data Query Language):SELECT
2. 數據操作語言(DML:Data Manipulation Language):INSERT,UPDATE和DELETE
3. 事務處理語言(TPL):BEGIN TRANSACTION,COMMIT和ROLLBACK
4. 數據控制語言(DCL):GRANT(授權)或REVOKE(回收權限)
5. 數據定義語言(DDL):CREATE、ALTER和DROP
6. 指針控制語言(CCL):DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用於對一個或多個表單獨行的操作
- 在本節中,會讓大家快速掌握Mysql的基本知識,並輕鬆使用Mysql數據庫。
1.2 mysql數據庫的安裝:
① 先到MySQL的官方網站進行下載,這裏的版本用的是5.7。
版本:5.7.28
網址:https://dev.mysql.com/downloads/mysql/5.7.html#downloads下載。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-gQfiFvA0-1573467923048)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xa6jFKVz-1573467923050)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
② 下載完成之後,進行安裝。
- mysql使用協議,同意協議,並進行下一步
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-tRy87a6E-1573467923051)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
- 選擇安裝的類型
- Developer Default 默認安裝,會安裝mysql-server以及mysql-client中的一部分東西。
- Server only 安裝mysql-server,mysql核心程序,生成管理數據庫實例,數據庫實例任務調度線程之類,並提供相關接口供不同客戶端調用【命令行】
- Client only 安裝mysql-client,其中包括MySQL外殼、MySQL路由器、MySQL工作臺、MySQL連接器、以及一系列的插件。【圖形化界面,以及其他的一些工具,這些工具我們基本上使用不到的,所以安裝是比較多餘的,下面會推薦一個更加方便可視化界面。】
- Full 全部安裝,包括mysql-server和mysql-client。
- Custom,自定義安裝。
- 這裏我們安裝Server only即可。下面會推薦一個更加好用的可視化界面供同學們使用,所以這裏我們選擇 Server only即可。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-gBdlTh9l-1573467923052)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
- 安裝應用包
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-TyrySkMp-1573467923053)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
- 產品配置,我們只選則了mysql-server,所以直接進行下一步即可
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-mVZmjuyK-1573467923054)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
- 高擴展性的選用
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-GLqyFhQd-1573467923055)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
- 配置類型的選擇
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-NpBjxcrk-1573467923057)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
- 端口號的選擇,mysql的默認端口爲3306,但是本機的3306被佔用,所以,改爲3307
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-JXnztTlP-1573467923058)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
- 進行數據庫密碼設置
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ALvvWbLE-1573467923059)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
- 服務名稱
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Y6WlN44D-1573467923060)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
- 應用配置加載
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-moNneUly-1573467923062)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-oI1xAp55-1573467923063)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
- 產品配置介紹
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-YNpmuYqv-1573467923065)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
- 安裝完成
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-i9qhQpwY-1573467923065)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
③ 測試安裝
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WXH0Ivkx-1573467923066)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-oaFvSXAz-1573467923068)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
④ 有些計算的服務在安裝完成之後,沒有啓動需要我們手動開啓。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-iYdRSUe3-1573467923069)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-1yTdG1jh-1573467923070)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-d7EjMLrc-1573467923071)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-3pop0Z21-1573467923072)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
- 上面的這些步驟,每次使用數據庫之前都要進行服務的開啓,這是比較麻煩的,我們可以配置一些設置,來啓動服務。
- 在mysql中的bin的同級目錄下,創建my.ini,寫入配置
[mysql]
# 設置mysql客戶端默認字符集
default-character-set=utf8
[mysqld]
#設置3306端口
port = 3306
# 設置mysql的安裝目錄
basedir=E:/mysql-5.7.12-winx64
# 設置mysql數據庫的數據的存放目錄
datadir=E:/mysql-5.7.12-winx64/data
# 允許最大連接數
max_connections=200
# 服務端使用的字符集默認爲8比特編碼的latin1字符集
character-set-server=utf8
# 創建新表時將使用的默認存儲引擎
default-storage-engine=INNODB
- 以管理員身份打開cmd,使用cd切換到bin目錄下,執行安裝命令mysqld install
- 成功之後輸入激活命令 mysqld --initialize-insecure --user=mysql
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-3bneIv8x-1573467923073)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
- 配置環境變量
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-3lD5zbnO-1573467923074)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-JyZg1zhz-1573467923076)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-IwldqSLg-1573467923077)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
- 命令行直接啓動mysql
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-9Lp98wmI-1573467923078)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
1.3 連接測試
-
這裏使用的是SQLyog(小海豚),mysql-client,一種簡單易用的數據庫圖形化工具。
-
現在我們的mysql中創建一個數據庫
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-0AXAiJhU-1573467923079)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
- 連接數據庫
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-oTRU2Q8R-1573467923080)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
1.4 mysql的卸載
-
直接卸載會有mysql殘留,所以需要使用命令行。
-
以管理員身份運行CMD,執行net stop mysql命令停止MySQL服務,然後在執行mysqld -remove命令卸載服務,最後刪除整個mysql目錄即可。
net stop mysql -- 命令停止MySQL服務
mysqld -remove /或者/ sc delete 服務名稱 -- 命令卸載服務
- mariadb的卸載與mysql是一樣的,只需要注意服務名稱不同。
- mysql的配置繁瑣,易錯,建議使用mariadb。
- 一定要注意,在卸載時,就mysql的文件卸載乾淨,否則在下次安裝使用時,會出現一系列的bug!
1.5 SQL的基本操作
數據庫操作:
mysql> show databases; --查看當前用戶下的所有數據庫
mysql> create database 數據庫名 charset=utf8; --創建數據庫
mysql> use test; --選擇進入test數據庫
mysql> show create database 數據庫名\G --查看建數據庫語句
mysql> select database(); --查看當前所在的數據庫位置
mysql> drop database [if exists] 數據庫名; --刪除一個數據庫
數據表操作:
mysql> show tables; --查看當前庫下的所有表格
mysql> desc tb1; --查看tb1的表結構。
mysql> show create table 表名\G --查看錶的建表語句。
mysql> create table demo( --創建demo表格
-> name varchar(16) not null,
-> age int,
-> sex enum('w','m') not null default 'm');
Query OK, 0 rows affected (0.05 sec)
mysql> show columns from demo; --查看錶結構
mysql> desc demo; --查看錶結構
+-------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| name | varchar(16) | NO | | NULL | |
| age | int(11) | YES | | NULL | |
| sex | enum('w','m') | NO | | m | |
+-------+---------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql>drop table if exists mytab; -- 嘗試刪除mytab表格
數據操作:
--添加一條數據
mysql> insert into demo(name,age,sex) values('zhangsan',20,'w');
Query OK, 1 row affected (0.00 sec)
--不指定字段名來添加數據
mysql> insert into demo values('lisi',22,'m');
Query OK, 1 row affected (0.00 sec)
--指定部分字段名來添加數據
mysql> insert into demo(name,age) values('wangwu',23);
Query OK, 1 row affected (0.00 sec)
--批量添加數據
mysql> insert into demo(name,age,sex) values('aaa',21,'w'),("bbb",22,'m');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from demo; --查詢數據
mysql> update demo set age=24 where name='aaa'; --修改
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> delete from demo where name='bbb'; --刪除
Query OK, 1 row affected (0.00 sec)
1.6 MySQL數據結構類型及操作:
MySQL的數據類型分爲三個類:數值類型、字串類型、日期類型 。 還有一個特殊的值:NULL。
1 數值類型:
*tinyint(1字節) 0~255 -128~127
smallint(2字節)
mediumint(3字節)
*int(4字節)
bigint(8字節)
*float(4字節) float(6,2)
*double(8字節)
decimal(自定義)字串形數值
2 字串類型
普通字串
*char 定長字串 char(8)
*varchar 可變字串 varchar(8)
二進制類型
tinyblob
blob
mediumblob
longblob
文本類型
tinytext
*text 常用於<textarea></textarea>
mediumtext
longtext
*enum枚舉
set集合
3 時間和日期類型:
date 年月日
time 時分秒
*datetime 年月日時分秒
timestamp 時間戳
year 年
4 NULL值
NULL意味着“沒有值”或“未知值”
可以測試某個值是否爲NULL
不能對NULL值進行算術計算
對NULL值進行算術運算,其結果還是NULL
0或NULL都意味着假,其餘值都意味着真
MySQL的運算符:
算術運算符:+ - * / %
比較運算符:= > < >= <= <> !=
數據庫特有的比較:in,not in, is null,is not null,like, between and
邏輯運算符:and or not
表的字段約束:
unsigned 無符號(正數)
zerofill 前導零填充
auto_increment 自增
default 默認值
not null 非空
PRIMARY KEY 主鍵 (非null並不重複)
unique 唯一性 (可以爲null但不重複)
index 常規索引
建表語句格式:
create table 表名(
字段名 類型 [字段約束],
字段名 類型 [字段約束],
字段名 類型 [字段約束],
...
);
mysql> create table stu(
-> id int unsigned not null auto_increment primary key,
-> name varchar(8) not null unique,
-> age tinyint unsigned,
-> sex enum('m','w') not null default 'm',
-> classid char(6)
-> );
Query OK, 0 rows affected (0.05 sec)
mysql> desc stu;
+---------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(8) | NO | UNI | NULL | |
| age | tinyint(3) unsigned | YES | | NULL | |
| sex | enum('m','w') | NO | | m | |
| classid | char(6) | YES | | NULL | |
+---------+---------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
mysql> show create table stu\G --查看建表的語句
*************************** 1. row ***************************
Table: stu
Create Table: CREATE TABLE `stu` (
`id` int(10) unsigned NOT NULL auto_increment,
`name` varchar(8) NOT NULL,
`age` tinyint(3) unsigned default NULL,
`sex` enum('m','w') NOT NULL default 'm',
`classid` char(6) default NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
修改表結構:
格式: alter table 表名 action(更改選項);
更改選項:
1. 添加字段:alter table 表名 add 字段名信息
例如:
-- 在user表的最後追加一個num字段 設置爲int not null
mysql> alter table user add num int not null;
-- 在user表的email字段後添加一個age字段,設置int not null default 20;
mysql> alter table user add age int not null default 20 after email;
-- 在user表的最前面添加一個aa字段設置爲int類型
mysql> alter table user add aa int first;
2. 刪除字段:alter table 表名 drop 被刪除的字段名
例如:-- 刪除user表的aa字段
mysql> alter table user drop aa;
3. 修改字段:alter table 表名 change[modify] 被修改後的字段信息
其中:change可以修改字段名, modify 不修改
例如:
-- 修改user表中age字段信息(類型),(使用modify關鍵字的目的不修改字段名)
mysql> alter table user modify age tinyint unsigned not null default 20;
-- 修改user表的num字段改爲mm字段並添加了默認值(使用change可以改字段名)
mysql> alter table user change num mm int not null default 10;
4. 添加和刪除索引
-- 爲user表中的name字段添加唯一性索引,索引名爲uni_name;
mysql> alter table user add unique uni_name(name);
-- 爲user表中的email字段添加普通索引,索引名爲index_eamil
mysql> alter table user add index index_email(email);
-- 將user表中index_email的索引刪除
mysql> alter table user drop index index_email;
5. 更改表名稱:
ALTER TABLE 舊錶名 RENAME AS 新表名
6. 更改AUTO_INCREMENT初始值:
ALTER TABLE 表名稱 AUTO_INCREMENT=1
7. 更改表類型:
ALTER TABLE 表名稱 ENGINE="InnoDB"
MySQL數據庫中的表類型一般常用兩種:MyISAM和InnoDB
區別:MyISAM類型的數據文件有三個frm(結構)、MYD(數據)、MYI(索引)
MyISAM類型中的表數據增 刪 改速度快,不支持事務,沒有InnoDB安全。
InnoDB類型的數據文件只有一個 .frm
InnoDB類型的表數據增 刪 改速度沒有MyISAM的快,但支持事務,相對安全。
1.7 數據的DML操作:添加數據,修改數據,刪除數據
添加數據:
格式: insert into 表名[(字段列表)] values(值列表...);
--標準添加(指定所有字段,給定所有的值)
mysql> insert into stu(id,name,age,sex,classid) values(1,'zhangsan',20,'m','lamp138');
Query OK, 1 row affected (0.13 sec)
mysql>
--指定部分字段添加值
mysql> insert into stu(name,classid) value('lisi','lamp138');
Query OK, 1 row affected (0.11 sec)
-- 不指定字段添加值
mysql> insert into stu value(null,'wangwu',21,'w','lamp138');
Query OK, 1 row affected (0.22 sec)
-- 批量添加值
mysql> insert into stu values
-> (null,'zhaoliu',25,'w','lamp94'),
-> (null,'uu01',26,'m','lamp94'),
-> (null,'uu02',28,'w','lamp92'),
-> (null,'qq02',24,'m','lamp92'),
-> (null,'uu03',32,'m','lamp138'),
-> (null,'qq03',23,'w','lamp94'),
-> (null,'aa',19,'m','lamp138');
Query OK, 7 rows affected (0.27 sec)
Records: 7 Duplicates: 0 Warnings: 0
修改操作:
格式:update 表名 set 字段1=值1,字段2=值2,字段n=值n... where 條件
-- 將id爲11的age改爲35,sex改爲m值
mysql> update stu set age=35,sex='m' where id=11;
Query OK, 1 row affected (0.16 sec)
Rows matched: 1 Changed: 1 Warnings: 0
-- 將id值爲12和14的數據值sex改爲m,classid改爲lamp92
mysql> update stu set sex='m',classid='lamp92' where id=12 or id=14 --等價於下面
mysql> update stu set sex='m',classid='lamp92' where id in(12,14);
Query OK, 2 rows affected (0.09 sec)
Rows matched: 2 Changed: 2 Warnings: 0
刪除操作:
格式:delete from 表名 [where 條件]
-- 刪除stu表中id值爲100的數據
mysql> delete from stu where id=100;
Query OK, 0 rows affected (0.00 sec)
-- 刪除stu表中id值爲20到30的數據
mysql> delete from stu where id>=20 and id<=30;
Query OK, 0 rows affected (0.00 sec)
-- 刪除stu表中id值爲20到30的數據(等級於上面寫法)
mysql> delete from stu where id between 20 and 30;
Query OK, 0 rows affected (0.00 sec)
-- 刪除stu表中id值大於200的數據
mysql> delete from stu where id>200;
Query OK, 0 rows affected (0.00 sec)
1.8 數據的DQL操作:數據查詢
格式:
select [字段列表]|* from 表名
[where 搜索條件]
[group by 分組字段 [having 子條件]]
[order by 排序 asc|desc]
[limit 分頁參數]
各種查詢:
mysql> select * from stu;
+----+----------+-----+-----+---------+
| id | name | age | sex | classid |
+----+----------+-----+-----+---------+
| 1 | zhangsan | 20 | m | lamp138 |
| 2 | lisi | 20 | m | lamp138 |
| 3 | wangwu | 21 | w | lamp138 |
| 4 | zhaoliu | 25 | w | lamp94 |
| 5 | uu01 | 26 | m | lamp94 |
| 6 | uu02 | 28 | w | lamp92 |
| 7 | qq02 | 24 | m | lamp92 |
| 8 | uu03 | 32 | m | lamp138 |
| 9 | qq03 | 23 | w | lamp94 |
| 10 | aa | 19 | m | lamp138 |
| 11 | sad | 35 | m | lamp94 |
| 12 | tt | 25 | m | lamp92 |
| 13 | wer | 25 | w | lamp94 |
| 14 | xx | 25 | m | lamp92 |
| 15 | kk | 0 | w | lamp94 |
+----+----------+-----+-----+---------+
15 rows in set (0.00 sec)
1. where條件查詢
1. 查詢班級爲lamp138期的學生信息
mysql> select * from stu where classid='lamp138';
2. 查詢lamp138期的男生信息(sex爲m)
mysql> select * from stu where classid='lamp138' and sex='m';
3. 查詢id號值在10以上的學生信息
mysql> select * from stu where id>10;
4. 查詢年齡在20至25歲的學生信息
mysql> select * from stu where age>=20 and age<=25;
mysql> select * from stu where age between 20 and 25;
5. 查詢年齡不在20至25歲的學生信息
mysql> select * from stu where age not between 20 and 25;
mysql> select * from stu where age<20 or age>25;
6. 查詢id值爲1,8,4,10,14的學生信息
select * from stu where id in(1,8,4,10,14);
mysql> select * from stu where id=1 or id=8 or id=4 or id=10 or id=14;
7. 查詢lamp138和lamp94期的女生信息
mysql> select * from stu where classid in('lamp138','lamp94') and sex='w';
mysql> select * from stu where (classid='lamp138' or classid='lamp94') and sex='w
1.9 數據庫授權、備份和恢復
授權:
格式:grant 允許操作 on 庫名.表名 to 賬號@來源 identified by '密碼';
--實例:創建zhangsan賬號,密碼123,授權lamp61庫下所有表的增/刪/改/查數據,來源地不限
mysql> grant select,insert,update,delete on lamp61.* to zhangsan@'%' identified by '123';
mysql> grant all on *.* to zhangsan@'%' identified by '123';
Query OK, 0 rows affected (0.00 sec)
-- 授權一個用戶(zhangsan)密碼123,可以對所有的庫,所有的表做所有操作。
mysql> grant all on *.* to zhangsan@'%' identified by '123';
Query OK, 0 rows affected (0.17 sec)
--刷新生效,否則就要重啓MySQL服務纔可以。
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
--瀏覽當前MySQL用戶信息
mysql> select user,host,password from mysql.user;
+----------+-----------------+-------------------------------------------+
| user | host | password |
+----------+-----------------+-------------------------------------------+
| root | localhost | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| root | 127.0.0.1 | |
| | localhost | |
| zhangsan | % | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| admin | 192.168.112.132 | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
+----------+-----------------+-------------------------------------------+
5 rows in set (0.00 sec)
-- 移除一些權限
-- revoke:只刪除了用戶權限,但沒有刪除這個用戶
mysql> revoke insert,delete on *.* from [email protected] identified by'123';
-- 查看指定用戶的權限信息
mysql> show grants for xbb@localhost;
+------------------------------------------------------------------------------------------------------------+
| Grants for xbb@localhost |
+------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'xbb'@'localhost' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257' |
+------------------------------------------------------------------------------------------------------------+
--drop user:刪除了整個用戶及其權限(包括數據字典中的數據)
mysql> drop user 'xbb'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> select user,host from mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| root | 127.0.0.1 |
| debian-sys-maint | localhost |
| root | localhost |
| root | wangxg |
+------------------+-----------+
4 rows in set (0.00 sec)
備份與恢復(導入和導出)
-- 將lamp138庫導出
D:\>mysqldump -u root -p lamp138 >lamp138.sql
Enter password:
---- 將lamp138庫中的stu表導出
D:\>mysqldump -u root -p lamp138 stu >lamp138_stu.sql
Enter password:
-- 將lamp138庫導入
D:\>mysql -u root -p lamp138<lamp138.sql
Enter password:
-- 將lamp138庫中stu表導入
D:\>mysql -u root -p lamp138<lamp138_stu.sql
Enter password:
1.10 MySQL的多表聯查
- 表之間的關係有:1對1 1對多 多對多
1. 嵌套查詢:一個查詢的結果是另外sql查詢的條件:
如:查詢stu表中年齡最大的是誰?
mysql> select * from stu where age=(select max(age) from stu);
mysql> select * from stu where age in(select max(age) from stu); --(子查詢結果是多條時使用in查詢)
+----+------+------+-----+----------+
| id | name | age | sex | classid |
+----+------+------+-----+----------+
| 14 | abc | 33 | w | python01 |
+----+------+------+-----+----------+
1 row in set (0.01 sec)
2. where關聯查詢
已知:員工personnel表和部門department表,其中員工表中的did字段爲部門表id主鍵關聯。
查詢所有員工信息,並顯示所屬部門名稱
要求:顯示字段:員工id 部門 姓名
mysql> select p.id,d.name,p.name from personnel p,department d where p.did = d.id;
+----+-----------+-----------+
| id | name | name |
+----+-----------+-----------+
| 2 | 人事部 | 李玉剛 |
| 10 | 人事部 | 阿杜 |
| 4 | 市場部 | 劉歡 |
。。。。
3. 連接join查詢
左聯:left join
右聯:right join
內聯:inner join
已知如下表所示,商品類別信息表(具有兩層類別關係,通過pid表示,0表示一級類別)
mysql> select * from type;
+----+-----------+------+
| id | name | pid |
+----+-----------+------+
| 1 | 服裝 | 0 |
| 2 | 數碼 | 0 |
| 3 | 男裝 | 1 |
| 4 | 手機 | 2 |
| 5 | 相機 | 2 |
| 6 | 電腦 | 2 |
| 7 | 女裝 | 1 |
| 8 | 童裝 | 1 |
| 9 | 食品 | 0 |
| 10 | 零食 | 9 |
| 11 | 特產 | 9 |
| 12 | 休閒裝 | 1 |
+----+-----------+------+
12 rows in set (0.00 sec)
mysql> desc type;
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(16) | NO | | NULL | |
| pid | int(10) unsigned | YES | | NULL | |
+-------+------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
-- 查詢二級類別信息,並關聯出他們的父類別名稱
mysql> select t1.id,t1.name,t2.name from type t1,type t2 where t1.pid!=0 and t1.pid=t2.id;
+----+-----------+--------+
| id | name | name |
+----+-----------+--------+
| 3 | 男裝 | 服裝 |
| 4 | 手機 | 數碼 |
| 5 | 相機 | 數碼 |
| 6 | 電腦 | 數碼 |
| 7 | 女裝 | 服裝 |
| 8 | 童裝 | 服裝 |
| 10 | 零食 | 食品 |
| 11 | 特產 | 食品 |
| 12 | 休閒裝 | 服裝 |
+----+-----------+--------+
9 rows in set (0.01 sec)
--統計每個一級類別下都有多少個子類別。
mysql> select t1.id,t1.name,count(t2.id) from type t1,type t2 where t1.pid=0 and t1.id=t2.pid group by t1.id;
+----+--------+--------------+
| id | name | count(t2.id) |
+----+--------+--------------+
| 1 | 服裝 | 4 |
| 2 | 數碼 | 3 |
| 9 | 食品 | 2 |
+----+--------+--------------+
3 rows in set (0.00 sec)
1.11 MySQL的其他操作
1. MySQL的表複製
複製表結構
mysql> create table 目標表名 like 原表名;
複製表數據
mysql> insert into 目標表名 select * from 原表名;
2. 數據表的索引
創建索引
CREATE INDEX index_name ON table_name (column_list)
CREATE UNIQUE INDEX index_name ON table_name (column_list)
刪除索引
DROP INDEX index_name ON talbe_name
3. mysql視圖
創建視圖:
mysql> create view v_t1 as select * from t1 where id>4 and id<11;
Query OK, 0 rows affected (0.00 sec)
view視圖的幫助信息:
mysql> ? view
ALTER VIEW
CREATE VIEW
DROP VIEW
查看視圖:
mysql> show tables;
刪除視圖v_t1:
mysql> drop view v_t1;
4. MySQL的內置函數
字符串處理函數
---------------------------------------------
*concat(s1,s2,…Sn) 連接s1,s2..Sn爲一個字符串
insert(str,x,y,instr)將字符串str從第xx位置開始,y字符串的子字符串替換爲字符串str
lower(str)將所有的字符串變爲小寫
upper(str)將所有的字符串變爲大寫
left(str,x)返回字符串中最左邊的x個字符
rigth(str,y)返回字符串中最右邊的x個字符
lpad(str,n,pad)用字符串pad對str最左邊進行填充,直到長度爲n個字符串長度
rpad(str,n,pad)用字符串pad對str最右邊進行填充,直到長度爲n個字符串長度
trim(str) 去掉左右兩邊的空格
ltrim(str) 去掉字符串str左側的空格
rtrim(str) 去掉字符串str右側的空格
repeat(str,x) 返回字符串str重複x次
replace(str,a,b)將字符串的的a替換成b
strcmp(s1,s2) 比較字符串s1和s2
substring(s,x,y)返回字符串指定的長度
*length(str) 返回值爲字符串str 的長度
數值函數
-----------------------------------------------------
*abs(x) 返回x的絕對值
ceil(x) 返回大於x的最小整數值
floor(x) 返回小於x的最大整數值
mod(x,y) 返回x/y的取餘結果
rand() 返回0~1之間的隨機數
*round(x,y)返回參數x的四捨五入的有y位小數的值
truncate(x,y) 返回x截斷爲y位小數的結果
日期和時間函數
---------------------------------------------------
curdate() 返回當前日期,按照’YYYY-MM-DD’格式
curtime() 返回當前時間,當前時間以'HH:MM:SS'
*now() 返回當前日期和時間,
*unix_timestamp(date) 返回date時間的unix時間戳
from_unixtime(unix_timestamp[,format]) 返回unix時間的時間
week(date) 返回日期是一年中的第幾周
year(date) 返回日期的年份
hour(time) 返回time的小時值
minute(time) 返回日time的分鐘值
monthname(date) 返回date的月份
*date_fomat(date,fmt) 返回按字符串fmt格式化日期date值
date_add(date,INTERVAL,expr type) 返回一個日期或者時間值加上一個時間間隔的時間值
*datediff(expr,expr2) 返回起始時間和結束時間的間隔天數
//統計時間戳647583423距離當前時間相差天數(生日天數(不考慮年份))
mysql> select datediff(date_format(from_unixtime(647583423),"2017-%m-%d %h:%i:%s"),now());
其他常用函數
------------------------------------------------------
*database() 返回當前數據庫名
version() 返回當前服務器版本
user() 返回當前登陸用戶名
inet_aton 返回當前IP地址的數字表示 inet_aton("192.168.80.250");
inet_ntoa(num) 返回當前數字表示的ip inet_ntoa(3232256250);
*password(str) 返回當前str的加密版本
*md5(str) 返回字符串str的md5值
5. MySQL的事務處理
關閉自動提交功能(開啓手動事務)
mysql> set autocommit=0;
從表t1中刪除了一條記錄
mysql> delete from t1 where id=11;
此時做一個p1還原點:
mysql> savepoint p1;
再次從表t1中刪除一條記錄:
mysql> delete from t1 where id=10;
再次做一個p2還原點:
mysql> savepoint p2;
此時恢復到p1還原點,當然後面的p2這些還原點自動會失效:
mysql> rollback to p1;
退回到最原始的還原點:
mysql> rollback;
回滾
開啓自動事務提交(關閉手動事務)
mysql> set autocommit=1;
6. MySQL的觸發器
格式:1、觸發器的定義:
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
說明:
# trigger_name:觸發器名稱
# trigger_time:觸發時間,可取值:BEFORE或AFTER
# trigger_event:觸發事件,可取值:INSERT、UPDATE或DELETE。
# tb1_name:指定在哪個表上
# trigger_stmt:觸發處理SQL語句。
示例:
mysql> delimiter $$
mysql> create trigger del_stu before delete on stu for each row
-> begin
-> insert into stu_bak values(old.id,old.name,old.sex,old.age,old.addtime);
-> end;
-> $$
Query OK, 0 rows affected (0.05 sec)
mysql> delimiter ;
7. mysql日誌
開啓日誌: 在mysql配置文件中開啓:log-bin=mysql-bin
查看bin-log日誌:
mysql>show binary logs;
查看最後一個bin-log日誌:
mysql>show master status;
此時就會多一個最新的bin-log日誌
mysql>flush logs;
查看最後一個bin日誌.
mysql>show master status;
mysql>reset master;
清空所有的bin-log日誌
執行查看bin-log日誌
備份數據:
mysqldump -uroot -pwei test -l -F '/tmp/test.sql'
其中:-F即flush logs,可以重新生成新的日誌文件,當然包括log-bin日誌
// Linux關閉MySQL的命令
$mysql_dir/bin/mysqladmin -uroot -p shutdown
// linux啓動MySQL的命令
$mysql_dir/bin/mysqld_safe &
8、有關慢查詢操作:
開戶和設置慢查詢時間:
vi /etc/my.cnf
log_slow_queries=slow.log
long_query_time=5
查看設置後是否生效
mysql> show variables like "%quer%";
慢查詢次數:
mysql> show global status like "%quer%";
9 數據庫的恢復
1. 首先恢復最後一次的備份完整數據
[root@localhost mnt]# mysql -u root -p mydemo<mydemo_2017-7-26.sql
Enter password:
2. 查看bin-log日誌
[root@localhost data]# mysqlbinlog --no-defaults mysql-bin.000009;
查找到恢復的節點
3. 執行bin-log日誌文件,恢復最後一塊的增量數據。
[root@localhost data]# mysqlbinlog --no-defaults --stop-position="802" mysql-bin.000009|mys
2 mariadb — 簡潔版MySQL
-
可下載 MariaDB 開源的 https://downloads.mariadb.org**【推薦使用】**
-
mariadb是mysql的一個分支,安裝方便,且安裝之後可直接使用,其中的操作與mysql也是一致的,所以建議使用mariadb。[安裝的所有過程直接next即可。]
-
注意:mariadb和mysql是雖然可以同時存在,但是由於兩個的端口號都是默認3306,所以在命令行啓動數據庫時,會只啓動mariadb,其中他們兩個的操作是一致的,所以安裝一個就可以了,建議mariadb
-
安裝步驟
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-UQbIWbN7-1573467923082)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-OtCWrzsw-1573467923083)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-NCfBYGki-1573467923084)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-hgrkrcMp-1573467923085)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-g10FEMOa-1573467923087)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-40YSKh5z-1573467923088)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-TXKPh9lr-1573467923089)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
等待安裝完成即可。
- 在安裝完成之後再桌面會顯示HeidiSQL,此爲mariadb的圖像化,直接點開直接使用即可。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-2TWuPl9Q-1573467923090)(/Users/yhhang/Desktop/Python3.0課程體系研發/錄播大課/產出物/文檔/Python基礎第二週/image/.png)]
- mariadb的操作命令與mysql的操作命令是一樣的,直接使用mysql的建庫,建表語句即可。
3 python數據庫支持【擴展】
3.1 什麼是 PyMySQL?
- PyMySQL 是在 Python3.x 版本中用於連接 MySQL 服務器的一個庫,Python2中則使用mysqldb。
- PyMySQL 遵循 Python 數據庫 API v2.0 規範,幷包含了 pure-Python MySQL 客戶端庫。
3.2 PyMySQL安裝
- PyMySQL下載地址:https://github.com/PyMySQL/PyMySQL。
3.2.1 使用pip命令進行安裝:
$ pip install PyMySQL
3.2.2 使用 git 命令下載安裝包安裝(你也可以手動下載):
$ git clone https://github.com/PyMySQL/PyMySQL
$ cd PyMySQL/
$ python3 setup.py install
3.3 數據庫連接
3.3.1 通過如下代碼測試數據庫連接
#!/usr/bin/python3
import pymysql
# 打開數據庫連接
db = pymysql.connect(host="localhost",user="root",password="",db="mydb",charset="utf8")
# 使用 cursor() 方法創建一個遊標對象 cursor
cursor = db.cursor()
# 使用 execute() 方法執行 SQL 查詢
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法獲取單條數據.
data = cursor.fetchone()
print ("Database version : %s " % data)
# 關閉數據庫連接
db.close()
3.3.2 執行數據查詢:
#!/usr/bin/python3
import pymysql
#打開數據庫連接
db = pymysql.connect(host="localhost",user="root",password="",db="mydb",charset="utf8")
#使用cursor()方法創建一個遊標對象cursor
cursor = db.cursor()
#定義查詢sql語句
#sql = "select * from stu"
sql = "select * from stu where classid='%s'"%("python03")
try:
# 使用execute()方法執行SQL查詢
cursor.execute(sql)
print("本次查詢條數:",cursor.rowcount)
'''
# 使用fetchone()方法獲取單條數據.
while True:
data = cursor.fetchone();
if data == None:
break;
print (data)
'''
#使用fetchall()獲取所有結果
alist = cursor.fetchall()
for vo in alist:
print(vo)
except Exception as err:
print("SQL執行錯誤,原因:",err)
# 關閉數據庫連接
db.close()
3.3.3 執行數據添加
#!/usr/bin/python3
import pymysql
#打開數據庫連接
db = pymysql.connect(host="localhost",user="root",password="",db="mydb",charset="utf8")
#使用cursor()方法創建一個遊標對象cursor
cursor = db.cursor()
#定義添加sql語句
data = ("uu100",28,'w','python05')
sql = "insert into stu(name,age,sex,classid) values('%s','%d','%s','%s')"%(data)
try:
# 使用execute()方法執行SQL
m = cursor.execute(sql)
# 事務提交
db.commit()
print("成功操作條數:",m)
#print("成功操作條數:",cursor.rowcount)
except Exception as err:
#事務回滾
db.rollback()
print("SQL執行錯誤,原因:",err)
# 關閉數據庫連接
db.close()
3.3.4 執行刪除操作
#!/usr/bin/python3
import pymysql
#打開數據庫連接
db = pymysql.connect(host="localhost",user="root",password="",db="mydb",charset="utf8")
#使用cursor()方法創建一個遊標對象cursor
cursor = db.cursor()
#定義刪除sql語句
sql = "delete from stu where id=%d"%(100)
try:
# 使用execute()方法執行SQL
cursor.execute(sql)
# 事務提交
db.commit()
print("成功刪除條數:",cursor.rowcount)
except Exception as err:
#事務回滾
db.rollback()
print("SQL執行錯誤,原因:",err)
# 關閉數據庫連接
db.close()
3.4 數據庫查詢操作:
- Python查詢Mysql使用 fetchone() 方法獲取單條數據, 使用fetchall() 方法獲取多條數據。
- fetchone(): 該方法獲取下一個查詢結果集。結果集是一個對象,最後返回None結束
- fetchall(): 接收全部的返回結果行.
- rowcount: 這是一個只讀屬性,並返回執行execute()方法後影響的行數。