溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

mysql數(shù)據(jù)庫的概述及基本操作

發(fā)布時間:2021-09-16 21:02:11 來源:億速云 閱讀:144 作者:chen 欄目:系統(tǒng)運(yùn)維

這篇文章主要講解了“mysql數(shù)據(jù)庫的概述及基本操作”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“mysql數(shù)據(jù)庫的概述及基本操作”吧!

一 概念

1 數(shù)據(jù)庫誕生和發(fā)展歷史

數(shù)據(jù)庫: 按照數(shù)據(jù)結(jié)構(gòu)來組織,存儲,管理數(shù)據(jù)的倉庫


誕生
計算機(jī)的發(fā)明是為了做科學(xué)計算的,而科學(xué)計算需要大量的數(shù)據(jù)輸入和輸出。
早期是通過打孔機(jī)和燈泡來表示數(shù)據(jù)的輸入和輸出。
后來,數(shù)據(jù)可以存儲在磁帶上,順序的讀,寫入磁帶
1956年IBM發(fā)明了磁盤驅(qū)動器,其支持了隨機(jī)訪問,不再是之前的順序訪問。
隨著信息時代的到來,有了硬件存儲技術(shù)的發(fā)展,有大量的數(shù)據(jù)需要存儲和管理,數(shù)據(jù)庫管理系統(tǒng)DBMS就誕生了。
不管使用什么存儲介質(zhì),數(shù)據(jù)庫的數(shù)據(jù)模型才是其核心和基礎(chǔ)。

2 早期數(shù)據(jù)庫分類

按照數(shù)據(jù)模型分類: 網(wǎng)狀數(shù)據(jù)庫,層次數(shù)據(jù)庫,關(guān)系型數(shù)據(jù)庫


1 層次數(shù)據(jù)庫

以樹形結(jié)構(gòu)表示實體之間的關(guān)聯(lián),關(guān)系只支持一對多,樹不能有交叉,代表數(shù)據(jù)庫有IBM 的 IMS

mysql數(shù)據(jù)庫的概述及基本操作


2 網(wǎng)狀數(shù)據(jù)庫

通用電氣最早在1964年開發(fā)出網(wǎng)狀數(shù)據(jù)庫IDS,只能運(yùn)行在GE自家的主機(jī)上

mysql數(shù)據(jù)庫的概述及基本操作

節(jié)點描述數(shù)據(jù),節(jié)點的聯(lián)系就是數(shù)據(jù)之間的關(guān)系

能夠直接描述客觀世界,可以表示實體鍵多種復(fù)雜關(guān)系,而這是層次數(shù)據(jù)庫無法做到的,比如,一個節(jié)點可以有多個父節(jié)點,節(jié)點之間可以支持多對多的關(guān)聯(lián)。


3 關(guān)系數(shù)據(jù)庫

使用行,列組成的二維表來組織數(shù)據(jù)和關(guān)系,表中行(記錄)即可描述數(shù)據(jù)實體。也可描述實體鍵的關(guān)系。

關(guān)系模型比網(wǎng)狀模型,層次模型更簡單,不需要關(guān)系數(shù)據(jù)存儲的物理細(xì)節(jié),專心于數(shù)據(jù)的邏輯構(gòu)建,而關(guān)系模型有論文的嚴(yán)格的數(shù)學(xué)理論基礎(chǔ)支持。


1970 年,IBM E.F.Codd發(fā)表了名為"A  Relational Model of Data for large Shared Data Banks"的論文,提出來關(guān)系模型的概念,奠定了關(guān)系模型的理論基礎(chǔ),關(guān)系模型,有嚴(yán)格的數(shù)據(jù)基礎(chǔ),抽象級別較高,簡單清晰,便于理解和使用。

基于關(guān)系模型構(gòu)建的數(shù)據(jù)庫成為RDBMS(Relational DataBase System)。

3 關(guān)系型數(shù)據(jù)庫發(fā)展歷史

1 Oracle 發(fā)展

Larry Ellison 在IBM的關(guān)系數(shù)據(jù)庫論文的基礎(chǔ)上,發(fā)展出通用商用的數(shù)據(jù)庫Orcale,1992年,Oracle7 才漸漸穩(wěn)定下來,并取得巨大成功,2001年的9i版本本廣泛應(yīng)用。

2009年4月20日,甲骨文公司宣布將以每股9.50美元,總計74億美元收購sun(計算機(jī)系統(tǒng))公司,2010年1月成功收購
2013 年,甲骨文超過IBM,成為繼微軟之后的第二大軟件公司


2 MySQL 發(fā)展

1985年幾個瑞典人為大型零售商項目設(shè)計了一種利用索引順序存取數(shù)據(jù)庫的軟件,這就是MyISAMd的前身,1996年。MySQL1.0 發(fā)布,隨后發(fā)布了3.11.1版本,并開始往其他平臺移植,200年MySQL采用GPL協(xié)議開源,MySQL4.0開始支持MyISAM,InnoDB存儲引擎,2005年10月,MySQL 5.0 稱為里程碑版本。
2008年1月被sun公司收購
2009年1月,在Oracle收購MySQL之前,Monty Wideniusa擔(dān)心收購,就從MySQL Server 5.5 開始一條存的GPL分支,起名為MariaDB
MySQL 的引擎是插件化的,可以支持很多引擎
MyISAM,不支持事務(wù),插入,查詢速度快
InnoDB,支持事物,行級鎖,MySQL 5.5 起的默認(rèn)引擎


3 NoSQL  
NoSQL 是對非SQL,非傳統(tǒng)關(guān)系型數(shù)據(jù)庫的統(tǒng)稱
NoSQL一詞誕生于1998年,2009年這個詞匯被再次提出指非關(guān)系型,分布式,不提供ACID的數(shù)據(jù)庫設(shè)計模式

隨著互聯(lián)網(wǎng)時代的到來,數(shù)據(jù)爆發(fā)式增長,數(shù)據(jù)庫技術(shù)發(fā)展日新月異,要適應(yīng)新的業(yè)務(wù)需求,隨著移動互聯(lián)網(wǎng),物聯(lián)網(wǎng)的到來,大數(shù)據(jù)的技術(shù)中NoSQL也同樣重要。

二 MySQL數(shù)據(jù)庫概述和SQL基本操作

1 MySQL數(shù)據(jù)庫概述

MySQL數(shù)據(jù)庫是一種關(guān)系型數(shù)據(jù)庫管理軟件,支持網(wǎng)絡(luò)訪問,默認(rèn)端口是3306

MySQL通信使用的是mysql協(xié)議

MySQL的底層是基于TCP協(xié)議的。因為UDP會丟包,而數(shù)據(jù)庫的數(shù)據(jù)是絕對不能丟包的。

2 SQL

1 概述

SQL 是結(jié)構(gòu)化查詢語言Structured Query Language,1987年被ISO組織標(biāo)準(zhǔn)化,所有主流的關(guān)系型數(shù)據(jù)庫都支持SQL,NoSQL也有很大一部分支持SQL。


SQL 語句分為:

DDL : 數(shù)據(jù)定義語言,負(fù)責(zé)數(shù)據(jù)庫定義,數(shù)據(jù)庫對象定義。由CREATE,ALTER 和 DROP 三個語法組成


DML: 數(shù)據(jù)操作語言,負(fù)責(zé)對數(shù)據(jù)庫對象的操作,CRUD增刪改查


DCL: 數(shù)據(jù)庫控制語言,負(fù)責(zé)對數(shù)據(jù)庫權(quán)限訪問控制,由GRANT 和 REVOKE 兩個指令組成


TCL : 事務(wù)控制語言,負(fù)責(zé)處理ACID事務(wù),支持commit,rollback 指令


SQL 語句對大寫不敏感,SQL語句的末尾應(yīng)該使用分號結(jié)束。

2 數(shù)據(jù)庫基本術(shù)語

1 PRIMARY KEY 主鍵

表中一列或多列組成唯一的key,.也就是通過這一個或多個列能唯一標(biāo)識一條記錄,主鍵的列不能有空,及不能有NULL,主鍵往往設(shè)置為整數(shù)類型,長整數(shù)類型型,且自增AUTO_INCREMENT,表中可以沒有主鍵,但是,一般的表設(shè)計中,都會包含主鍵。


主鍵用過了不回頭,就算刪除了當(dāng)前主鍵的值,下一條插入語句也會從下一個數(shù)字進(jìn)行存儲。

2 索引 index

可以看做是一本大字典的目錄,為了快速檢索使用,空間換時間,顯著提升查詢效率,可以對一列或多列設(shè)定索引。


主鍵索引,主鍵會自動建立主鍵索引,主鍵本身就是為了快速定位唯一記錄的。


唯一索引,表中的索引列組成的索引必須唯一,但可以是空,非空值必須唯一,空值可以有多個


普通索引,沒有唯一性要求,就是構(gòu)建了一個字典目錄而已


索引也有副作用,能顯著提升查詢效率,但會導(dǎo)致插入和刪除效率低下。

3 約束 Constraint

UNIQUE 約束(唯一鍵約束)
定義了唯一索引,就定義了唯一鍵約束


PRIMATY  KEY 約束
定義了主鍵,就定義了主鍵約束


外鍵約束 Foreign Key

外鍵: 在B表中的列,關(guān)鍵A表中的主鍵,B表中的列就是外鍵
如果在表B中插入一條數(shù)據(jù),B中的外鍵插入一個值,這個值必須在表A中是存在的主鍵的值,修改表B的外鍵的值也是同樣的,外鍵對應(yīng)的值必須在表A的主鍵中存在

如果表A要刪除一條記錄。那么就等于刪除了一個主鍵,如果表B中引用了這個主鍵,就必須先刪除表B中引用這個主鍵的記錄,才能刪除表A中的記錄,否則會導(dǎo)致刪除失敗

修改表A的主鍵,由于主鍵唯一性,修改的主鍵相當(dāng)于插入新的主鍵,那么表B引用這個主鍵,將組織表A修改主鍵,必須刪除表B的相關(guān)記錄后,才能修改表A的主鍵。

外鍵約束,為了保證數(shù)據(jù)完整性,一致性,杜絕數(shù)據(jù)冗余,數(shù)據(jù)訛誤。

4 視圖

視圖,也成虛表,看起來像表,它是由查詢語句生成的,可以通過視圖進(jìn)行CRUD操作,

視圖的作用: 簡化操作,將復(fù)雜查詢SQL語句定義為視圖,可以簡化查詢
數(shù)據(jù)安全,視圖可以只顯示真實表的部分列,或計算后的結(jié)果,隱藏真實表的數(shù)據(jù)。

3  MySQL中的數(shù)據(jù)類型

類型含義
tinyint1 字節(jié),帶符號的范圍是-128到127,無符號的范圍是0到255,bool或boolenan,就是tinyint,0 表示假,非0表示真
smaillint2 字節(jié),帶符號的返回為-32768到32767,無符號是0到65535
int整數(shù)類型,4字節(jié),同integer,帶符號的范圍是-2147483648到2147483647,無符號的范圍是0到4294967295
bigint長整數(shù)類型,8 字節(jié),帶符號的范圍是-9223372036854775808到9223372036854775807,無符號數(shù)是0到18446744073709551615
float單精度浮點數(shù)精確到大約7位小數(shù)
dobule雙精度浮點數(shù)精確到大約15位小數(shù)
DATE日期。支持的范圍是1000-01-01到9999-12-31
DATETIME支持的范圍是 1000-01-01 00:00:00 9999-12-31 23:59:59
TIMESTAMP時間戳。范圍是'1970-01-01 00:00:00' 到 2037年
char(M)固定長度,右邊填充空格已達(dá)到長度要求,M為長度,返回為0-255,M值的是字符個數(shù)
varchar(M)變長字符串,M表示最大列長度,M的范圍是0到65535,但不能突破行最大字節(jié)數(shù) 65535
text大文本,最大長度為 65535(2^16-1)個字符
BLOB大字節(jié),最大長度為 65535(2^16-1)字節(jié)的BLOB列

LENGTH 函數(shù)返回字節(jié)數(shù),而char 和varchar 定義的M是字符數(shù)限制

char 可以將字符串變成等長,空間換時間,效率略高,varchar變長,節(jié)省了空間。

4 MySQL 操作基本語言

1  DCL

GRANT  授權(quán) REVOKE 撤銷

GRANT  ALL  ON  *.*  TO  admin@localhost  IDENTIFIED  BY  'Admin@Roo123';

參數(shù)說明:

其中 ALL,代表授予所有權(quán)限,當(dāng)然可以單獨(dú)授予 SELECT,DELETE,UPDATE等權(quán)限
ON 后面的*.* 表示庫和表,如test.*,則表示test庫中的所有表,test.test則表示test庫中的test表,

TO 后面的admin 表示用戶名 @  后面的localhost表示本地授權(quán)登錄,當(dāng)然可以使用'%'表示所有都可登錄,

IDENTIFIED  BY 后面的表示密碼.

使用此命令即可登錄成功

mysql  -uadmin  -pAdmin@Roo123

REVOKE 撤銷權(quán)限

 REVOKE ALL  ON *.*  FROM  admin@localhost;

參數(shù)說明:

此中的ALL 也是所有的權(quán)限,也可以撤銷部分權(quán)限,如SELECT,DELETE等
ON 后面的和上述相同
FROM 后面的表示的是用戶名和允許登錄的范圍

登錄查詢

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)

其只能管理這個開放庫了

2 DDL

1  刪除用戶
 DROP USER admin@localhost;

此時將不能登錄

[root@python ~]# mysql  -uadmin  -pAdmin@Roo123
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'admin'@'localhost' (using password: YES)
2 創(chuàng)建數(shù)據(jù)庫

庫是數(shù)據(jù)的集合,所有數(shù)據(jù)按照數(shù)據(jù)模型組織在數(shù)據(jù)庫中

CREATE DATABASE IF NOT EXISTS  test CHARACTER SET utf8mb4  COLLATE  utf8mb4_general_ci;

CHARACTER SET 是指定字符集,utf8mb4 是utf8 的擴(kuò)展,支持4字節(jié)的utf8mb4,需要大于MySQL 5.5.3+
COLLATE 指定字符集的校對規(guī)則,用來做字符串的比較的。

刪除數(shù)據(jù)庫

DROP DATABASE  IF EXISTS test;

創(chuàng)建數(shù)據(jù)表

表分為行和列,MySQL是行存儲數(shù)據(jù),數(shù)據(jù)是一行行存儲的,列必須固定多少列。

行Row,也成為記錄Record,元祖
列 Column,也成為字段Field

CREATE TABLE `employees` (
  `emp_no` int(11) NOT NULL COMMENT '主鍵',
  `birth_date` date NOT NULL COMMENT '生日',
  `first_name` varchar(14) NOT NULL COMMENT '用戶-姓',
  `last_name` varchar(16) NOT NULL COMMENT '用戶-名',
  `gender` enum('M','F') NOT NULL COMMENT '性別',
  `hire_date` date NOT NULL COMMENT '入職時間',
  PRIMARY KEY (`emp_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

反引號標(biāo)注的名稱,被認(rèn)為是非關(guān)鍵字

不同數(shù)據(jù)類型占用字節(jié)數(shù)不同
數(shù)字范圍決定了存儲方式,小范圍整數(shù)使用字符串比較合適,大范圍整數(shù)則使用數(shù)字類型存儲比較合適。

NOT NULL 不能為空

定義字段完成后定義約束,如上述的PRIMARY KEY (emp_no) 則被稱為主鍵約束

3 DESC 查詢列信息
mysql> DESC employees;
+------------+---------------+------+-----+---------+-------+
| Field      | Type          | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| emp_no     | int(11)       | NO   | PRI | NULL    |       |
| birth_date | date          | NO   |     | NULL    |       |
| first_name | varchar(14)   | NO   |     | NULL    |       |
| last_name  | varchar(16)   | NO   |     | NULL    |       |
| gender     | enum('M','F') | NO   |     | NULL    |       |
| hire_date  | date          | NO   |     | NULL    |       |
+------------+---------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

mysql> DESC employees  '%name';
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| first_name | varchar(14) | NO   |     | NULL    |       |
| last_name  | varchar(16) | NO   |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
4 Navicat premium 基本設(shè)計表原則

設(shè)計一個登陸表


1  基本上必須有主鍵,且必須是無符號的自增序列
2  loginname 必須不能為空,若為空,則會出問題,password也不能為空
3 必須要有冗余字段,因為線上業(yè)務(wù)若正在運(yùn)行,則添加字段可能導(dǎo)致線上業(yè)務(wù)的中斷或用戶體驗相關(guān)的問題
4 必須設(shè)置索引,以加快select查詢速度

mysql數(shù)據(jù)庫的概述及基本操作

mysql數(shù)據(jù)庫的概述及基本操作

查看自動遞增數(shù)字

mysql數(shù)據(jù)庫的概述及基本操作

查看生成SQL

mysql數(shù)據(jù)庫的概述及基本操作

CREATE TABLE `login` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `loginname` varchar(48) NOT NULL COMMENT '登錄名',
  `username` varchar(48) DEFAULT NULL COMMENT '用戶名',
  `password` varchar(255) NOT NULL COMMENT '用戶密碼',
  `revered1` varchar(255) DEFAULT NULL,
  `revered2` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ln` (`loginname`) USING BTREE COMMENT '登錄名稱索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
5 SQL 導(dǎo)入

1 選擇表,右鍵選擇運(yùn)行SQL文件

mysql數(shù)據(jù)庫的概述及基本操作
mysql數(shù)據(jù)庫的概述及基本操作

工具創(chuàng)建視圖

mysql數(shù)據(jù)庫的概述及基本操作

選擇視圖和創(chuàng)建工具

mysql數(shù)據(jù)庫的概述及基本操作

將需要創(chuàng)建的視圖拉入框內(nèi),并選擇對應(yīng)的列來完成視圖的創(chuàng)建工作

mysql數(shù)據(jù)庫的概述及基本操作

保存

mysql數(shù)據(jù)庫的概述及基本操作

預(yù)覽

mysql數(shù)據(jù)庫的概述及基本操作

3 DML

1 關(guān)系操作

關(guān)系:在關(guān)系數(shù)據(jù)庫中,關(guān)系就是二維表

關(guān)系操作就是對表的操作

選擇 (select): 又稱為限制,是從關(guān)系中選擇出滿足給定條件的元祖
select * from  test where   id=1
投影(projection): 在關(guān)系上投影就是從選擇出若干屬性列組成新的關(guān)系
select name,password   from  test  where  id=1;# 此處相當(dāng)于投影,是按字段,按列進(jìn)行相關(guān)操作的
鏈接(join): 將不同的兩個關(guān)系鏈接成一個關(guān)系

2  insert 語句

INSERT  INTO  table_name(key1,key2...)  VALUES(vaule1,value2...);
向表中插入一行數(shù)據(jù),自增字段,缺省字段,可為空字段可以不寫

INSERT  INTO  table_name  SELECT  ...;

將SELECT 查詢的結(jié)果插入到表中

INSERT  INTO table_name(key1,key2,...) VALUES(value1,value2,...)  ON  DUPLICATE KEY  UPDATE  key1=value1...;

如果主鍵沖突,唯一鍵沖突就執(zhí)行update后面的設(shè)置,這條語句的意思是,主鍵不是在新增記錄,主鍵就在更新部分字段。

INSERT  IGNORE INTO table_name(key1,key2,...)  VALUES(value1,value2,...);

如果主鍵沖突,唯一鍵沖突就忽略錯誤,返回一個警告,并回滾。

3 update 語句

UPDATE  [IGNORE]  table_name  SET  col_name1=expr1[,col_name2=expr2...]  [WHERE  where_defintion]    IGNORE(此處的含義和上述相同)

UPDATE  reg SET  name='1234'  WHERE  id=5

UPDATE 若不加where則會導(dǎo)致全部修改,某種情況下可能會導(dǎo)致嚴(yán)重的問題

4 delete 語句

DELETE  [IGNORE]  FROM table_name  [WHERE  where_defintion]
刪除符合條件的記錄

4 select語句

SELECT  [DISTINCT]  select_expr,...  [FROM  tanle_references]  [ WHERE  where_defintion]  [GROUP  BY  {col_name | expr | position}  [ASC | DESC],... [WITH ROLLUP]]  [HAVING where_definition]  [ORDER  BU  {col_name | expr | position}  [ ASC | DESC ],...]  [LIMIT  {[offset,]row_count | row_count  OFFSET offset}]  [FOR  UPDATE  | LOCK  IN SHARE  MODE]

中括號中代表可選
最后面的是排他鎖和共享鎖

FOR  UPDATE  會把進(jìn)行寫鎖定,這是排他鎖

1 簡單查詢
select 10/5;  # 算數(shù)計算
select now();  # 查詢當(dāng)前時間
select * from  employees;  # 查詢該表中的所有數(shù)據(jù)
2 字符串合并查詢

CONCAT(str1,str2,str3)

select  emp_no,last_name  from  employees;  # 只顯示兩列 
select  emp_no,CONCAT(last_name," ",last_name)  from  employees;  # 使用CONCAT() 將多個字符串進(jìn)行合并
3 AS 別名定義
select  emp_no  as  no,CONCAT(first_name," ",last_name)  as name  from  employees as  emp;
4 LIMIT 限定返回的條數(shù),常用于分頁
select * from  employees LIMIT  2;  # 顯示前兩行數(shù)據(jù) 

 select * from  employees LIMIT  2  offset  4; # 從第四行開始,顯示下面的兩行數(shù)據(jù),默認(rèn)是從第0行還是的,
 select * from  employees LIMIT  2,4;  # 此處表示偏移為2,顯示4行
5 where  字句
運(yùn)算符描述
=等于
<>不等于
>,<,>=,<=大于,小于,大于等于,小于等于
BETWEEN在某個范圍之間,between a and  b   等價與 [a,b] a到b的閉區(qū)間
LIKE字符串模式匹配,% 表示任意多個字符,_表示一個字符
IN指定針對某列的多個可能值
AND
OR

注意: 如果很多表達(dá)式需要使用AND,OR 計算邏輯表達(dá)式的值時,由于有結(jié)合律的問題,建議使用小括號來避免產(chǎn)生錯誤。

 SELECT  * from  employees  WHERE emp_no  < 10015  and  last_name  like  'P%';

 SELECT  * from employees   WHERE  emp_no  BETWEEN  10010  AND  10015  AND  last_name  like  'P%';

 SELECT  *  from  employees  WHERE  emp_no  in  (10001,10002,10010);
6 Order  BY 字句

對查詢結(jié)果進(jìn)行排序,可以是升序,降序 DESC ,默認(rèn)是升序

SELECT  *  from  employees  ORDER BY  emp_no DESC ;

SELECT  *  from  employees  ORDER BY  gender,emp_no;

SELECT  *  from  employees  ORDER BY  emp_no  desc,gender;   # 一個降,另一個升
7  DISINCT 不返回重復(fù)記錄
select   DISTINCT dept_no from  dept_emp;
select   DISTINCT dept_no,emp_no  from  dept_emp;  # 兩個聯(lián)合不重復(fù)
8 聚合數(shù)據(jù)
函數(shù)描述
COUNT(expr)    返回記錄中的數(shù)目,如果指定列,則返回非NULL的行數(shù)
COUNT(DISTINCT expr,[expr...])返回不重復(fù)的非NULL 值的行數(shù)
AVG([DISTINCT expr])返回平均值,返回不同值的平均值
MAX(expr),MIN(expr)最大最,最小值
SUM([DISTINCT] expr)求和,DISTINCT 返回不同值的求和
SELECT  COUNT(DISTINCT emp_no),AVG(emp_no),MAX(emp_no),MIN(emp_no),SUM(emp_no)  from      employees;

SELECT  COUNT(DISTINCT emp_no),AVG(emp_no),MAX(emp_no),MIN(emp_no),SUM(emp_no)  from      employees  WHERE emp_no>10025;
9 分組查詢

使用 GROUP BY 字句,如果有條件,使用Having子句過濾分組,聚合過的結(jié)果。默認(rèn)聚合后只顯示第一個。

-- 簡單的分組查詢
SELECT  COUNT(*),sum(salary) FROM  test.salaries  GROUP  BY  emp_no;  

-- 聚合分組查詢,顯示兩個相同的部分

SELECT  emp_no,sum(salary),count(*),max(salary),min(salary)  from   test.salaries GROUP BY  emp_no,from_date;

SELECT  emp_no,sum(salary),count(*),max(salary),min(salary)  from   test.salaries GROUP BY  emp_no  HAVING  emp_no >10007;

結(jié)果如下

mysql數(shù)據(jù)庫的概述及基本操作

mysql數(shù)據(jù)庫的概述及基本操作

mysql數(shù)據(jù)庫的概述及基本操作

執(zhí)行順序:先是from后面的內(nèi)容,其次是where過濾,后面是group by 分組,后面是having過濾,最后是order  by 排序

10 子查詢

子查詢: 查詢語句可以嵌套,內(nèi)部查詢就是子查詢
子查詢必須在一組小括號中
子查詢中不能使用order by;

SELECT  * FROM  employees  WHERE emp_no  in (SELECT  emp_no FROM  employees  WHERE  emp_no>10020)  ORDER BY  emp_no;

SELECT  emp.emp_no,emp.first_name     FROM  (SELECT  * FROM employees  WHERE emp_no > 10010) AS emp  WHERE emp.emp_no < 10015  ORDER BY  emp_no  DESC;

-- IN后面跟單列是比較合適的,子查詢是有意義的,內(nèi)層選擇只需要對使用的字段進(jìn)行顯示即可
SELECT  *     FROM  employees  WHERE  emp_no  IN  (SELECT  emp_no    FROM  employees  WHERE  emp_no  > 10025 ) ORDER BY  emp_no  DESC 

-- 子查詢最好的使用方式
SELECT  * FROM  (SELECT  emp_no,first_name,gender  FROM  employees  WHERE emp_no > 10025)  AS emp   WHERE  emp.emp_no < 10030  ORDER BY emp_no Desc;
11 連接  join

連接 join
交叉連接 cross  join
笛卡爾乘積,全部交叉
在MySQL中,CROSS JOIN 從語法上和INNER JOIN 等同

1 交叉連接 CROSS JOIN ,及笛卡爾乘積,全部交叉
SELECT  * FROM  employees  CROSS  JOIN  dept_manager

每一個結(jié)果分別和另一個結(jié)果集的所有數(shù)據(jù)相乘得到的乘機(jī)。

此種連接在生產(chǎn)環(huán)境中基本上是被廢棄的,不用的

2  內(nèi)連接   inner  join ,省略為 join

等值連接,只選擇某些filed相等的元組(行),使用ON 限定關(guān)聯(lián)的結(jié)果
自然連接,特殊的等值連接,會過濾掉重復(fù)的行,用的少

等值連接

-- 此種方式由于沒有配置ON,因此其值和交叉連接結(jié)果相同
SELECT  * FROM  employees  INNER   JOIN  dept_manager;
-- 此處會選擇兩個表中相同字段相同部分呈現(xiàn)出來,并將兩張表中相同的字段重復(fù)顯示出來 
SELECT  * FROM  employees   JOIN  salaries  ON   employees.emp_no=salaries.emp_no

mysql數(shù)據(jù)庫的概述及基本操作

其只顯示等值的鏈接,對于在任何一張表中不存在的都不會顯示

自然連接

-- 此處會選擇兩個表中相同字段相同部分呈現(xiàn)出來,并去除兩張表中的相同字段的列,但某種情況下兩張表中的含義相同的字段并非名稱相同,因此不一定會使用到

SELECT  * FROM  employees  NATURAL JOIN  salaries;

mysql數(shù)據(jù)庫的概述及基本操作

3 外連接  outer  join

左外連接

左鏈接: 左表的所有行都得有,左表和右表對不上的行也是需要顯示的,右表中的數(shù)據(jù)有沒有無所謂。

SELECT * from  dept_emp  LEFT JOIN  departments   on  departments.dept_no=dept_emp.dept_no;

mysql數(shù)據(jù)庫的概述及基本操作

左表中加入了31號員工,未加入到任何部門,但在部門表中加入了管理部,此處未顯示。

默認(rèn)是以左表為主的,右表中的數(shù)據(jù)全不全無關(guān)

右外連接

右表中的40行在左表中全部都能找到,所以顯示的是全部,視角在右表

SELECT  * from  employees  RIGHT JOIN   salaries  on employees.emp_no=salaries.emp_no;

此處是等值關(guān)系,和具體的行沒有關(guān)系

mysql數(shù)據(jù)庫的概述及基本操作

此處未加入部門的31號員工也未出現(xiàn)在此表中。而管理部出現(xiàn)在詞表中

12 自連接

表自己和自己鏈接

SELECT  *  FROM employees  as  manager,employees as  worker  WHERE manager.emp_no=worker.emp_no  and worker.emp_no=10010;

SELECT  *  FROM employees   manager INNER JOIN   employees worker   ON manager.emp_no=worker.emp_no  WHERE  worker.emp_no=10010;

第一種方式寫著簡單,可以使用第一種方式進(jìn)行處理,若需要特別的左鏈接或右鏈接時建議使用第二種方式


通過查詢創(chuàng)建工具方式創(chuàng)建

mysql數(shù)據(jù)庫的概述及基本操作

三 MySQL事務(wù)

1  概述和屬性

1 概述

事務(wù)Transaction  
InnoDB 引擎,支持事務(wù)
事務(wù),由若干條語句組成,指的是要做的一系列操作。

2 屬性

關(guān)系型數(shù)據(jù)庫中支持事務(wù),必須支持其四種屬性(ACID)

特性描述
原子性(atomicity)一個事務(wù)是不可分割的工作單位,事務(wù)中包括所有操作要么全部做完,要么什么都不做
一致性(consistency) 事務(wù)必須是使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另一個一致性狀態(tài),一致性與原子性是緊密相關(guān)的
隔離性(isolation)一個事務(wù)的執(zhí)行不能被其他事務(wù)干擾,及一個事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對并發(fā)的其他事務(wù)是隔離的,并發(fā)執(zhí)行的各個事務(wù)之間不能互相干擾
持久性(durability)持久性也成為永久性(permanence),指一個事務(wù)一旦提交,它對數(shù)據(jù)庫中的數(shù)據(jù)改變也就應(yīng)該是永久性的,接下來的其他操作或者故障不應(yīng)該對其有任何影響

3 具體理解

原子性: 要求事務(wù)中所有的操作,不可分割,不能做了一部分操作,剩下一部分操作。


一致性:多個事務(wù)并行執(zhí)行的結(jié)果,應(yīng)該和事務(wù)排隊執(zhí)行的結(jié)果一致,如果事務(wù)的并發(fā)執(zhí)行和多線程讀寫共享資源一樣不可預(yù)期,就不能保證一致性


隔離性:多個事務(wù)訪問共享的數(shù)據(jù)了,應(yīng)該互相不干擾,隔離性,指的是究竟在一個事務(wù)處理期間,其他事務(wù)能不能訪問的問題


持久性:較好的理解,就是事務(wù)提交后,數(shù)據(jù)不能丟失。

2 事務(wù)的隔離級別

1  隔離性不好帶來的問題

1 更新丟失 lost update

事務(wù)A 和事務(wù)B,更新同一個數(shù)據(jù),都讀取了初始值100,A要減10,B要加100,A減去10之后是90,B加100后是200,若A先寫入,則B讀取到的是100,而實際的結(jié)果已經(jīng)是90了,而B使用100計算的結(jié)果是200,則此時便覆蓋了A的90,將原本的190變成了200.

2 臟讀 (讀取到了中間狀態(tài))

事務(wù)A和事務(wù)B,事務(wù)B讀取到事務(wù)A未提交的數(shù)據(jù)(這個數(shù)據(jù)可能是一個中間值,也可能是事物A回滾的值),只要讀取到了這個被修改的數(shù)據(jù)就是臟讀,只要沒有提交,就是沒有落地,就是臟數(shù)據(jù),若中間出現(xiàn)了狀態(tài),回滾,則這個中間狀態(tài)的數(shù)據(jù)也是臟數(shù)據(jù)。

3 不可重復(fù)讀 (unrepeatable read)  同一條記錄的修改

事務(wù)A 在同一個事務(wù)中執(zhí)行了相同兩次的查詢語句,得到了不同的結(jié)果,不能保證同一條查詢語句重復(fù)讀相同的結(jié)果就是不可重復(fù)讀。

例如: 事務(wù)A查詢了一次后,事務(wù)B修改了數(shù)據(jù),事務(wù)A又查詢了一次,發(fā)現(xiàn)數(shù)據(jù)不一致了。

注意: 臟讀是可以讀取到相同的數(shù)據(jù),但是讀取到的是一個未提交的數(shù)據(jù),不是提交的最終結(jié)果

4 幻讀(phantom read) (增加了數(shù)據(jù)的不可重復(fù)讀)

事務(wù)A中同一個查詢要進(jìn)行多次,事務(wù)B插入的數(shù)據(jù),導(dǎo)致A返回不同的結(jié)果集,如同幻覺,就是幻讀
數(shù)據(jù)集有記錄增加了,可以看做是增加了記錄的不可重復(fù)度

2 事務(wù)的隔離級別

針對上述問題,提出了4中事務(wù)的隔離級別,如下

隔離級別描述
READ  UNCOMMITTED讀取到未提交的數(shù)據(jù)
READ COMMITTED讀已經(jīng)提交的數(shù)據(jù)
REPEATABLE READ可重復(fù)讀,MySQL的默認(rèn)隔離級別
SERIALIZABLE可串行化,事務(wù)鍵完全隔離,事務(wù)不能并發(fā),只能串行化執(zhí)行

隔離級別越高,串行化越高,數(shù)據(jù)庫執(zhí)行效率越低,隔離級別越低,并行度越高,性能越高

隔離級別越高,當(dāng)前事物處理的中間結(jié)果對其他事務(wù)不可見程度越高,

SERIALIZABLE:串行化能解決所有問題,但帶來的確是效率極其低下。

REPEATABLE READ:事務(wù)A中同一條查詢語句返回同樣的結(jié)果,就是可以重復(fù)復(fù)讀取數(shù)據(jù)了,解決的方式有:
1 對select的數(shù)據(jù)加鎖,不允許其他事務(wù)刪除,修改操作
2 第一次select的時候,對最后一次確切提交的事務(wù)的結(jié)果進(jìn)行快照
但上述方式不能解決幻讀

READ  COMMITTED:在事務(wù)中,每次select可以讀取到別的事務(wù)剛提交成功的數(shù)據(jù),因為讀到的是提交后的數(shù)據(jù),解決了臟讀,但是不能解決不可重復(fù)讀的問題

READ  UNCOMMITTED:能讀取到別的事務(wù)還沒有提交的數(shù)據(jù),完全沒有隔離性可言,出現(xiàn)了臟讀

3 設(shè)置會話或者全局的隔離級別
-- 設(shè)置全局或會話級別的隔離級別
SET  [SESSION | GLOBAL ] TRANSACTION  ISOLATION  LEVEL    {READ  UNCOMMITTED | READ COMMITTED | REPEATABLE READ |  SERIALIZABLE } 

-- 查詢隔離級別 
SELECT  @@global.tx_isolation;
SELECT  @@tx_isolation;
4 事務(wù)語法

START TRANSACTION 或 BEGIN 開始一個事務(wù),START TRANSACTION 是標(biāo)準(zhǔn)的SQL的語法


使用COMMIT提交事務(wù)后,變更成永久變更。


ROLLBACK 可以在提交事務(wù)之前,回滾變更,事務(wù)中的操作就如同沒有發(fā)生過一樣


SET AUTOCOMMIT 語句可以禁用或啟用默認(rèn)的autocommit模式,用于當(dāng)前鏈接,SET AUTOCOMMIT=0 表示禁用自動提交事務(wù),如果開啟自動提交,如果有一個修改表的語句執(zhí)行后,會立即把更新存儲到磁盤上。


開發(fā)過程中自動提交一般都是關(guān)閉的,一般的是一次提交多次修改的值。

測試重復(fù)讀

新建一張表,如下

CREATE TABLE `t` (
  `id` int(11) DEFAULT NULL,
  `username` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
mysql> desc  t;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id       | int(11)      | YES  |     | NULL    |       |
| username | varchar(255) | YES  |     | NULL    |       |
| password | varchar(255) | YES  |     | NULL    |       |
+----------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

查看事務(wù)的隔離級別

mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)

在窗口1關(guān)閉自動提交

mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

在窗口1 查詢t表中內(nèi)容

mysql> select  * from  t;
Empty set (0.00 sec)

在窗口2中直接進(jìn)行插入操作并查看

mysql> insert  into  t value(1,'admin','admin');
Query OK, 1 row affected (0.00 sec)

mysql> select  * from  t;
+------+----------+----------+
| id   | username | password |
+------+----------+----------+
|    1 | admin    | admin    |
+------+----------+----------+
1 row in set (0.00 sec)

在窗口1 中再次查詢,無結(jié)果,再次進(jìn)行提交后查詢,則產(chǎn)生了結(jié)果,此處表明解決了重復(fù)讀問題。

mysql> select  * from  t;
Empty set (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> select  * from  t;
+------+----------+----------+
| id   | username | password |
+------+----------+----------+
|    1 | admin    | admin    |
+------+----------+----------+
1 row in set (0.00 sec)
讀已提交測試

修改窗口1 的級別為讀提交,并提交此次修改

mysql>  set session  transaction isolation level  read committed;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| READ-COMMITTED |
+----------------+
1 row in set (0.00 sec)

mysql> commit; 
Query OK, 0 rows affected (0.00 sec)

在窗口2 進(jìn)行插入

mysql> insert  into  t value(2,'root','root');
Query OK, 1 row affected (0.00 sec)

mysql> select  * from  t;
+------+----------+----------+
| id   | username | password |
+------+----------+----------+
|    1 | admin    | admin    |
|    2 | root     | root     |
+------+----------+----------+
2 rows in set (0.00 sec)

在窗口1 進(jìn)行查看,修改提交的數(shù)據(jù)可以看到,此處表明修改成讀提交成功

mysql> select  * from  t;
+------+----------+----------+
| id   | username | password |
+------+----------+----------+
|    1 | admin    | admin    |
|    2 | root     | root     |
+------+----------+----------+
2 rows in set (0.00 sec)

3 其他屬性

1  數(shù)據(jù)倉庫和數(shù)據(jù)庫的區(qū)別

本質(zhì)上說沒有區(qū)別,都是存放數(shù)據(jù)的得房,但是數(shù)據(jù)庫關(guān)注的是數(shù)據(jù)的持久化,數(shù)據(jù)的關(guān)系,為業(yè)務(wù)提供系統(tǒng)支持,事務(wù)支持,數(shù)據(jù)倉庫存儲數(shù)據(jù)是為了分析或者發(fā)掘而設(shè)計的表結(jié)構(gòu),可以存儲海量數(shù)。

數(shù)據(jù)庫存儲在線交易數(shù)據(jù)OLTP;數(shù)據(jù)倉庫存儲歷史數(shù)據(jù)用于分析OLAP。
數(shù)據(jù)庫支持在線業(yè)務(wù),需要頻繁增刪改查,數(shù)據(jù)倉庫一般囤積歷史數(shù)據(jù)支持用于分析的SQL,一般不建議刪改。

2 游標(biāo)

操作查詢的結(jié)果集的一種方法
可以將游標(biāo)當(dāng)做是一個指針,指向結(jié)果集中的某一行。

3 存儲過程,觸發(fā)器

存儲過程(Stored  Procedure),數(shù)據(jù)庫系統(tǒng)中,一段完成特定功能的SQL語句,編寫成類似函數(shù)的方式,可以傳遞參數(shù)并調(diào)用,支持流程控制語句。

觸發(fā)器(Tirgger),由事件觸發(fā)的特殊的存儲過程,例如insert時數(shù)據(jù)觸發(fā)

觸發(fā)器雖然功能強(qiáng)大,但基本很少使用了

感謝各位的閱讀,以上就是“mysql數(shù)據(jù)庫的概述及基本操作”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對mysql數(shù)據(jù)庫的概述及基本操作這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI