本文目錄一覽:
MYSQL使用基礎、進階分享
MySQL是一個關係型數據庫管理系統,由瑞典MySQL AB公司開發,屬於Oracle旗下產品,是最流行的關係型數據庫管理系統之一。
端口是3306。
表很多時,使用linux腳本,需要根據需要修改一下:
和創建一樣,可以加上 if exists
可兩篇文章:
如:
用於在已有的表中添加、刪除或修改列。
添加 ADD
或
默認是添加到最後,但可以指定位置。 FIRST :添加最前
AFTER 字段名 :添加指定字段之後
例子:
刪除 DROP
修改 MODIFY 主要修改原列的類型或約束條件 同樣可以用 FIRST 和 AFTER 字段名 ,代表的是修改到哪裡。
修改字段名 CHANGE
可以把表2的數據複製到表1中,但 不能複製約束性條件 。
單行
多行,注意 只有一個VALUES :
不寫 (行1, 行2…) 這一部分的話,默認一一對應
除了以上方法外,還可以用SET為每一行附上相應的值。
假如沒有篩選的話,就給全部都修改了。可以用 WHERE 篩選。
假如 沒有篩選的話,就給全部刪除了 。相當於清空。
清空
先把表刪除,然後再建一個。與 DELETE FROM 相比, TRUNCATE 的效率更快,因為 DELETE FROM 是把記錄逐條刪除的。
查詢執行的順序
FROM — WHERE — SELECT — GROUP BY — HAVING — ORDER BY — LIMIT
注意
當數據很大,上百萬的時候,使用LIMIT … OFFSET ..的方式進行分頁十分浪費資源且耗時長。最好是結合WHERE使用,如:
REGEXP 使用正則表達進行匹配。 查詢時,需要搭配WHERE或HAVING使用 。
兩個表之間有交集且要用到兩個表的數據時,可以使用內連接查詢。
LEFT JOIN 關鍵字從左表(table1)返回所有的行,即使右表(table2)中沒有匹配。如果右表中沒有匹配,則結果為 NULL。
用法:
RIGHT JOIN 關鍵字從右表(table2)返回所有的行,即使左表(table1)中沒有匹配。如果左表中沒有匹配,則結果為 NULL。 把LEFT JOIN的表1、表2調換順序,就是REGHT JOIN 。
FULL OUTER JOIN 關鍵字只要左表(table1)和右表(table2)其中一個表中存在匹配,則返回行. 相當於結合了 LEFT JOIN 和 RIGHT JOIN 的結果。
但 MySQL中不支持 FULL OUTER JOIN 。
即SELECT嵌套。
IN 一個查詢結果作為另一個查詢的條件。 如:
EXISTS 用於判斷查詢子句是否有記錄,如果有一條或多條記錄存在返回 True,否則返回 False。True時執行。 如:
索引的本質是一種排好序的數據結構。利用索引可以提高查詢速度。
常見的索引有:
MySQL通過外鍵約束來保證表與表之間的數據的完整性和準確性。 外鍵的使用條件:
外鍵的好處:可以使得兩張表關聯,保證數據的一致性和實現一些級聯操作。
對已有的兩個表增加外鍵 比如:主表為A,子表為B,外鍵為aid,外鍵約束名字為a_fk_b
為子表添加一個字段,當做外鍵
為子表添加外鍵約束條件
假如刪除記錄報錯: [Err] 1451 -Cannot deleteorupdatea parent row: aforeignkeyconstraintfails (…)
這是因為MySQL中設置了foreign key關聯,造成無法更新或刪除數據。可以通過設置 FOREIGN_KEY_CHECKS 變量來避免這種情況。 第一步:禁用外鍵約束,我們可以使用: SETFOREIGN_KEY_CHECKS=0; 第二步:刪除數據 第三步:啟動外鍵約束,我們可以使用: SETFOREIGN_KEY_CHECKS=1; 查看當前FOREIGN_KEY_CHECKS的值,可用如下命令: SELECT @@FOREIGN_KEY_CHECKS;
使用 UNION 來組合兩個查詢,如果第一個查詢返回 M 行,第二個查詢返回 N 行,那麼組合查詢的結果一般為 M+N 行。
每個查詢必須包含相同的列、表達式和聚集函數。
默認會去除相同行,如果需要 保留 相同行,使用 UNION ALL 。
只能包含一個 ORDER BY 子句,並且必須位於語句的最後 。
內置函數很多, 見: MySQL 函數
我們一般使用 START TRANSACTION 或 BEGIN 開啟事務, COMMIT 提交事務中的命令, SAVEPOINT : 相當於設置一個還原點, ROLLBACK TO : 回滾到某個還原點下
一般的使用格式如下:
開啟事務時, 默認加鎖
根據類型可分為共享鎖(SHARED LOCK)和排他鎖(EXCLUSIVE LOCK)或者叫讀鎖(READ LOCK)和寫鎖(WRITE LOCK)。
根據粒度劃分又分表鎖和行鎖。表鎖由數據庫服務器實現,行鎖由存儲引擎實現。
除此之外,我們可以顯示加鎖
加鎖時, 如果沒有索引,會鎖表,如果加了索引,就會鎖行
InnoDB默認支持行鎖,獲取鎖是分步的,並不是一次性獲取所有的鎖,因此在鎖競爭的時候就會出現死鎖的情況
解決方法:
即ACID特性:
由於並發事務會引發上面這些問題, 我們可以設置事務的隔離級別解決上面的問題.
MySQL的默認隔離級別(可重複讀)
查看當前會話隔離級別
方式1
方式2
設置隔離級別
主從集群的示意圖如下:
主要涉及三個線程: binlog 線程、 I/O 線程和 SQL 線程。
同步流程:
由於MySQL主從集群只會從主節點同步到從節點, 不會反過來同步, 所以需要讀寫分離
讀寫分離需要在業務層面實現 , 寫數據只能在主節點上完成, 而讀數據可以在主節點或從節點上完成
索引是幫助MySQL高效獲取數據的排好序的數據結構
MySQL的索引有
推薦兩個在線工具:
簡單來說, B樹是在紅黑樹(一個平衡二叉樹)的基礎上將一個節點存放多個值, 實現的, 降低了樹的高度, 每個節點都存放索引及對應數據指針, 同一層的節點是遞增的
而B+樹在B樹的基礎上進行優化, 非葉子節點存放 子節點的開始的索引, 葉子節點存放索引和數據的指針, 且葉子節點之間有雙向的指針
如下示意圖:
不同的引擎, 主鍵索引存放的數據也不一樣, 比如常見的 MyISAM 和 InnoDB
MyISAM 的B+樹葉子節點存放表數據的指針, InnoDB 的B+樹葉子節點存放處主鍵外的數據
其他的:
即多個列組成一個索引, 語法:
由於聯合索引的B+樹的結構, 根據列建立, 所以我們的查找條件也要根據索引列的順序( where column1=x, column2=y,columnN… ), 否則會全表掃描
如果你對列進行了 (+,-,*,/,!) , 那麼都將不會走索引。
OR 引起的索引失效
OR 導致索引是在特定情況下的,並不是所有的 OR 都是使索引失效,如果OR連接的是 同 一個字段,那麼索引 不會失效 , 反之索引失效 。
這個我相信大家都明白,模糊搜索如果你前綴也進行模糊搜索,那麼不會走索引。
這兩種用法,也將使索引失效。另 IN 會走索引,但是當IN的取值範圍較大時會導致索引失效,走全表掃描, 見: MySQL中使用IN會不會走索引
不走索引。
走索引。
所以設計表的時候, 建議不可為空, 而是將默認值設置為 “” ( NOT NULL DEFAULT “” )
如何用MySQL創建一個數據庫
MySQL是一個很常用的數據庫工具。下面,我們來看看如何使用MySQL創建一個數據庫吧。
01
打開MySQL
首先要確保本地電腦中已安裝上MySQL工具,並打開它,再連接上MySQL服務器,如下圖所示:
02
新建數據庫
在鏈接的MySQL數據庫中右擊,選擇【新建數據庫】選項,如下圖所示:
03
數據庫名稱
會彈出一個新建數據庫窗口,【數據庫名稱】見名知意即可,比如名為db_user,如下圖所示:
04
字符集和序規則
字符集以utf開頭即可,排序規則選擇utf8_general_ci,點擊確定,即可創建一個數據庫,如下圖所示:
MySQL數據庫基礎+ 數據庫的基本操作?
需要用的資料以鏈接的形式給需要的同學。
我用的mysql版本為: Mysql-5.5.45-win64.msi 密碼是:26zw
圖形化工具 Navicat(前期不推薦用,直接手動敲): Navicat 密碼:c7fs
開始我的MySQL之旅吧 始於2016.12.04
–WH
一、數據庫的安裝
這個就不在這裡過多闡述了,因為網上實在是太多安裝mysql的教程了,有了我給的mysql,在按照這個安裝教程(MySQL安裝教程)去看,就能夠安裝完好。
安裝好mysql後,如果需要使用windows命令窗口(也就是cmd)來操作mysql,那麼就需要配置環境變量,在安裝好的mysql下找到bin,將其目錄放到環境變量path中去,就行了,檢測成功與否的方法是在cmd命令窗口中輸入mysql,就會出現一大段英文,就說明成功了,反之失敗,如果不會的話就去百度搜教程。
二、數據庫的基本操作
1、開啟mysql服務命令
net start mysql
2、進入mysql的兩種方式
明文進入:mysql -uroot -proot格式:mysql -u帳號 -p密碼
密文進入:mysql -uroot -p 按enter會提示你輸入密碼(Enter pssword:),此時你寫的密碼就會顯示為***這樣。
3、查看mysql中所有的數據庫(一般在固定的單詞命令就會是用大寫,這個要習慣,看多了敲多了就認識了)
前面四個數據庫是mysql中自帶的,也就是必須的.
SHOW DATABASES;
4、創建名為test_1的數據庫
格式:CREATE DATABASE 數據庫名
CREATE DATABASE test_1;
5、刪除名為test_1的數據庫
格式:DROP DATABASE 數據庫名
DROP DATABASE test_1;
總結:學習了對數據庫的三個操作,1、查看所有數據庫 2、創建數據庫 3、刪除數據庫
三、數據表的基本操作
數據表和數據庫還有Mysql三者的關係
mysql中保存了很多數據庫、一個數據庫中可以保存很多表。
對數據表的增(創建表)刪(刪除表)改(修改表字段)查(查詢表結構)。 注意:這裡的操作對象是表,對錶的操作也就是表的結構,和表中的字段的操作(字段和記錄要分清楚)
前提:表是在數據庫下的,所以要先確實使用哪個數據庫。
USE test_1;
1、創建數據表
格式:CREATE TABLE 數據表名(
字段名1數據類型[列級別約束條件],
字段名2數據類型[列級別約束條件],
字段名3數據類型[列級別約束條件]
);
注意:格式不一定需要這樣隔着寫,完全可以全部寫成一行。但是那樣寫可觀性非常差。我這樣寫只是為了可以看的更清晰。
解釋:
1、[]中括號中的內容表示可以有可以沒有,
2、列級別這個“列”一定要搞清楚說的是什麼,一張表中有行有列,列表示豎,行表示橫
3、約束條件後面會講到
1.1、創建沒有約束的student表
CREATE TABLE student( idINT(11), nameVARCHAR(12), ageINT(11) );
注釋:SHOW TABLES 查詢數據庫底下的所有表。
1.2、創建有約束的student表
六大約束:主鍵約束、外鍵約束、非空約束、唯一約束、默認約束、自動增加
1.2.1:主鍵約束
PRIMARY KEY(primary key):獨一無二(唯一)和不能為空(非空),通俗的講,就是在表中增加記錄時,在該字段下的數據不能重複,不能為空,比如以上面創建的表為例子,在表中增加兩條記錄,如果id字段用了主鍵約束。則id不能一樣,並且不能為空。一般每張表中度有一個字段為主鍵,唯一標識這條記錄。以後需要找到該條記錄也可以同這個主鍵來確認記錄,因為主鍵是唯一的,並且非空,一張表中每個記錄的主鍵度不一樣,所以根據主鍵也就能找到對應的記錄。而不是多條重複的記錄。如果沒有主鍵,那麼表中就會存在很多重複的記錄,那麼即浪費存儲空間,在查詢時也消耗更多資源。
一般被主鍵約束了的字段度習慣性的稱該字段為該表的主鍵
單字段主鍵約束
兩種方式都可以
CREATE TABLE student(CREATE TABLE student(
idINT(11) PRIMARY KEY,idINT(11),
nameVARCHAR(12),nameVARCHAR(12),
ageINT(11) ageINT(11),
); PRIMARY KEY(id) );
多字段主鍵約束(複合主鍵)
這個id和name都市主鍵,說明在以後增加的插入的記錄中,id和name不能同時一樣,比如說可以是這樣。一條記錄為id=1,name=yyy、另一條記錄為:id=1,name=zzz。 這樣是可以的。並不是你們所理解的兩個字段分別度不可以相同。
CREATE TABLE student(CREATE TABLE student(
idINT(11) PRIMARY KEY,idINT(11),
nameVARCHAR(12) PRIMARY KEY, nameVARCHAR(12),
ageINT(11) ageINT(11),
);PRIMARY KEY(id,name) );
1.2.2:外鍵約束
什麼是外鍵舉個例子就清楚了,有兩張表,一張表是emp(員工)表,另一張表是dept(部門)表,一個員工屬於一個部門,那麼如何通過員工能讓我們自己他在哪個部門呢?那就只能在員工表中增加一個字段,能代表員工所在的部門,那該字段就只能是存儲dept中的主鍵了(因為主鍵是唯一的,才能確實是哪個部門,進而代表員工所在的部門,如果是部門名稱,有些部門的名稱可能是同名。就不能區分了。),像這樣的字段,就符合外鍵的特點,就可以使用外鍵約束,使該字段只能夠存儲另一張表的主鍵。如果不被外鍵約束,那麼該字段就無法保證存儲進來的值就一定是另一張表的主鍵值。
外鍵約束的特點:
1、外鍵約束可以描述任意一個字段(包括主鍵),可以為空,並且一個表中可以有多個外鍵。但是外鍵字段中的值必須是另一張表中的主鍵。
2、這樣被外鍵關聯的兩種表的關係可以稱為父子表或者主從表。子表(從表)擁有外鍵字段的表,父表(主表)被外鍵字段所指向的表。
3、子表被外鍵約束修飾的字段必須和父表的主鍵字段的類型一樣。
注意:一個表中有被外鍵修飾的字段,就稱該表有外鍵(是“有外鍵”。而不是“是外鍵”),並會給該表中的外鍵約束取一個名稱,所以我們常說的這個表有沒有外鍵,指的不是被外鍵約束修飾的字段名,而是指這個表是否有存在外鍵約束。也就是說,不能說這個表的外鍵是xxx(該表中被外鍵約束修飾的字段名),這種說法是錯誤的,但是大多數人已經習慣了這樣,雖然影響不大,但是在很多時候需要理解一個東西時,會造成一定的困擾。
格式:CONSTRAINT外鍵名稱FOREIGN KEY(被外鍵約束的字段名稱)REFERENCES 主表名(主鍵字段)
英文解釋:CONSTRAINT:約束REFERENCES:參考
CREATE TABLE tableA
(
id INT(11),
name VARCHAR(22),
location VARCHAR(50),
PRIMARY KEY(id)
);
CREATE TABLE tableB
(
id INT(11),
name VARCHAR(22) NOT NULL,
deptId INT(11),
PRIMARY KEY(id),
CONSTRAINT tableA_tableB_1 FOREIGH KEY(deptId) REFERENCES tableA(id)
);
解釋:tableB中有一個名為tableA_tableB_1的外鍵關聯了tableA和tableB兩個表,被外鍵約束修飾的字段為tableB中的deptId,主鍵字段為tableA中的id
1.2.3:非空約束
NOT NULL. 被該約束修飾了的字段,就不能為空,主鍵約束中就包括了這個約束
CREATE TABLE tableA
(
id INT(11),
name VARCHAR(22) NOT NULL,
location VARCHAR(50),
PRIMARY KEY(id)
);
1.2.4:唯一約束
UNIQUE 被唯一約束修飾了的字段,表示該字段中的值唯一,不能有相同的值,通俗點講,就好比插入兩條記錄,這兩條記錄中處於該字段的值不能是一樣的。
CREATE TABLE tableA
(
id INT(11),
name VARCHAR(22) UNIQUE,
location VARCHAR(50),
PRIMARY KEY(id)
);
也就是說在插入的記錄中,每條記錄的name值不能是一樣的。
1.2.5:默認約束
Default 指定這一列的默認值為多少,比如,男性同學比較多,性別就可以設置為默認男,如果插入一行記錄時,性別沒有填,那麼就默認加上男
CREATE TABLE table
(
id INT(11) PRIMARY KEY,
name VARCHAR(22) NOT NULL,
deptId INT(11) DEFAULT 1111,
salary FLOAT
);
1.2.6:自動增加
AUTO_INCREMENT 一個表只能一個字段使用AUTO_INCREMENT,並且使用這個約束的字段只能是整數類型(任意的整數類型 TINYINT,SMALLIN,INT,BIGINT),默認值是1,也就是說從1開始增加的。一般就是給主鍵使用的,自動增加,使每個主鍵的值度不一樣,並且不用我們自己管理,讓主鍵自己自動生成
CREATE TABLE table ( id INT(11) PRIMARY KEY AUTO_INCREMENT, name VARCHAR(22) NOT NULL );
2、查詢表結構
2.1、查看錶基本結構語句
格式1:DESCRIBE 表名/DESC 表名這兩個的功能是一樣的,簡寫了單詞describe
DESCRIBE student;
2.2、查看創建表的語句
格式:SHOW CREATE TABLE 表名
SHOW CREATE TABLE student;
這樣顯示的格式很不好,看不清楚,所以有了下面這個語句
格式:SHOW CREATE TABLE 表名\G
SHOW CREATE TABLE student\G;
3、修改數據表
修改數據表包括:對表中字段的增加、刪除、修改。 在這個裡面用的關鍵字為 ALTER
3.1、修改表名
格式:ALTER TABLE舊錶名 RENAME[TO]新表名;
將student表名改為student1(改完後在改回來)
ALTER TABLE student RENAME TO student1;
3.2、修改表中的字段名
格式:ALTER TABLE表名 CHANGE舊字段名新字段名新數據類型
將student表中的name字段名改為 username
ALTER TABLE student CHANGE name username VARCHAR(30);
3.3、修改表中的數據類型
格式:ALTER TABLE表名 MODIFY字段名數據類型
ALTER TABLE student MODIFY username VARCHAR(20);
解釋:只能修改字段名的數據類型,但是其原理跟上面change做的事情一樣,這裡也有修改字段名的過程,只不過修改後的字段名和修改前的字段名相同,但是數據類型不一樣。
3.4、修改字段的排列位置
方式1:ALTER TABLE表名 MODIFY字段1數據類型 FIRST|AFTER字段2
解釋:將字段1的位置放到第一,或者放到指定字段2的後面
ALTER TABLE student MODIFY username VARCHAR(20) AFTER age;
方式2:ALTER TABLE表名 CHANGE字段1字段2數據類型 FIRST|AFTER字段3
解釋:其實是一樣的,將是字段2覆蓋字段1,然後在進行排序
ALTER TABLE student CHANGE username username VARCHAR(20) AFTER age;
總結
CHANGE和MODIFY的區別?
原理都市一樣的,MODIFY只能修改數據類型,但是CHANGE能夠修改數據類型和字段名,也就是說MODIFY是CHANGE的更具體化的一個操作。可能覺得用CHANGE只改變一個數據類型不太爽,就增加了一個能直接改數據類型的使用關鍵字MODIFY來操作。
3.5、添加字段
格式:ALTER TABLE表名稱 ADD新字段名數據類型[約束條件][FIRST|AFTER已存在的表名]
解釋:在一個特定位置增加一個新的字段,如果不指定位置,默認是最後一個。
ALTER TABLE student ADD sex VARCHAR(11);
3.6、刪除字段
格式:ALTER TABLE表名稱 DROP字段名;
ALTER TABLE student DROP sex;
3.7、刪除表的外鍵約束
格式:ALTER TABLE表名稱 DROP FOREIGN KEY外鍵約束名
注意:外鍵約束名 指的不是被外鍵約束修飾的字段名,切記,而是我們在創建外鍵約束關係時取的名字。
3.8、更改表的存儲引擎
格式:ALTER TABLE表名 ENGINE=更改後的存儲引擎名
這個存儲引擎目前我自己也不太清楚,雖然知道有哪幾種引擎,但是稍微深入一點就不清楚了,所以打算留到日後在說。
4、刪除表
4.1、刪除無關聯表
格式:DROP TABLE表名;
ALTER TABLE student;
4.2、刪除被其他表關聯的主表
這個是比較重要的一點,在有外鍵關聯關係的兩張表中,如果刪除主表,那麼是刪不掉的,並且會報錯。因為有張表依賴於他。那怎麼辦呢?針對這種情況,總共有兩種方法
1、先刪除你子表,然後在刪除父表,這樣就達到了刪除父表的目的,但是子表也要被刪除
2、先解除外鍵關係,然後在刪除父表,這樣也能達到目的,並且保留了子表,只刪除我們不需要的父表。在3.7中就講解了如何刪除外鍵關係。
如何使用數據庫mysql
這很簡單啊!
在Windows下,假如你的MySQL裝在 D:\MySQL
就可以這樣:
先切換到它的bin目錄
cd D:\MySQL\bin\
D:\MySQL\binmysql -u root -p
接着輸入你的root密碼
接下來你就可以創建數據庫、創建用戶、創建修改表之類的操作(常用命令如下)。
查看現有數據庫
mysql show databases;
創建數據庫(假如數據庫名為 mydb)
mysql create database mydb;
刪除數據庫(假如數據庫名為 mydb)
mysql drop database accounts;
使用數據庫(假如使用數據庫 mydb)
mysql use mydb;
執行完使用數據庫命令後,就可以對該數據庫進行創建、修改、插入、刪除表等操作,這些表的操作命令你可以到網上找找,不是很難的。一個數據庫就相當於一個 Excel 文件,而表則相當於Excel文件的單元格,數據就是存放在表中。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/295814.html