日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL(笔记)

發(fā)布時(shí)間:2023/12/3 数据库 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL(笔记) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

數(shù)據(jù)庫總覽

有時(shí)候查的數(shù)據(jù)錯(cuò)亂,可以重啟MySQL

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

  • MySQL , Oracle , SQL Server , SQLite , DB2 , …
  • 關(guān)系型數(shù)據(jù)庫通過外鍵關(guān)聯(lián)來建立表與表之間的關(guān)系

非關(guān)系型數(shù)據(jù)庫 ( NOSQL )not only

  • Redis , MongoDB , …
  • 非關(guān)系型數(shù)據(jù)庫通常指數(shù)據(jù)以對(duì)象的形式存儲(chǔ)在數(shù)據(jù)庫中,而對(duì)象之間的關(guān)系通過每個(gè)對(duì)象自身的屬性來決定

DBMS

數(shù)據(jù)庫管理系統(tǒng) ( DataBase Management System )

數(shù)據(jù)庫管理軟件 , 科學(xué)組織和存儲(chǔ)數(shù)據(jù) , 高效地獲取和維護(hù)數(shù)據(jù)

MySQL應(yīng)該算是一個(gè)數(shù)據(jù)庫管理系統(tǒng).

特點(diǎn) :

  • 免費(fèi) , 開源數(shù)據(jù)庫
  • 小巧 , 功能齊全
  • 使用便捷
  • 可運(yùn)行于Windows或Linux操作系統(tǒng)
  • 可適用于中小型甚至大型網(wǎng)站應(yīng)用

官網(wǎng) : https://www.mysql.com/

安裝步驟

1、下載后得到zip壓縮包.

2、解壓到自己想要安裝到的目錄,本人解壓到的是D:\Environment\mysql-5.7.19

3、添加環(huán)境變量:我的電腦->屬性->高級(jí)->環(huán)境變量

選擇PATH,在其后面添加: 你的mysql 安裝文件下面的bin文件夾

4、編輯 my.ini 文件 ,注意替換路徑位置

[mysqld] basedir=D:\Program Files\mysql-5.7\ datadir=D:\Program Files\mysql-5.7\data\ port=3306 skip-grant-tables

5、啟動(dòng)管理員模式下的CMD,并將路徑切換至mysql下的bin目錄(cd /d D:\Environment\mysql-5.7.19\bin),然后輸入mysqld –install (安裝mysql)

6、再輸入 mysqld --initialize-insecure --user=mysql 初始化數(shù)據(jù)文件

7、然后再次啟動(dòng)mysql 然后用命令 mysql –u root –p 進(jìn)入mysql管理界面(密碼可為空)p后面不加空格

8、進(jìn)入界面后更改root密碼(sql語句后面有空格)

update mysql.user set authentication_string=password('123456') where user='root'and Host = 'localhost';

9、刷新權(quán)限

flush privileges;

10、修改 my.ini文件刪除最后一句skip-grant-tables

11、重啟mysql即可正常使用

net stop mysql net start mysql

12、連接上測試出現(xiàn)以下結(jié)果就安裝好了

如果您以前裝過,現(xiàn)在需要重裝,一定要將環(huán)境清理干凈 .

這里給大家推薦一個(gè)工具 : SQLyog .

即便有了可視化工具,可是基本的DOS命名大家還是要記住!

SQLyog

可手動(dòng)操作,管理MySQL數(shù)據(jù)庫的軟件工具

特點(diǎn) : 簡潔 , 易用 , 圖形化

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-gNNjCVDJ-1609080184712)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201226134545862.png)]

連接數(shù)據(jù)庫(命令行)

打開MySQL命令窗口

  • 在DOS命令行窗口進(jìn)入 安裝目錄\mysql\bin
  • 可設(shè)置環(huán)境變量,設(shè)置了環(huán)境變量,可以在任意目錄打開!

連接數(shù)據(jù)庫語句 : mysql -h 服務(wù)器主機(jī)地址 -u 用戶名 -p 用戶密碼

注意 : -p后面不能加空格,否則會(huì)被當(dāng)做密碼的內(nèi)容,導(dǎo)致登錄失敗 !

幾個(gè)基本的數(shù)據(jù)庫操作命令 :

Ctrl加C強(qiáng)行終止

– 表示注釋或#

/**/多行注釋

update user set password=password('123456')where user='root'; 修改密碼 flush privileges; 刷新數(shù)據(jù)庫 show databases; 顯示所有數(shù)據(jù)庫 use dbname;打開某個(gè)數(shù)據(jù)庫 show tables; 顯示數(shù)據(jù)庫mysql中所有的表 describe user; 顯示表mysql數(shù)據(jù)庫中user表的列信息 create database name; 創(chuàng)建數(shù)據(jù)庫 use databasename; 選擇數(shù)據(jù)庫exit; 退出Mysql ? 命令關(guān)鍵詞 : 尋求幫助 -- 表示注釋

結(jié)構(gòu)化查詢語句分類

數(shù)據(jù)庫操作

mysql不區(qū)分大小寫

命令行操作數(shù)據(jù)庫

創(chuàng)建數(shù)據(jù)庫 : create database [if not exists] 數(shù)據(jù)庫名;

刪除數(shù)據(jù)庫 : drop database [if exists] 數(shù)據(jù)庫名;

查看數(shù)據(jù)庫 : show databases;

使用數(shù)據(jù)庫 : use 數(shù)據(jù)庫名; 說明 : 反引號(hào)用于區(qū)別MySQL保留字與普通字符而引入的 (鍵盤esc下面的鍵).

對(duì)比工具操作數(shù)據(jù)庫

學(xué)習(xí)方法:

  • 對(duì)照SQLyog工具自動(dòng)生成的語句學(xué)習(xí)
  • 固定語法中的單詞需要記憶

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

屬于DDL的一種,語法 :

create table [if not exists] `表名`('字段名1' 列類型 [屬性][索引][注釋],'字段名2' 列類型 [屬性][索引][注釋],#...'字段名n' 列類型 [屬性][索引][注釋] )[表類型][表字符集][注釋];

說明 : 反引號(hào)用于區(qū)別MySQL保留字與普通字符而引入的 (鍵盤esc下面的鍵).

數(shù)據(jù)值和列類型

列類型 : 規(guī)定數(shù)據(jù)庫中該列存放的數(shù)據(jù)類型

數(shù)值類型

字符串類型

日期和時(shí)間型數(shù)值類型

NULL值

  • 理解為 “沒有值” 或 “未知值”
  • 不要用NULL進(jìn)行算術(shù)運(yùn)算 , 結(jié)果仍為NULL

數(shù)據(jù)字段屬性

UnSigned

  • 無符號(hào)的
  • 聲明該數(shù)據(jù)列不允許負(fù)數(shù) .

ZEROFILL

  • 0填充的
  • 不足位數(shù)的用0來填充 , 如int(3),5則為005

Auto_InCrement

  • 自動(dòng)增長的 , 每添加一條數(shù)據(jù) , 自動(dòng)在上一個(gè)記錄數(shù)上加 1(默認(rèn))

  • 通常用于設(shè)置主鍵 , 且為整數(shù)類型

  • 可定義起始值和步長

    • 當(dāng)前表設(shè)置步長(AUTO_INCREMENT=100) : 只影響當(dāng)前表
    • SET @@auto_increment_increment=5 ; 影響所有使用自增的表(全局)

NULL 和 NOT NULL

  • 默認(rèn)為NULL , 即沒有插入該列的數(shù)值
  • 如果設(shè)置為NOT NULL , 則該列必須有值

DEFAULT

  • 默認(rèn)的
  • 用于設(shè)置默認(rèn)值
  • 例如,性別字段,默認(rèn)為"男" , 否則為 “女” ; 若無指定該列的值 , 則默認(rèn)值為"男"的值
-- 目標(biāo) : 創(chuàng)建一個(gè)school數(shù)據(jù)庫 -- 創(chuàng)建學(xué)生表(列,字段) -- 學(xué)號(hào)int 登錄密碼varchar(20) 姓名,性別varchar(2),出生日期(datatime),家庭住址,email -- 創(chuàng)建表之前 , 一定要先選擇數(shù)據(jù)庫 --字符串使用 單引號(hào)括起來! --所有的語句后面加 , (英文的),最后一個(gè)不加 --primary key主鍵,一般一個(gè)表只有一個(gè)唯一的主鍵! CREATE TABLE IF NOT EXISTS `student` ( `id` int(4) NOT NULL AUTO_INCREMENT COMMENT '學(xué)號(hào)', `name` varchar(30) NOT NULL DEFAULT '匿名' COMMENT '姓名', `pwd` varchar(20) NOT NULL DEFAULT '123456' COMMENT '密碼', `sex` varchar(2) NOT NULL DEFAULT '男' COMMENT '性別', `birthday` datetime DEFAULT NULL COMMENT '生日', `address` varchar(100) DEFAULT NULL COMMENT '地址', `email` varchar(50) DEFAULT NULL COMMENT '郵箱', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8

逆向操作

-- 查看數(shù)據(jù)庫的定義 SHOW CREATE DATABASE school; -- 查看數(shù)據(jù)表的定義 SHOW CREATE TABLE student; -- 顯示表結(jié)構(gòu) DESC student; -- 設(shè)置嚴(yán)格檢查模式(不能容錯(cuò)了)SET sql_mode='STRICT_TRANS_TABLES';

數(shù)據(jù)表的類型

設(shè)置數(shù)據(jù)表的類型

CREATE TABLE 表名(-- 省略一些代碼-- Mysql注釋-- 1. # 單行注釋-- 2. /*...*/ 多行注釋 )ENGINE = MyISAM (or InnoDB)-- 查看mysql所支持的引擎類型 (表類型) SHOW ENGINES;

MySQL的數(shù)據(jù)表的類型 : MyISAM , InnoDB , HEAP , BOB , CSV等…

常見的 MyISAM 與 InnoDB 類型:

經(jīng)驗(yàn) ( 適用場合 ) :

  • 適用 MyISAM : 節(jié)約空間及相應(yīng)速度
  • 適用 InnoDB : 安全性 , 事務(wù)處理及多用戶操作數(shù)據(jù)表

數(shù)據(jù)表的存儲(chǔ)位置

  • innoDB數(shù)據(jù)表以文件方式存放在磁盤中

包括表文件 , 數(shù)據(jù)文件 , 以及數(shù)據(jù)庫的選項(xiàng)文件

位置 : Mysql安裝目錄\data\下存放數(shù)據(jù)表 . 目錄名對(duì)應(yīng)數(shù)據(jù)庫名 , 該目錄下文件名對(duì)應(yīng)數(shù)據(jù)表 .

  • MYISAM
    * . frm – 表結(jié)構(gòu)定義文件

    . MYD – 數(shù)據(jù)文件 ( data )

    . MYI – 索引文件 ( index )

    InnoDB類型數(shù)據(jù)表只有一個(gè) *.frm文件 , 以及上一級(jí)目錄的ibdata1文件

    MyISAM類型數(shù)據(jù)表對(duì)應(yīng)三個(gè)文件 :

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-Ef9jNeI1-1609080184719)(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==)]

設(shè)置數(shù)據(jù)表字符集

我們可為數(shù)據(jù)庫,數(shù)據(jù)表,數(shù)據(jù)列設(shè)定不同的字符集,設(shè)定方法 :

  • 創(chuàng)建時(shí)通過命令來設(shè)置 , 如 : CREATE TABLE 表名()CHARSET = utf8;
  • 如無設(shè)定 , 則根據(jù)MySQL數(shù)據(jù)庫配置文件 my.ini 中的參數(shù)設(shè)定

修改數(shù)據(jù)庫

修改表 ( ALTER TABLE )

修改表名 :ALTER TABLE 舊表名 RENAME AS 新表名

添加字段 : ALTER TABLE 表名 ADD字段名 列屬性[屬性]

修改字段 :

  • ALTER TABLE 表名 MODIFY 字段名 列類型[屬性]–無法重命名
  • ALTER TABLE 表名 CHANGE 舊字段名 新字段名 列屬性[屬性]

刪除字段 : ALTER TABLE 表名 DROP 字段名

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

語法:DROP TABLE [IF EXISTS] 表名

  • IF EXISTS為可選 , 判斷是否存在該數(shù)據(jù)表
  • 如刪除不存在的數(shù)據(jù)表會(huì)拋出錯(cuò)誤

其他

1. 可用反引號(hào)(`)為標(biāo)識(shí)符(庫名、表名、字段名、索引、別名)包裹,以避免與關(guān)鍵字重名!中文也可以作為標(biāo)識(shí)符!2. 每個(gè)庫目錄存在一個(gè)保存當(dāng)前數(shù)據(jù)庫的選項(xiàng)文件db.opt。3. 注釋:單行注釋 # 注釋內(nèi)容多行注釋 /* 注釋內(nèi)容 */單行注釋 -- 注釋內(nèi)容 (標(biāo)準(zhǔn)SQL注釋風(fēng)格,要求雙破折號(hào)后加一空格符(空格、TAB、換行等))4. 模式通配符:_ 任意單個(gè)字符% 任意多個(gè)字符,甚至包括零字符單引號(hào)需要進(jìn)行轉(zhuǎn)義 \'5. CMD命令行內(nèi)的語句結(jié)束符可以為 ";", "\G", "\g",僅影響顯示結(jié)果。其他地方還是用分號(hào)結(jié)束。delimiter 可修改當(dāng)前對(duì)話的語句結(jié)束符。6. SQL對(duì)大小寫不敏感 (關(guān)鍵字)7. 清除已有語句:\c

數(shù)據(jù)管理

外鍵(了解即可)

外鍵概念

如果公共關(guān)鍵字在一個(gè)關(guān)系中是主關(guān)鍵字,那么這個(gè)公共關(guān)鍵字被稱為另一個(gè)關(guān)系的外鍵。由此可見,外鍵表示了兩個(gè)關(guān)系之間的相關(guān)聯(lián)系。以另一個(gè)關(guān)系的外鍵作主關(guān)鍵字的表被稱為主表,具有此外鍵的表被稱為主表的從表

在實(shí)際操作中,將一個(gè)表的值放入第二個(gè)表來表示關(guān)聯(lián),所使用的值是第一個(gè)表的主鍵值(在必要時(shí)可包括復(fù)合主鍵值)。此時(shí),第二個(gè)表中保存這些值的屬性稱為外鍵(foreign key)。

外鍵作用

保持?jǐn)?shù)據(jù)一致性完整性,主要目的是控制存儲(chǔ)在外鍵表中的數(shù)據(jù),約束。使兩張表形成關(guān)聯(lián),外鍵只能引用外表中的列的值或使用空值。

創(chuàng)建外鍵

建表時(shí)指定外鍵約束

-- 創(chuàng)建外鍵的方式一 : 創(chuàng)建子表同時(shí)創(chuàng)建外鍵-- 年級(jí)表 (id\年級(jí)名稱) CREATE TABLE `grade` ( `gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年級(jí)ID', `gradename` VARCHAR(50) NOT NULL COMMENT '年級(jí)名稱', PRIMARY KEY (`gradeid`) ) ENGINE=INNODB DEFAULT CHARSET=utf8-- 學(xué)生信息表 (學(xué)號(hào),姓名,性別,年級(jí),手機(jī),地址,出生日期,郵箱,身份證號(hào)) CREATE TABLE `student` ( `studentno` INT(4) NOT NULL COMMENT '學(xué)號(hào)', `studentname` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名', `sex` TINYINT(1) DEFAULT '1' COMMENT '性別', `gradeid` INT(10) DEFAULT NULL COMMENT '年級(jí)', `phoneNum` VARCHAR(50) NOT NULL COMMENT '手機(jī)', `address` VARCHAR(255) DEFAULT NULL COMMENT '地址', `borndate` DATETIME DEFAULT NULL COMMENT '生日', `email` VARCHAR(50) DEFAULT NULL COMMENT '郵箱', `idCard` VARCHAR(18) DEFAULT NULL COMMENT '身份證號(hào)', PRIMARY KEY (`studentno`),KEY `FK_gradeid` (`gradeid`), CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`)) ENGINE=INNODB DEFAULT CHARSET=utf8

建表后修改

-- 創(chuàng)建外鍵方式二 : 創(chuàng)建子表完畢后,修改子表添加外鍵 ALTER TABLE `student` ADD CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`);

刪除外鍵

操作:刪除 grade 表,發(fā)現(xiàn)報(bào)錯(cuò)

注意 : 刪除具有主外鍵關(guān)系的表時(shí) , 要先刪主表 , 后刪從表

-- 刪除外鍵 ALTER TABLE student DROP FOREIGN KEY FK_gradeid; -- 發(fā)現(xiàn)執(zhí)行完上面的,索引還在,所以還要?jiǎng)h除索引 -- 注:這個(gè)索引是建立外鍵的時(shí)候默認(rèn)生成的 ALTER TABLE student DROP INDEX FK_gradeid;

以上操作都是物理外鍵,數(shù)據(jù)庫級(jí)別的外鍵,我們不建議使用!(避免數(shù)據(jù)庫過多造成的困擾)

最佳實(shí)踐

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-rDss0UoF-1609080184722)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201226163359859.png)]

DML語言(INSERT ,UPDATE,DELETE)

數(shù)據(jù)庫意義 : 數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)管理

管理數(shù)據(jù)庫數(shù)據(jù)方法:

  • 通過SQLyog等管理工具管理數(shù)據(jù)庫數(shù)據(jù)
  • 通過DML語句管理數(shù)據(jù)庫數(shù)據(jù)

DML語言 :數(shù)據(jù)操作語言

  • 用于操作數(shù)據(jù)庫對(duì)象中所包含的數(shù)據(jù)

  • 包括 :

    • INSERT (添加數(shù)據(jù)語句)
    • UPDATE (更新數(shù)據(jù)語句)
    • DELETE (刪除數(shù)據(jù)語句)

添加數(shù)據(jù)

INSERT命令

語法:

INSERT INTO 表名[(字段1,字段2,字段3,...)] VALUES('值1','值2','值3')

注意 :

  • 字段或值之間用英文逗號(hào)隔開 .
  • ’ 字段1,字段2…’ 該部分可省略 , 但添加的值務(wù)必與表結(jié)構(gòu),數(shù)據(jù)列,順序相對(duì)應(yīng),且數(shù)量一致 .
  • 可同時(shí)插入多條數(shù)據(jù) , values 后用英文逗號(hào)隔開 .
-- 使用語句如何增加語句? -- 語法 : INSERT INTO 表名[(字段1,字段2,字段3,...)] VALUES('值1','值2','值3') INSERT INTO grade(gradename) VALUES ('大一');-- 主鍵自增,那能否省略呢? INSERT INTO grade VALUES ('大二');-- 查詢:INSERT INTO grade VALUE ('大二')錯(cuò)誤代碼:1136 Column count doesn`t match value count at row 1-- 結(jié)論:'字段1,字段2...'該部分可省略 , 但添加的值務(wù)必與表結(jié)構(gòu),數(shù)據(jù)列,順序相對(duì)應(yīng),且數(shù)量一致.-- 一次插入多條數(shù)據(jù) INSERT INTO grade(gradename) VALUES ('大三'),('大四');

修改數(shù)據(jù)

update命令

語法:

UPDATE 表名 SET column_name=value [,column_name2=value2,...] [WHERE condition];

注意 :

  • column_name 為要更改的數(shù)據(jù)列
  • value 為修改后的數(shù)據(jù) , 可以為變量 , 具體指 , 表達(dá)式或者嵌套的SELECT結(jié)果
  • condition 為篩選條件 , 如不指定則修改該表的所有列數(shù)據(jù)

where條件子句

可以簡單的理解為 : 有條件地從表中篩選數(shù)據(jù)

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-c5KRMooV-1609080184723)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201226165540032.png)]

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-2Hy3bLwA-1609080184724)(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==)]測試:

-- 修改年級(jí)信息 UPDATE grade SET gradename = '高中' WHERE gradeid = 1;

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

DELETE命令

語法:

DELETE FROM 表名 [WHERE condition];

注意:condition為篩選條件 , 如不指定則刪除該表的所有列數(shù)據(jù)

-- 刪除最后一個(gè)數(shù)據(jù) DELETE FROM grade WHERE gradeid = 5

TRUNCATE vs DELETE命令

作用:用于完全清空表數(shù)據(jù) , 但表結(jié)構(gòu) , 索引 , 約束等不變 ;

語法:

TRUNCATE [TABLE] table_name;-- 清空年級(jí)表 TRUNCATE grade

注意:區(qū)別于DELETE命令

  • 相同 : 都能刪除數(shù)據(jù) , 不刪除表結(jié)構(gòu) , 但TRUNCATE速度更快

  • 不同 :

    • 使用TRUNCATE TABLE 重新設(shè)置AUTO_INCREMENT計(jì)數(shù)器
    • 使用TRUNCATE TABLE不會(huì)對(duì)事務(wù)有影響 (事務(wù)后面會(huì)說)

測試:

-- 創(chuàng)建一個(gè)測試表 CREATE TABLE `test` ( `id` INT(4) NOT NULL AUTO_INCREMENT, `coll` VARCHAR(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8-- 插入幾個(gè)測試數(shù)據(jù) INSERT INTO test(coll) VALUES('row1'),('row2'),('row3');-- 刪除表數(shù)據(jù)(不帶where條件的delete) DELETE FROM test; -- 結(jié)論:如不指定Where則刪除該表的所有列數(shù)據(jù),自增當(dāng)前值依然從原來基礎(chǔ)上進(jìn)行,會(huì)記錄日志.-- 刪除表數(shù)據(jù)(truncate) TRUNCATE TABLE test; -- 結(jié)論:truncate刪除數(shù)據(jù),自增當(dāng)前值會(huì)恢復(fù)到初始值重新開始;不會(huì)記錄日志.

同樣使用DELETE清空不同引擎的數(shù)據(jù)庫表數(shù)據(jù).重啟數(shù)據(jù)庫服務(wù)后

  • InnoDB : 自增列從初始值重新開始 (因?yàn)槭谴鎯?chǔ)在內(nèi)存中,斷電即失)

  • MyISAM : 自增列依然從上一個(gè)自增數(shù)據(jù)基礎(chǔ)上開始 (存在文件中,不會(huì)丟失)

DQL語言(SELECT)

DQL( Data Query Language 數(shù)據(jù)查詢語言 )

  • 查詢數(shù)據(jù)庫數(shù)據(jù) , 如SELECT語句
  • 簡單的單表查詢或多表的復(fù)雜查詢和嵌套查詢
  • 是數(shù)據(jù)庫語言中最核心,最重要的語句
  • 使用頻率最高的語句

SELECT語法

SELECT [ALL | DISTINCT] {* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]} FROM table_name [as table_alias][left | right | inner join table_name2] -- 聯(lián)合查詢[WHERE ...] -- 指定結(jié)果需滿足的條件[GROUP BY ...] -- 指定結(jié)果按照哪幾個(gè)字段來分組[HAVING] -- 過濾分組的記錄必須滿足的次要條件[ORDER BY ...] -- 指定查詢記錄按一個(gè)或多個(gè)條件排序[LIMIT {[offset,]row_count | row_countOFFSET offset}];-- 指定查詢的記錄從哪條至哪條

注意 : [ ] 括號(hào)代表可選的 , { }括號(hào)代表必選得

指定查詢字段

-- 查詢表中所有的數(shù)據(jù)列結(jié)果 , 采用 **" \* "** 符號(hào); 但是效率低,不推薦 .-- 查詢所有學(xué)生信息 SELECT * FROM student;-- 查詢指定列(學(xué)號(hào) , 姓名) SELECT studentno,studentname FROM student;

AS 子句作為別名

作用:

  • 可給數(shù)據(jù)列取一個(gè)新 別名
  • 可給表取一個(gè)新別名
  • 可把經(jīng)計(jì)算或總結(jié)的結(jié)果用另一個(gè)新名稱來代替
-- 這里是為列取別名(當(dāng)然as關(guān)鍵詞可以省略) SELECT studentno AS 學(xué)號(hào),studentname AS 姓名 FROM student;-- 使用as也可以為表取別名 SELECT studentno AS 學(xué)號(hào),studentname AS 姓名 FROM student AS s;-- 使用as,為查詢結(jié)果取一個(gè)新名字 -- CONCAT()函數(shù)拼接字符串 SELECT CONCAT('姓名:',studentname) AS 新姓名 FROM student;

DISTINCT關(guān)鍵字的使用

作用 : 去掉SELECT查詢返回的記錄結(jié)果中重復(fù)的記錄 ( 返回所有列的值都相同 ) , 只返回一條

-- # 查看哪些同學(xué)參加了考試(學(xué)號(hào)) 去除重復(fù)項(xiàng) SELECT * FROM result; -- 查看考試成績 SELECT studentno FROM result; -- 查看哪些同學(xué)參加了考試 SELECT DISTINCT studentno FROM result; -- 了解:DISTINCT 去除重復(fù)項(xiàng) , (默認(rèn)是ALL)

使用表達(dá)式的列

數(shù)據(jù)庫中的表達(dá)式 : 一般由文本值 , 列值 , NULL , 函數(shù)和操作符等組成

應(yīng)用場景 :

  • SELECT語句返回結(jié)果列中使用

  • SELECT語句中的ORDER BY , HAVING等子句中使用

  • DML語句中的 where 條件語句中使用表達(dá)式

    -- selcet查詢中可以使用表達(dá)式 SELECT @@auto_increment_increment; -- 查詢自增步長 SELECT VERSION(); -- 查詢版本號(hào) SELECT 100*3-1 AS 計(jì)算結(jié)果; -- 表達(dá)式-- 學(xué)員考試成績集體提分一分查看 SELECT studentno,StudentResult+1 AS '提分后' FROM result;
  • 避免SQL返回結(jié)果中包含 ’ . ’ , ’ * ’ 和括號(hào)等干擾開發(fā)語言程序.

where條件語句

作用:用于檢索數(shù)據(jù)表中 符合條件 的記錄

搜索條件可由一個(gè)或多個(gè)邏輯表達(dá)式組成 , 結(jié)果一般為真或假.

邏輯操作符

測試

-- 滿足條件的查詢(where) SELECT Studentno,StudentResult FROM result;-- 查詢考試成績在95-100之間的 SELECT Studentno,StudentResult FROM result WHERE StudentResult>=95 AND StudentResult<=100;-- AND也可以寫成 && SELECT Studentno,StudentResult FROM result WHERE StudentResult>=95 && StudentResult<=100;-- 模糊查詢(對(duì)應(yīng)的詞:精確查詢) SELECT Studentno,StudentResult FROM result WHERE StudentResult BETWEEN 95 AND 100;-- 除了1000號(hào)同學(xué),要其他同學(xué)的成績 SELECT studentno,studentresult FROM result WHERE studentno!=1000;-- 使用NOT SELECT studentno,studentresult FROM result WHERE NOT studentno=1000;

模糊查詢 :比較操作符

注意:

  • 數(shù)值數(shù)據(jù)類型的記錄之間才能進(jìn)行算術(shù)運(yùn)算 ;
  • 相同數(shù)據(jù)類型的數(shù)據(jù)之間才能進(jìn)行比較 ;

測試:

-- 模糊查詢 between and \ like \ in \ null-- ============================================= -- LIKE -- ============================================= -- 查詢姓劉的同學(xué)的學(xué)號(hào)及姓名 -- like結(jié)合使用的通配符 : % (代表0到任意個(gè)字符) _ (一個(gè)字符) SELECT studentno,studentname FROM student WHERE studentname LIKE '劉%';-- 查詢姓劉的同學(xué),后面只有一個(gè)字的 SELECT studentno,studentname FROM student WHERE studentname LIKE '劉_';-- 查詢姓劉的同學(xué),后面只有兩個(gè)字的 SELECT studentno,studentname FROM student WHERE studentname LIKE '劉__';-- 查詢姓名中含有 嘉 字的 SELECT studentno,studentname FROM student WHERE studentname LIKE '%嘉%';-- 查詢姓名中含有特殊字符的需要使用轉(zhuǎn)義符號(hào) '\' -- 自定義轉(zhuǎn)義符關(guān)鍵字: ESCAPE ':'-- ============================================= -- IN具體的值 -- ============================================= -- 查詢學(xué)號(hào)為1000,1001,1002的學(xué)生姓名 SELECT studentno,studentname FROM student WHERE studentno IN (1000,1001,1002);-- 查詢地址在北京,南京,河南洛陽的學(xué)生 SELECT studentno,studentname,address FROM student WHERE address IN ('北京','南京','河南洛陽');-- ============================================= -- NULL 空 -- ============================================= -- 查詢出生日期沒有填寫的同學(xué) -- 不能直接寫=NULL , 這是代表錯(cuò)誤的 , 用 is null SELECT studentname FROM student WHERE BornDate IS NULL;-- 查詢出生日期填寫的同學(xué) SELECT studentname FROM student WHERE BornDate IS NOT NULL;-- 查詢沒有寫家庭住址的同學(xué)(空字符串不等于null) SELECT studentname FROM student WHERE Address='' OR Address IS NULL;

聯(lián)表查詢

JOIN 對(duì)比

七種Join:

測試

/* 連接查詢?nèi)缧枰鄰垟?shù)據(jù)表的數(shù)據(jù)進(jìn)行查詢,則可通過連接運(yùn)算符實(shí)現(xiàn)多個(gè)查詢 內(nèi)連接 inner join查詢兩個(gè)表中的結(jié)果集中的交集 外連接 outer join左外連接 left join(以左表作為基準(zhǔn),右邊表來一一匹配,匹配不上的,返回左表的記錄,右表以NULL填充)右外連接 right join(以右表作為基準(zhǔn),左邊表來一一匹配,匹配不上的,返回右表的記錄,左表以NULL填充)等值連接和非等值連接自連接 */-- 查詢參加了考試的同學(xué)信息(學(xué)號(hào),學(xué)生姓名,科目編號(hào),分?jǐn)?shù)) SELECT * FROM student; SELECT * FROM result;/*思路: (1):分析需求,確定查詢的列來源于兩個(gè)類,student result,連接查詢 (2):確定使用哪種連接查詢?(內(nèi)連接) */ SELECT s.studentno,studentname,subjectno,StudentResult FROM student s INNER JOIN result r ON r.studentno = s.studentno-- 右連接(也可實(shí)現(xiàn)) SELECT s.studentno,studentname,subjectno,StudentResult FROM student s RIGHT JOIN result r ON r.studentno = s.studentno-- 等值連接 SELECT s.studentno,studentname,subjectno,StudentResult FROM student s , result r WHERE r.studentno = s.studentno-- 左連接 (查詢了所有同學(xué),不考試的也會(huì)查出來) SELECT s.studentno,studentname,subjectno,StudentResult FROM student s LEFT JOIN result r ON r.studentno = s.studentno-- 查一下缺考的同學(xué)(左連接應(yīng)用場景) SELECT s.studentno,studentname,subjectno,StudentResult FROM student s LEFT JOIN result r ON r.studentno = s.studentno WHERE StudentResult IS NULL-- 思考題:查詢參加了考試的同學(xué)信息(學(xué)號(hào),學(xué)生姓名,科目名,分?jǐn)?shù)) SELECT s.studentno,studentname,subjectname,StudentResult FROM student INNER JOIN result r ON r.studentno = s.studentno INNER JOIN `subject` sub ON sub.subjectno = r.subjectno

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-Vn4wqiog-1609080184730)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201226192816849.png)]

自連接

/* 自連接數(shù)據(jù)表與自身進(jìn)行連接需求:從一個(gè)包含欄目ID , 欄目名稱和父欄目ID的表中查詢父欄目名稱和其他子欄目名稱 */-- 創(chuàng)建一個(gè)表 CREATE TABLE `category` ( `categoryid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主題id', `pid` INT(10) NOT NULL COMMENT '父id', `categoryName` VARCHAR(50) NOT NULL COMMENT '主題名字', PRIMARY KEY (`categoryid`) ) ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8-- 插入數(shù)據(jù) INSERT INTO `category` (`categoryid`, `pid`, `categoryName`) VALUES('2','1','信息技術(shù)'), ('3','1','軟件開發(fā)'), ('4','3','數(shù)據(jù)庫'), ('5','1','美術(shù)設(shè)計(jì)'), ('6','3','web開發(fā)'), ('7','5','ps技術(shù)'), ('8','2','辦公信息');-- 編寫SQL語句,將欄目的父子關(guān)系呈現(xiàn)出來 (父欄目名稱,子欄目名稱) -- 核心思想:把一張表看成兩張一模一樣的表,然后將這兩張表連接查詢(自連接) SELECT a.categoryName AS '父欄目',b.categoryName AS '子欄目' FROM category AS a,category AS b WHERE a.`categoryid`=b.`pid`-- 思考題:查詢參加了考試的同學(xué)信息(學(xué)號(hào),學(xué)生姓名,科目名,分?jǐn)?shù)) SELECT s.studentno,studentname,subjectname,StudentResult FROM student s INNER JOIN result r ON r.studentno = s.studentno INNER JOIN `subject` sub ON sub.subjectno = r.subjectno-- 查詢學(xué)員及所屬的年級(jí)(學(xué)號(hào),學(xué)生姓名,年級(jí)名) SELECT studentno AS 學(xué)號(hào),studentname AS 學(xué)生姓名,gradename AS 年級(jí)名稱 FROM student s INNER JOIN grade g ON s.`GradeId` = g.`GradeID`-- 查詢科目及所屬的年級(jí)(科目名稱,年級(jí)名稱) SELECT subjectname AS 科目名稱,gradename AS 年級(jí)名稱 FROM SUBJECT sub INNER JOIN grade g ON sub.gradeid = g.gradeid-- 查詢 數(shù)據(jù)庫結(jié)構(gòu)-1 的所有考試結(jié)果(學(xué)號(hào) 學(xué)生姓名 科目名稱 成績) SELECT s.studentno,studentname,subjectname,StudentResult FROM student s INNER JOIN result r ON r.studentno = s.studentno INNER JOIN `subject` sub ON r.subjectno = sub.subjectno WHERE subjectname='數(shù)據(jù)庫結(jié)構(gòu)-1'

排序和分頁

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-MgkcX53v-1609080184731)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201226200208117.png)]

測試

/*============== 排序 ================ 語法 : ORDER BYORDER BY 語句用于根據(jù)指定的列對(duì)結(jié)果集進(jìn)行排序。ORDER BY 語句默認(rèn)按照ASC升序?qū)τ涗涍M(jìn)行排序。如果您希望按照降序?qū)τ涗涍M(jìn)行排序,可以使用 DESC 關(guān)鍵字。*/-- 查詢 數(shù)據(jù)庫結(jié)構(gòu)-1 的所有考試結(jié)果(學(xué)號(hào) 學(xué)生姓名 科目名稱 成績) -- 按成績降序排序 SELECT s.studentno,studentname,subjectname,StudentResult FROM student s INNER JOIN result r ON r.studentno = s.studentno INNER JOIN `subject` sub ON r.subjectno = sub.subjectno WHERE subjectname='數(shù)據(jù)庫結(jié)構(gòu)-1' ORDER BY StudentResult DESC/*============== 分頁 ================ 語法 : SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset 好處 : (用戶體驗(yàn),網(wǎng)絡(luò)傳輸,查詢壓力)推導(dǎo):第一頁 : limit 0,5第二頁 : limit 5,5第三頁 : limit 10,5......第N頁 : limit (pageNo-1)*pageSzie,pageSzie[pageNo:頁碼,pageSize:單頁面顯示條數(shù)]*/-- 每頁顯示5條數(shù)據(jù) SELECT s.studentno,studentname,subjectname,StudentResult FROM student s INNER JOIN result r ON r.studentno = s.studentno INNER JOIN `subject` sub ON r.subjectno = sub.subjectno WHERE subjectname='數(shù)據(jù)庫結(jié)構(gòu)-1' ORDER BY StudentResult DESC , studentno LIMIT 0,5-- 查詢 JAVA第一學(xué)年 課程成績前10名并且分?jǐn)?shù)大于80的學(xué)生信息(學(xué)號(hào),姓名,課程名,分?jǐn)?shù)) SELECT s.studentno,studentname,subjectname,StudentResult FROM student s INNER JOIN result r ON r.studentno = s.studentno INNER JOIN `subject` sub ON r.subjectno = sub.subjectno WHERE subjectname='JAVA第一學(xué)年' ORDER BY StudentResult DESC LIMIT 0,10

子查詢

/*============== 子查詢 ================ 什么是子查詢?在查詢語句中的WHERE條件子句中,又嵌套了另一個(gè)查詢語句嵌套查詢可由多個(gè)子查詢組成,求解的方式是由里及外;子查詢返回的結(jié)果一般都是集合,故而建議使用IN關(guān)鍵字; */-- 查詢 數(shù)據(jù)庫結(jié)構(gòu)-1 的所有考試結(jié)果(學(xué)號(hào),科目編號(hào),成績),并且成績降序排列 -- 方法一:使用連接查詢 SELECT studentno,r.subjectno,StudentResult FROM result r INNER JOIN `subject` sub ON r.`SubjectNo`=sub.`SubjectNo` WHERE subjectname = '數(shù)據(jù)庫結(jié)構(gòu)-1' ORDER BY studentresult DESC;-- 方法二:使用子查詢(執(zhí)行順序:由里及外) SELECT studentno,subjectno,StudentResult FROM result WHERE subjectno=(SELECT subjectno FROM `subject`WHERE subjectname = '數(shù)據(jù)庫結(jié)構(gòu)-1' ) ORDER BY studentresult DESC;-- 查詢課程為 高等數(shù)學(xué)-2 且分?jǐn)?shù)不小于80分的學(xué)生的學(xué)號(hào)和姓名 -- 方法一:使用連接查詢 SELECT s.studentno,studentname FROM student s INNER JOIN result r ON s.`StudentNo` = r.`StudentNo` INNER JOIN `subject` sub ON sub.`SubjectNo` = r.`SubjectNo` WHERE subjectname = '高等數(shù)學(xué)-2' AND StudentResult>=80-- 方法二:使用連接查詢+子查詢 -- 分?jǐn)?shù)不小于80分的學(xué)生的學(xué)號(hào)和姓名 SELECT r.studentno,studentname FROM student s INNER JOIN result r ON s.`StudentNo`=r.`StudentNo` WHERE StudentResult>=80-- 在上面SQL基礎(chǔ)上,添加需求:課程為 高等數(shù)學(xué)-2 SELECT r.studentno,studentname FROM student s INNER JOIN result r ON s.`StudentNo`=r.`StudentNo` WHERE StudentResult>=80 AND subjectno=(SELECT subjectno FROM `subject`WHERE subjectname = '高等數(shù)學(xué)-2' )-- 方法三:使用子查詢 -- 分步寫簡單sql語句,然后將其嵌套起來 SELECT studentno,studentname FROM student WHERE studentno IN(SELECT studentno FROM result WHERE StudentResult>=80 AND subjectno=(SELECT subjectno FROM `subject` WHERE subjectname = '高等數(shù)學(xué)-2') )

常用函數(shù)

數(shù)據(jù)函數(shù)

SELECT ABS(-8); /*絕對(duì)值*/SELECT CEILING(9.4); /*向上取整*/SELECT FLOOR(9.4); /*向下取整*/SELECT RAND(); /*隨機(jī)數(shù),返回一個(gè)0-1之間的隨機(jī)數(shù)*/SELECT SIGN(0); /*符號(hào)函數(shù): 負(fù)數(shù)返回-1,正數(shù)返回1,0返回0*/

字符串函數(shù)

SELECT CHAR_LENGTH('狂神說堅(jiān)持就能成功'); /*返回字符串包含的字符數(shù)*/SELECT CONCAT('我','愛','程序'); /*合并字符串,參數(shù)可以有多個(gè)*/SELECT INSERT('我愛編程helloworld',1,2,'超級(jí)熱愛'); /*替換字符串,從某個(gè)位置開始替換某個(gè)長度*/SELECT LOWER('KuangShen'); /*小寫*/SELECT UPPER('KuangShen'); /*大寫*/SELECT LEFT('hello,world',5); /*從左邊截取*/SELECT RIGHT('hello,world',5); /*從右邊截取*/SELECT REPLACE('狂神說堅(jiān)持就能成功','堅(jiān)持','努力'); /*替換字符串*/SELECT SUBSTR('狂神說堅(jiān)持就能成功',4,6); /*截取字符串,開始和長度*/SELECT REVERSE('狂神說堅(jiān)持就能成功'); /*反轉(zhuǎn)-- 查詢姓周的同學(xué),改成鄒SELECT REPLACE(studentname,'周','鄒') AS 新名字FROM student WHERE studentname LIKE '周%';

日期和時(shí)間函數(shù)

SELECT CURRENT_DATE(); /*獲取當(dāng)前日期*/SELECT CURDATE(); /*獲取當(dāng)前日期*/SELECT NOW(); /*獲取當(dāng)前日期和時(shí)間*/SELECT LOCALTIME(); /*獲取當(dāng)前日期和時(shí)間*/SELECT SYSDATE(); /*獲取當(dāng)前日期和時(shí)間*/-- 獲取年月日,時(shí)分秒SELECT YEAR(NOW());SELECT MONTH(NOW());SELECT DAY(NOW());SELECT HOUR(NOW());SELECT MINUTE(NOW());SELECT SECOND(NOW());

系統(tǒng)信息函數(shù)

SELECT VERSION(); /*版本*/SELECT USER(); /*用戶*/

聚合函數(shù)

函數(shù)名稱描述
COUNT()返回滿足Select條件的記錄總和數(shù),如 select count(*) 【不建議使用 *,效率低】
SUM()返回?cái)?shù)字字段或表達(dá)式列作統(tǒng)計(jì),返回一列的總和。
AVG()通常為數(shù)值字段或表達(dá)列作統(tǒng)計(jì),返回一列的平均值
MAX()可以為數(shù)值字段,字符字段或表達(dá)式列作統(tǒng)計(jì),返回最大的值。
MIN()可以為數(shù)值字段,字符字段或表達(dá)式列作統(tǒng)計(jì),返回最小的值。
-- 聚合函數(shù)/*COUNT:非空的*/SELECT COUNT(studentname) FROM student;SELECT COUNT(*) FROM student;SELECT COUNT(1) FROM student; /*推薦*/-- 從含義上講,count(1) 與 count(*) 都表示對(duì)全部數(shù)據(jù)行的查詢。-- count(字段) 會(huì)統(tǒng)計(jì)該字段在表中出現(xiàn)的次數(shù),忽略字段為null 的情況。即不統(tǒng)計(jì)字段為null 的記錄。-- count(*) 包括了所有的列,相當(dāng)于行數(shù),在統(tǒng)計(jì)結(jié)果的時(shí)候,包含字段為null 的記錄;-- count(1) 用1代表代碼行,在統(tǒng)計(jì)結(jié)果的時(shí)候,包含字段為null 的記錄 。/*很多人認(rèn)為count(1)執(zhí)行的效率會(huì)比count(*)高,原因是count(*)會(huì)存在全表掃描,而count(1)可以針對(duì)一個(gè)字段進(jìn)行查詢。其實(shí)不然,count(1)和count(*)都會(huì)對(duì)全表進(jìn)行掃描,統(tǒng)計(jì)所有記錄的條數(shù),包括那些為null的記錄,因此,它們的效率可以說是相差無幾。而count(字段)則與前兩者不同,它會(huì)統(tǒng)計(jì)該字段不為null的記錄條數(shù)。下面它們之間的一些對(duì)比:1)在表沒有主鍵時(shí),count(1)比count(*)快2)有主鍵時(shí),主鍵作為計(jì)算條件,count(主鍵)效率最高;3)若表格只有一個(gè)字段,則count(*)效率較高。*/SELECT SUM(StudentResult) AS 總和 FROM result;SELECT AVG(StudentResult) AS 平均分 FROM result;SELECT MAX(StudentResult) AS 最高分 FROM result;SELECT MIN(StudentResult) AS 最低分 FROM result;

分組和過濾having

-- 查詢不同課程的平均分,最高分,最低分-- 前提:根據(jù)不同的課程進(jìn)行分組SELECT subjectname,AVG(studentresult) AS 平均分,MAX(StudentResult) AS 最高分,MIN(StudentResult) AS 最低分FROM result AS rINNER JOIN `subject` AS sON r.subjectno = s.subjectnoGROUP BY r.subjectnoHAVING 平均分>80;/*where寫在group by前面.要是放在分組后面的篩選要使用HAVING..因?yàn)閔aving是從前面篩選的字段再篩選,而where是從數(shù)據(jù)表中的>字段直接進(jìn)行的篩選的*/

MD5 加密

一、MD5簡介

MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于確保信息傳輸完整一致。是計(jì)算機(jī)廣泛使用的雜湊算法之一(又譯摘要算法、哈希算法),主流編程語言普遍已有MD5實(shí)現(xiàn)。將數(shù)據(jù)(如漢字)運(yùn)算為另一固定長度值,是雜湊算法的基礎(chǔ)原理,MD5的前身有MD2、MD3和MD4。

二、實(shí)現(xiàn)數(shù)據(jù)加密

新建一個(gè)表 testmd5

CREATE TABLE `testmd5` (`id` INT(4) NOT NULL,`name` VARCHAR(20) NOT NULL,`pwd` VARCHAR(50) NOT NULL,PRIMARY KEY (`id`)) ENGINE=INNODB DEFAULT CHARSET=utf8

插入一些數(shù)據(jù)

INSERT INTO testmd5 VALUES(1,'kuangshen','123456'),(2,'qinjiang','456789')

如果我們要對(duì)pwd這一列數(shù)據(jù)進(jìn)行加密,語法是:

update testmd5 set pwd = md5(pwd);

如果單獨(dú)對(duì)某個(gè)用戶(如kuangshen)的密碼加密:

INSERT INTO testmd5 VALUES(3,'kuangshen2','123456')update testmd5 set pwd = md5(pwd) where name = 'kuangshen2';

插入新的數(shù)據(jù)自動(dòng)加密

INSERT INTO testmd5 VALUES(4,'kuangshen3',md5('123456'));

查詢登錄用戶信息(md5對(duì)比使用,查看用戶輸入加密后的密碼進(jìn)行比對(duì))

SELECT * FROM testmd5 WHERE `name`='kuangshen' AND pwd=MD5('123456');

select小結(jié)

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-dYMO05l1-1609080184732)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201226234109501.png)]

-- ================ 內(nèi)置函數(shù) ================-- 數(shù)值函數(shù)abs(x) -- 絕對(duì)值 abs(-10.9) = 10format(x, d) -- 格式化千分位數(shù)值 format(1234567.456, 2) = 1,234,567.46ceil(x) -- 向上取整 ceil(10.1) = 11floor(x) -- 向下取整 floor (10.1) = 10round(x) -- 四舍五入去整mod(m, n) -- m%n m mod n 求余 10%3=1pi() -- 獲得圓周率pow(m, n) -- m^nsqrt(x) -- 算術(shù)平方根rand() -- 隨機(jī)數(shù)truncate(x, d) -- 截取d位小數(shù)-- 時(shí)間日期函數(shù)now(), current_timestamp(); -- 當(dāng)前日期時(shí)間current_date(); -- 當(dāng)前日期current_time(); -- 當(dāng)前時(shí)間date('yyyy-mm-dd hh:ii:ss'); -- 獲取日期部分time('yyyy-mm-dd hh:ii:ss'); -- 獲取時(shí)間部分date_format('yyyy-mm-dd hh:ii:ss', '%d %y %a %d %m %b %j'); -- 格式化時(shí)間unix_timestamp(); -- 獲得unix時(shí)間戳from_unixtime(); -- 從時(shí)間戳獲得時(shí)間-- 字符串函數(shù)length(string) -- string長度,字節(jié)char_length(string) -- string的字符個(gè)數(shù)substring(str, position [,length]) -- 從str的position開始,取length個(gè)字符replace(str ,search_str ,replace_str) -- 在str中用replace_str替換search_strinstr(string ,substring) -- 返回substring首次在string中出現(xiàn)的位置concat(string [,...]) -- 連接字串charset(str) -- 返回字串字符集lcase(string) -- 轉(zhuǎn)換成小寫left(string, length) -- 從string2中的左邊起取length個(gè)字符load_file(file_name) -- 從文件讀取內(nèi)容locate(substring, string [,start_position]) -- 同instr,但可指定開始位置lpad(string, length, pad) -- 重復(fù)用pad加在string開頭,直到字串長度為lengthltrim(string) -- 去除前端空格repeat(string, count) -- 重復(fù)count次rpad(string, length, pad) --在str后用pad補(bǔ)充,直到長度為lengthrtrim(string) -- 去除后端空格strcmp(string1 ,string2) -- 逐字符比較兩字串大小-- 聚合函數(shù)count()sum();max();min();avg();group_concat()-- 其他常用函數(shù)md5();default();

事務(wù)

什么是事務(wù)

  • 事務(wù)就是將一組SQL語句放在同一批次內(nèi)去執(zhí)行
  • 如果一個(gè)SQL語句出錯(cuò),則該批次內(nèi)的所有SQL都將被取消執(zhí)行
  • MySQL事務(wù)處理只支持InnoDB和BDB數(shù)據(jù)表類型

事務(wù)的ACID原則 百度 ACID

原子性(Atomic)

  • 整個(gè)事務(wù)中的所有操作,要么全部完成,要么全部不完成,不可能停滯在中間某個(gè)環(huán)節(jié)。事務(wù)在執(zhí)行過程中發(fā)生錯(cuò)誤,會(huì)被回滾(ROLLBACK)到事務(wù)開始前的狀態(tài),就像這個(gè)事務(wù)從來沒有執(zhí)行過一樣。

一致性(Consist)

  • 一個(gè)事務(wù)可以封裝狀態(tài)改變(除非它是一個(gè)只讀的)。事務(wù)必須始終保持系統(tǒng)處于一致的狀態(tài),不管在任何給定的時(shí)間并發(fā)事務(wù)有多少。也就是說:如果事務(wù)是并發(fā)多個(gè),系統(tǒng)也必須如同串行事務(wù)一樣操作。其主要特征是保護(hù)性和不變性(Preserving an Invariant),以轉(zhuǎn)賬案例為例,假設(shè)有五個(gè)賬戶,每個(gè)賬戶余額是100元,那么五個(gè)賬戶總額是500元,如果在這個(gè)5個(gè)賬戶之間同時(shí)發(fā)生多個(gè)轉(zhuǎn)賬,無論并發(fā)多少個(gè),比如在A與B賬戶之間轉(zhuǎn)賬5元,在C與D賬戶之間轉(zhuǎn)賬10元,在B與E之間轉(zhuǎn)賬15元,五個(gè)賬戶總額也應(yīng)該還是500元,這就是保護(hù)性和不變性。

隔離性(Isolated)

  • 隔離狀態(tài)執(zhí)行事務(wù),使它們好像是系統(tǒng)在給定時(shí)間內(nèi)執(zhí)行的唯一操作。如果有兩個(gè)事務(wù),運(yùn)行在相同的時(shí)間內(nèi),執(zhí)行相同的功能,事務(wù)的隔離性將確保每一事務(wù)在系統(tǒng)中認(rèn)為只有該事務(wù)在使用系統(tǒng)。這種屬性有時(shí)稱為串行化,為了防止事務(wù)操作間的混淆,必須串行化或序列化請(qǐng)求,使得在同一時(shí)間僅有一個(gè)請(qǐng)求用于同一數(shù)據(jù)。

持久性(Durable)

  • 在事務(wù)完成以后,該事務(wù)對(duì)數(shù)據(jù)庫所作的更改便持久的保存在數(shù)據(jù)庫之中,并不會(huì)被回滾。

隔離所導(dǎo)致的問題

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-oXQXOaWK-1609080184733)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227000409012.png)]

基本語法

-- 使用set語句來改變自動(dòng)提交模式 SET autocommit = 0; /*關(guān)閉*/ SET autocommit = 1; /*開啟*/-- 注意: --- 1.MySQL中默認(rèn)是自動(dòng)提交 --- 2.使用事務(wù)時(shí)應(yīng)先關(guān)閉自動(dòng)提交-- 開始一個(gè)事務(wù),標(biāo)記事務(wù)的起始點(diǎn) START TRANSACTION -- 提交一個(gè)事務(wù)給數(shù)據(jù)庫 COMMIT-- 將事務(wù)回滾,數(shù)據(jù)回到本次事務(wù)的初始狀態(tài) ROLLBACK-- 還原MySQL數(shù)據(jù)庫的自動(dòng)提交 SET autocommit =1;-- 保存點(diǎn) SAVEPOINT 保存點(diǎn)名稱 -- 設(shè)置一個(gè)事務(wù)保存點(diǎn) ROLLBACK TO SAVEPOINT 保存點(diǎn)名稱 -- 回滾到保存點(diǎn) RELEASE SAVEPOINT 保存點(diǎn)名稱 -- 刪除保存點(diǎn)

測試

/* 課堂測試題目A在線買一款價(jià)格為500元商品,網(wǎng)上銀行轉(zhuǎn)賬. A的銀行卡余額為2000,然后給商家B支付500. 商家B一開始的銀行卡余額為10000創(chuàng)建數(shù)據(jù)庫shop和創(chuàng)建表account并插入2條數(shù)據(jù) */CREATE DATABASE `shop`CHARACTER SET utf8 COLLATE utf8_general_ci; USE `shop`;CREATE TABLE `account` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(32) NOT NULL, `cash` DECIMAL(9,2) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8INSERT INTO account (`name`,`cash`) VALUES('A',2000.00),('B',10000.00)-- 轉(zhuǎn)賬實(shí)現(xiàn) SET autocommit = 0; -- 關(guān)閉自動(dòng)提交 START TRANSACTION; -- 開始一個(gè)事務(wù),標(biāo)記事務(wù)的起始點(diǎn) UPDATE account SET cash=cash-500 WHERE `name`='A'; UPDATE account SET cash=cash+500 WHERE `name`='B'; COMMIT; -- 提交事務(wù) # rollback; SET autocommit = 1; -- 恢復(fù)自動(dòng)提交

索引

索引的作用

  • 提高查詢速度
  • 確保數(shù)據(jù)的唯一性
  • 可以加速表和表之間的連接 , 實(shí)現(xiàn)表與表之間的參照完整性
  • 使用分組和排序子句進(jìn)行數(shù)據(jù)檢索時(shí) , 可以顯著減少分組和排序的時(shí)間
  • 全文檢索字段進(jìn)行搜索優(yōu)化.

分類

  • 主鍵索引 (Primary Key)
  • 唯一索引 (Unique) 避免重復(fù)的列
  • 常規(guī)索引 (Index)
  • 全文索引 (FullText)

主鍵索引

主鍵 : 某一個(gè)屬性組能唯一標(biāo)識(shí)一條記錄

特點(diǎn) :

  • 最常見的索引類型
  • 確保數(shù)據(jù)記錄的唯一性
  • 確定特定數(shù)據(jù)記錄在數(shù)據(jù)庫中的位置

唯一索引

作用 : 避免同一個(gè)表中某數(shù)據(jù)列中的值重復(fù)

與主鍵索引的區(qū)別

  • 主鍵索引只能有一個(gè)
  • 唯一索引可能有多個(gè)
CREATE TABLE `Grade`(`GradeID` INT(11) AUTO_INCREMENT PRIMARYKEY,`GradeName` VARCHAR(32) NOT NULL UNIQUE-- 或 UNIQUE KEY `GradeID` (`GradeID`) )

常規(guī)索引

作用 : 快速定位特定數(shù)據(jù)

注意 :

  • index 和 key 關(guān)鍵字都可以設(shè)置常規(guī)索引
  • 應(yīng)加在查詢找條件的字段
  • 不宜添加太多常規(guī)索引,影響數(shù)據(jù)的插入,刪除和修改操作
CREATE TABLE `result`(-- 省略一些代碼INDEX/KEY `ind` (`studentNo`,`subjectNo`) -- 創(chuàng)建表時(shí)添加 ) -- 創(chuàng)建后添加 ALTER TABLE `result` ADD INDEX `ind`(`studentNo`,`subjectNo`);

全文索引

百度搜索:全文索引

作用 : 快速定位特定數(shù)據(jù)

注意 :

  • 只能用于MyISAM類型的數(shù)據(jù)表
  • 只能用于CHAR , VARCHAR , TEXT數(shù)據(jù)列類型
  • 適合大型數(shù)據(jù)集
/* #方法一:創(chuàng)建表時(shí)CREATE TABLE 表名 (字段名1 數(shù)據(jù)類型 [完整性約束條件…],字段名2 數(shù)據(jù)類型 [完整性約束條件…],[UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY[索引名] (字段名[(長度)] [ASC |DESC]));#方法二:CREATE在已存在的表上創(chuàng)建索引CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名ON 表名 (字段名[(長度)] [ASC |DESC]) ;#方法三:ALTER TABLE在已存在的表上創(chuàng)建索引ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX索引名 (字段名[(長度)] [ASC |DESC]) ;#刪除索引:DROP INDEX 索引名 ON 表名字; #刪除主鍵索引: ALTER TABLE 表名 DROP PRIMARY KEY;#顯示索引信息: SHOW INDEX FROM student; *//*增加全文索引*/ ALTER TABLE `school`.`student` ADD FULLTEXT INDEX `studentname` (`StudentName`);/*EXPLAIN : 分析SQL語句執(zhí)行性能*/ EXPLAIN SELECT * FROM student WHERE studentno='1000';/*使用全文索引*/ -- 全文搜索通過 MATCH() 函數(shù)完成。 -- 搜索字符串作為 against() 的參數(shù)被給定。搜索以忽略字母大小寫的方式執(zhí)行。對(duì)于表中的每個(gè)記錄行,MATCH() 返回一個(gè)相關(guān)性值。即,在搜索字符串與記錄行在 MATCH() 列表中指定的列的文本之間的相似性尺度。 EXPLAIN SELECT *FROM student WHERE MATCH(studentname) AGAINST('love');/* 開始之前,先說一下全文索引的版本、存儲(chǔ)引擎、數(shù)據(jù)類型的支持情況MySQL 5.6 以前的版本,只有 MyISAM 存儲(chǔ)引擎支持全文索引; MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存儲(chǔ)引擎均支持全文索引; 只有字段的數(shù)據(jù)類型為 char、varchar、text 及其系列才可以建全文索引。 測試或使用全文索引時(shí),要先看一下自己的 MySQL 版本、存儲(chǔ)引擎和數(shù)據(jù)類型是否支持全文索引。 */

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-rHXHiDGT-1609080184734)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227095624686.png)]

拓展:測試索引

timestamp

建表app_user:

CREATE TABLE `app_user` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT '' COMMENT '用戶昵稱', `email` varchar(50) NOT NULL COMMENT '用戶郵箱', `phone` varchar(20) DEFAULT '' COMMENT '手機(jī)號(hào)', `gender` tinyint(4) unsigned DEFAULT '0' COMMENT '性別(0:男;1:女)', `password` varchar(100) NOT NULL COMMENT '密碼', `age` tinyint(4) DEFAULT '0' COMMENT '年齡', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='app用戶表'

批量插入數(shù)據(jù):100w

DROP FUNCTION IF EXISTS mock_data; DELIMITER $$ --寫函數(shù)之前必寫 CREATE FUNCTION mock_data() RETURNS INT BEGIN DECLARE num INT DEFAULT 1000000; DECLARE i INT DEFAULT 0; WHILE i < num DOINSERT INTO app_user(`name`, `email`, `phone`, `gender`, `password`, `age`)VALUES(CONCAT('用戶', i), '24736743@qq.com', CONCAT('18', FLOOR(RAND()*(999999999-100000000)+100000000)),FLOOR(RAND()*2),UUID(), FLOOR(RAND()*100));SET i = i + 1; END WHILE; RETURN i; END; SELECT mock_data();

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-pD2M2xM4-1609080184735)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227101332579.png)]

索引效率測試

EXPLAIN

無索引

SELECT * FROM app_user WHERE name = '用戶9999'; -- 查看耗時(shí) SELECT * FROM app_user WHERE name = '用戶9999'; SELECT * FROM app_user WHERE name = '用戶9999';mysql> EXPLAIN SELECT * FROM app_user WHERE name = '用戶9999'\G *************************** 1. row ***************************id: 1 select_type: SIMPLEtable: app_userpartitions: NULLtype: ALL possible_keys: NULLkey: NULLkey_len: NULLref: NULLrows: 992759filtered: 10.00Extra: Using where 1 row in set, 1 warning (0.00 sec)

創(chuàng)建索引

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-HTsGtbB1-1609080184735)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227102419495.png)]

CREATE INDEX id_app_user_name ON app_user(name);

測試普通索引

mysql> EXPLAIN SELECT * FROM app_user WHERE name = '用戶9999'\G *************************** 1. row ***************************id: 1 select_type: SIMPLEtable: app_userpartitions: NULLtype: ref possible_keys: idx_app_user_namekey: idx_app_user_namekey_len: 203ref: constrows: 1filtered: 100.00Extra: NULL 1 row in set, 1 warning (0.00 sec)mysql> SELECT * FROM app_user WHERE name = '用戶9999'; 1 row in set (0.00 sec)mysql> SELECT * FROM app_user WHERE name = '用戶9999'; 1 row in set (0.00 sec)mysql> SELECT * FROM app_user WHERE name = '用戶9999'; 1 row in set (0.00 sec)

索引準(zhǔn)則

  • 索引不是越多越好
  • 不要對(duì)經(jīng)常變動(dòng)的數(shù)據(jù)加索引
  • 小數(shù)據(jù)量的表建議不要加索引
  • 索引一般應(yīng)加在查找條件的字段

索引的數(shù)據(jù)結(jié)構(gòu)

-- 我們可以在創(chuàng)建上述索引的時(shí)候,為其指定索引類型,分兩類 hash類型的索引:查詢單條快,范圍查詢慢 btree類型的索引:b+樹,層數(shù)越多,數(shù)據(jù)量指數(shù)級(jí)增長(我們就用它,因?yàn)?span id="ozvdkddzhkzd" class="token keyword">innodb默認(rèn)支持它)-- 不同的存儲(chǔ)引擎支持的索引類型也不一樣 InnoDB 支持事務(wù),支持行級(jí)別鎖定,支持 B-tree、Full-text 等索引,不支持 Hash 索引; MyISAM 不支持事務(wù),支持表級(jí)別鎖定,支持 B-tree、Full-text 等索引,不支持 Hash 索引; Memory 不支持事務(wù),支持表級(jí)別鎖定,支持 B-tree、Hash 等索引,不支持 Full-text 索引; NDB 支持事務(wù),支持行級(jí)別鎖定,支持 Hash 索引,不支持 B-tree、Full-text 等索引; Archive 不支持事務(wù),支持表級(jí)別鎖定,不支持 B-tree、HashFull-text 等索引;

用戶管理

使用SQLyog 創(chuàng)建用戶,并授予權(quán)限演示

基本命令

/* 用戶和權(quán)限管理 */ ------------------ 用戶信息表:mysql.user-- 刷新權(quán)限 FLUSH PRIVILEGES-- 增加用戶 CREATE USER kuangshen IDENTIFIED BY '123456' CREATE USER 用戶名 IDENTIFIED BY [PASSWORD] 密碼(字符串)- 必須擁有mysql數(shù)據(jù)庫的全局CREATE USER權(quán)限,或擁有INSERT權(quán)限。- 只能創(chuàng)建用戶,不能賦予權(quán)限。- 用戶名,注意引號(hào):如 'user_name'@'192.168.1.1'- 密碼也需引號(hào),純數(shù)字密碼也要加引號(hào)- 要在純文本中指定密碼,需忽略PASSWORD關(guān)鍵詞。要把密碼指定為由PASSWORD()函數(shù)返回的混編值,需包含關(guān)鍵字PASSWORD-- 重命名用戶 RENAME USER kuangshen TO kuangshen2 RENAME USER old_user TO new_user-- 設(shè)置密碼 SET PASSWORD = PASSWORD('密碼') -- 為當(dāng)前用戶設(shè)置密碼 SET PASSWORD FOR 用戶名 = PASSWORD('密碼') -- 為指定用戶設(shè)置密碼-- 刪除用戶 DROP USER kuangshen2 DROP USER 用戶名-- 分配權(quán)限/添加用戶 GRANT 權(quán)限列表 ON 表名 TO 用戶名 [IDENTIFIED BY [PASSWORD] 'password']- all privileges 表示所有權(quán)限- *.* 表示所有庫的所有表- 庫名.表名 表示某庫下面的某表-- 查看權(quán)限 SHOW GRANTS FOR root@localhost; SHOW GRANTS FOR 用戶名-- 查看當(dāng)前用戶權(quán)限SHOW GRANTS;SHOW GRANTS FOR CURRENT_USER;SHOW GRANTS FOR CURRENT_USER();-- 撤消權(quán)限 REVOKE 權(quán)限列表 ON 表名 FROM 用戶名 REVOKE ALL PRIVILEGES, GRANT OPTION FROM 用戶名 -- 撤銷所有權(quán)限

權(quán)限解釋

-- 權(quán)限列表 ALL [PRIVILEGES] -- 設(shè)置除GRANT OPTION之外的所有簡單權(quán)限 ALTER -- 允許使用ALTER TABLE ALTER ROUTINE -- 更改或取消已存儲(chǔ)的子程序 CREATE -- 允許使用CREATE TABLE CREATE ROUTINE -- 創(chuàng)建已存儲(chǔ)的子程序 CREATE TEMPORARY TABLES -- 允許使用CREATE TEMPORARY TABLE CREATE USER -- 允許使用CREATE USER, DROP USER, RENAME USER和REVOKE ALL PRIVILEGES。 CREATE VIEW -- 允許使用CREATE VIEW DELETE -- 允許使用DELETE DROP -- 允許使用DROP TABLE EXECUTE -- 允許用戶運(yùn)行已存儲(chǔ)的子程序 FILE -- 允許使用SELECT...INTO OUTFILE和LOAD DATA INFILE INDEX -- 允許使用CREATE INDEX和DROP INDEX INSERT -- 允許使用INSERT LOCK TABLES -- 允許對(duì)您擁有SELECT權(quán)限的表使用LOCK TABLES PROCESS -- 允許使用SHOW FULL PROCESSLIST REFERENCES -- 未被實(shí)施 RELOAD -- 允許使用FLUSH REPLICATION CLIENT -- 允許用戶詢問從屬服務(wù)器或主服務(wù)器的地址 REPLICATION SLAVE -- 用于復(fù)制型從屬服務(wù)器(從主服務(wù)器中讀取二進(jìn)制日志事件) SELECT -- 允許使用SELECT SHOW DATABASES -- 顯示所有數(shù)據(jù)庫 SHOW VIEW -- 允許使用SHOW CREATE VIEW SHUTDOWN -- 允許使用mysqladmin shutdown SUPER -- 允許使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL語句,mysqladmin debug命令;允許您連接(一次),即使已達(dá)到max_connections。 UPDATE -- 允許使用UPDATE USAGE -- “無權(quán)限”的同義詞 GRANT OPTION -- 允許授予權(quán)限/* 表維護(hù) */-- 分析和存儲(chǔ)表的關(guān)鍵字分布 ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE 表名 ... -- 檢查一個(gè)或多個(gè)表是否有錯(cuò)誤 CHECK TABLE tbl_name [, tbl_name] ... [option] ... option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED} -- 整理數(shù)據(jù)文件的碎片 OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

MySQL備份

數(shù)據(jù)庫備份必要性

  • 保證重要數(shù)據(jù)不丟失
  • 數(shù)據(jù)轉(zhuǎn)移

MySQL數(shù)據(jù)庫備份方法

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-MAXtnHca-1609080184737)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227105652639.png)]

  • mysqldump備份工具
  • 數(shù)據(jù)庫管理工具,如SQLyog
  • 直接拷貝數(shù)據(jù)庫文件和相關(guān)配置文件

mysqldump客戶端

作用 :

  • 轉(zhuǎn)儲(chǔ)數(shù)據(jù)庫
  • 搜集數(shù)據(jù)庫進(jìn)行備份
  • 將數(shù)據(jù)轉(zhuǎn)移到另一個(gè)SQL服務(wù)器,不一定是MySQL服務(wù)器

-- 導(dǎo)出 1. 導(dǎo)出一張表 -- mysqldump -uroot -p123456 school student >D:/a.sqlmysqldump -u用戶名 -p密碼 庫名 表名 > 文件名(D:/a.sql) 2. 導(dǎo)出多張表 -- mysqldump -uroot -p123456 school student result >D:/a.sqlmysqldump -u用戶名 -p密碼 庫名 表123 > 文件名(D:/a.sql) 3. 導(dǎo)出所有表 -- mysqldump -uroot -p123456 school >D:/a.sqlmysqldump -u用戶名 -p密碼 庫名 > 文件名(D:/a.sql) 4. 導(dǎo)出一個(gè)庫 -- mysqldump -uroot -p123456 -B school >D:/a.sqlmysqldump -u用戶名 -p密碼 -B 庫名 > 文件名(D:/a.sql)可以-w攜帶備份條件-- 導(dǎo)入 1. 在登錄mysql的情況下: -- source D:/a.sqlsource 備份文件 2. 在不登錄的情況下mysql -u用戶名 -p密碼 庫名 < 備份文件

規(guī)范化數(shù)據(jù)庫設(shè)計(jì)

當(dāng)數(shù)據(jù)庫比較復(fù)雜時(shí)我們需要設(shè)計(jì)數(shù)據(jù)庫

糟糕的數(shù)據(jù)庫設(shè)計(jì) :

  • 數(shù)據(jù)冗余,存儲(chǔ)空間浪費(fèi)
  • 數(shù)據(jù)更新和插入的異常
  • 程序性能差

良好的數(shù)據(jù)庫設(shè)計(jì) :

  • 節(jié)省數(shù)據(jù)的存儲(chǔ)空間
  • 能夠保證數(shù)據(jù)的完整性
  • 方便進(jìn)行數(shù)據(jù)庫應(yīng)用系統(tǒng)的開發(fā)

軟件項(xiàng)目開發(fā)周期中數(shù)據(jù)庫設(shè)計(jì) :

  • 需求分析階段: 分析客戶的業(yè)務(wù)和數(shù)據(jù)處理需求
  • 概要設(shè)計(jì)階段:設(shè)計(jì)數(shù)據(jù)庫的E-R模型圖 , 確認(rèn)需求信息的正確和完整.

設(shè)計(jì)數(shù)據(jù)庫步驟

  • 收集信息

    • 與該系統(tǒng)有關(guān)人員進(jìn)行交流 , 座談 , 充分了解用戶需求 , 理解數(shù)據(jù)庫需要完成的任務(wù).
  • 標(biāo)識(shí)實(shí)體[Entity]

    • 標(biāo)識(shí)數(shù)據(jù)庫要管理的關(guān)鍵對(duì)象或?qū)嶓w,實(shí)體一般是名詞
  • 標(biāo)識(shí)每個(gè)實(shí)體需要存儲(chǔ)的詳細(xì)信息[Attribute]

  • 標(biāo)識(shí)實(shí)體之間的關(guān)系[Relationship]

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-dUs2t4SR-1609080184739)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227113137529.png)]

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-s4ALaL5C-1609080184740)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227112023260.png)]

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-MT7U9Gbh-1609080184741)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227112054458.png)]

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-MFviU8L4-1609080184742)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227112213735.png)]

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-YjHsw0Ck-1609080184743)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227112317320.png)]

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-QhTvaZUM-1609080184744)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227112518225.png)]

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-ycNhE0BM-1609080184745)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227112817019.png)]

三大范式

問題 : 為什么需要數(shù)據(jù)規(guī)范化?

不合規(guī)范的表設(shè)計(jì)會(huì)導(dǎo)致的問題:

  • 信息重復(fù)

  • 更新異常

  • 插入異常

    • 無法正確表示信息
  • 刪除異常

    • 丟失有效信息

三大范式

第一范式 (1st NF)

第一范式的目標(biāo)是確保每列的原子性,如果每列都是不可再分的最小數(shù)據(jù)單元,則滿足第一范式

第二范式(2nd NF)

第二范式(2NF)是在第一范式(1NF)的基礎(chǔ)上建立起來的,即滿足第二范式(2NF)必須先滿足第一范式(1NF)。

第二范式要求每個(gè)表只描述一件事情

第三范式(3rd NF)

如果一個(gè)關(guān)系滿足第二范式,并且除了主鍵以外的其他列都不傳遞依賴于主鍵列,則滿足第三范式.

第三范式需要確保數(shù)據(jù)表中的每一列數(shù)據(jù)都和主鍵直接相關(guān),而不能間接相關(guān)。

規(guī)范化和性能的關(guān)系

為滿足某種商業(yè)目標(biāo) , 數(shù)據(jù)庫性能比規(guī)范化數(shù)據(jù)庫更重要

在數(shù)據(jù)規(guī)范化的同時(shí) , 要綜合考慮數(shù)據(jù)庫的性能

通過在給定的表中添加額外的字段,以大量減少需要從中搜索信息所需的時(shí)間

通過在給定的表中插入計(jì)算列,以方便查詢

JDBC(重點(diǎn))

數(shù)據(jù)庫驅(qū)動(dòng)

驅(qū)動(dòng):聲卡,顯卡,數(shù)據(jù)庫

我們的程序會(huì)通過數(shù)據(jù)庫驅(qū)動(dòng),和數(shù)據(jù)庫打交道!

JDBC(對(duì)數(shù)據(jù)庫的統(tǒng)一操作)

SUN 公司為了簡化開發(fā)人員的(對(duì)數(shù)據(jù)庫的統(tǒng)一)操作,提供了一個(gè)(Java操作數(shù)據(jù)庫的)規(guī)范,JDBC

這些規(guī)范的實(shí)現(xiàn)由具體的廠商去做

對(duì)于開發(fā)人員來說,我們只需要掌握J(rèn)DBC的接口操作即可

java.sql

javax.sql

還需要導(dǎo)入數(shù)據(jù)庫驅(qū)動(dòng)包mysql-connector-java-5.1.47.jar

第一個(gè)JDBC程序

創(chuàng)建測試數(shù)據(jù)庫

CREATE DATABASE jdbcStudy CHARACTER SET utf8 COLLATE utf8_general_ci; USE jdbcStudy; CREATE TABLE `users`( id INT PRIMARY KEY, NAME VARCHAR(40), PASSWORD VARCHAR(40), email VARCHAR(60), birthday DATE ); INSERT INTO `users`(id,NAME,PASSWORD,email,birthday) VALUES(1,'zhansan','123456','zs@sina.com','1980-12-04'), (2,'lisi','123456','lisi@sina.com','1981-12-04'), (3,'wangwu','123456','wangwu@sina.com','1979-12-04')

1.創(chuàng)建一個(gè)普通項(xiàng)目

2.導(dǎo)入數(shù)據(jù)庫驅(qū)動(dòng)[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-ZPhB8UaJ-1609080184746)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227144426267.png)]

能展開才說明能用

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-Mp2slIbj-1609080184747)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227144512651.png)]

3.編寫測試代碼

package com.kuang.lesson01; //我的第一個(gè)JDBC程序 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class JdbcFirstDemo {public static void main(String[] args) throws Exception {//1. 加載驅(qū)動(dòng)Class.forName("com.mysql.jdbc.Driver");//固定寫法//2. 用戶信息和url//useUnicode=true&characterEncoding=utf8&&useSSL=trueString url ="jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&&useSSL=false";String name = "root";String password = "123456";//3. 連接成功,返回?cái)?shù)據(jù)庫對(duì)象 connection代表數(shù)據(jù)庫Connection connection= DriverManager.getConnection(url,name,password);//4. 執(zhí)行SQL的對(duì)象 statement 執(zhí)行SQL的對(duì)象Statement statement = connection.createStatement();//5. 執(zhí)行SQL的對(duì)象 去執(zhí)行SQL 可能存在結(jié)果,查看返回結(jié)果String sql="SELECT * FROM users";ResultSet resultSet = statement.executeQuery(sql);//返回的結(jié)果集,結(jié)果集中封裝了我們?nèi)坎樵兊慕Y(jié)果while(resultSet.next()){System.out.println("id+"+resultSet.getObject("id"));System.out.println("name+"+resultSet.getObject("NAME"));System.out.println("password+"+resultSet.getObject("PASSWORD"));System.out.println("email+"+resultSet.getObject("email"));System.out.println("birthday+"+resultSet.getObject("birthday"));}//6. 釋放連接resultSet.close();statement.close();connection.close();} }

步驟總結(jié):
1.加載驅(qū)動(dòng)

2.連接數(shù)據(jù)庫 DriverManager

3.獲取執(zhí)行SQL的對(duì)象 Statement

4.獲得返回的結(jié)果集

5.釋放連接

DriverManager

//DriverManager.registerDriver(new com.mysql.jdbc.Driver()); Class.forName("com.mysql.jdbc.Driver");//固定寫法Connection connection= DriverManager.getConnection(url,name,password); //connection代表數(shù)據(jù)庫 //數(shù)據(jù)庫設(shè)置自動(dòng)提交 //事務(wù)提交 //事務(wù)回滾 connection.rollback(); connection.commit(); connection.setAutoCommit();

URL

String url ="jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&&useSSL=false"; //mysql 默認(rèn)3306 //協(xié)議://主機(jī)地址:端口號(hào)/數(shù)據(jù)庫名?參數(shù)1&參數(shù)2&參數(shù)3 //Oracle 1521 //jdbc:oralce:thin:@localhost:1521:sid

statement 執(zhí)行SQL的對(duì)象 pPrepareStatement 執(zhí)行SQL的對(duì)象

String sql="SELECT * FROM users";//編寫Sql statement.executeQuery(); statement.execute();//執(zhí)行所有,但是效率低 statement.executeUpdate();//更新,插入,刪除,返回一個(gè)受影響的行數(shù)

ResultSet 查詢的結(jié)果集,封裝了所以的查詢結(jié)果

獲得指定的數(shù)據(jù)類型

ResultSet resultSet = statement.executeQuery(sql);//返回的結(jié)果集,結(jié)果集中封裝了我們?nèi)坎樵兊慕Y(jié)果resultSet.getObject();//在不知道列類型下使用resultSet.getString();//如果知道則指定使用resultSet.getInt();

遍歷,指針

resultSet.next(); //移動(dòng)到下一個(gè)resultSet.afterLast();//移動(dòng)到最后resultSet.beforeFirst();//移動(dòng)到最前面resultSet.previous();//移動(dòng)到前一行resultSet.absolute(row);//移動(dòng)到指定行

釋放內(nèi)存

6. 釋放連接resultSet.close();statement.close();connection.close();//耗資源

statement對(duì)象

Jdbc中的statement對(duì)象用于向數(shù)據(jù)庫發(fā)送SQL語句,想完成對(duì)數(shù)據(jù)庫的增刪改查,只需要通過這個(gè)對(duì)象向數(shù)據(jù)庫發(fā)送增刪改查語句即可。

Statement對(duì)象的executeUpdate方法,用于向數(shù)據(jù)庫發(fā)送增、刪、改的sq|語句, executeUpdate執(zhí)行完后, 將會(huì)返回一個(gè)整數(shù)(即增刪改語句導(dǎo)致了數(shù)據(jù)庫幾行數(shù)據(jù)發(fā)生了變化)。

Statement.executeQuery方法用于向數(shù)據(jù)庫發(fā)生查詢語句,executeQuery方法返回代表查詢結(jié)果的ResultSet對(duì)象。

CRUD操作-create

使用executeUpdate(String sql)方法完成數(shù)據(jù)添加操作,示例操作:

Statement statement = connection.createStatement();String sql = "insert into user(...) values(...)";int num = statement.executeUpdate(sql);if(num>0){System.out.println("插入成功");}

CRUD操作-delete

使用executeUpdate(String sql)方法完成數(shù)據(jù)刪除操作,示例操作:

Statement statement = connection.createStatement();String sql = "delete from user where id =1";int num = statement.executeUpdate(sql);if(num>0){System.out.println("刪除成功");}

CURD操作-update

使用executeUpdate(String sql)方法完成數(shù)據(jù)修改操作,示例操作:

Statement statement = connection.createStatement();String sql = "update user set name ='' where name = ''";int num = statement.executeUpdate(sql);if(num>0){System.out.println("修改成功");}

CURD操作-read

使用executeUpdate(String sql)方法完成數(shù)據(jù)查詢操作,示例操作:

Statement statement = connection.createStatement();String sql = "select * from user where id =1";ResultSet rs= statement.executeQuery(sql);if(rs.next()){System.out.println("");}

代碼實(shí)現(xiàn)

1.提取工具類

package com.kuang.lesson02.utils; import java.io.IOException; import java.io.InputStream; import java.sql.*; import java.util.Properties; public class jdbcUtils {private static String driver = null;private static String url = null;private static String username = null;private static String password = null;static {try{InputStream in = jdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");Properties properties = new Properties();properties.load(in);driver=properties.getProperty("driver");url=properties.getProperty("url");username=properties.getProperty("username");password=properties.getProperty("password");//1.驅(qū)動(dòng)只用加載一次Class.forName(driver);} catch (Exception e) {e.printStackTrace();}}//2.獲取連接public static Connection getConnection() throws Exception{return DriverManager.getConnection(url, username, password);}//3.釋放資源public static void release(Connection conn, Statement st, ResultSet rs) throws SQLException {if(rs!=null){rs.close();}if (st!=null){st.close();}if(conn!=null){conn.close();}} }

必須方法src目錄下

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-bFy3JqKZ-1609080184748)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227153302725.png)]

2.編寫增刪改的方法,exectueUpdate

package com.kuang.lesson02; import com.kuang.lesson02.utils.jdbcUtils;import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;public class Test01 {public static void main(String[] args) throws SQLException {Connection conn=null;Statement st = null;ResultSet rs =null;try {conn = jdbcUtils.getConnection();//獲取連接st = conn.createStatement();//獲取SQL執(zhí)行對(duì)象String sql = "INSERT INTO users(id,`NAME`,`PASSWORD`,`email`,`birthday`)" +"VALUES(77,'sanjin','123456','233223@qq.com','2020-01-01')";int i = st.executeUpdate(sql);if(i>0){System.out.println("插入成功");}} catch (Exception e) {e.printStackTrace();}finally {jdbcUtils.release(conn,st,rs);}} }

工具類

package com.kuang.lesson02.utils; import java.io.InputStream; import java.sql.*; import java.util.Properties; public class jdbcUtils {private static String driver = null;private static String url = null;private static String username = null;private static String password = null;static {try{InputStream in = jdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");Properties properties = new Properties();properties.load(in);driver=properties.getProperty("driver");url=properties.getProperty("url");username=properties.getProperty("username");password=properties.getProperty("password");//1.驅(qū)動(dòng)只用加載一次Class.forName(driver);} catch (Exception e) {e.printStackTrace();}}//2.獲取連接public static Connection getConnection() throws Exception{return DriverManager.getConnection(url, username, password);}//3.釋放資源public static void release(Connection conn, Statement st, ResultSet rs) throws SQLException {if(rs!=null){rs.close();}if (st!=null){st.close();}if(conn!=null){conn.close();}} }

配置文件(注意沒最后的分號(hào))

driver=com.mysql.jdbc.Driver url =jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true username = root password = 123456

SQL注入問題

sql存在漏洞,會(huì)被攻擊導(dǎo)致數(shù)據(jù)泄露 SQL會(huì)被拼接 or

package com.kuang.lesson02; import com.kuang.lesson02.utils.jdbcUtils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class SQL注入 {public static void main(String[] args) throws SQLException {//SQL注入login("sanjin","123456"); // login("' or '1=1","123456");}public static void login(String name,String password) throws SQLException {Connection conn =null;Statement st = null;ResultSet rs =null;try {conn = jdbcUtils.getConnection();//獲取連接st = conn.createStatement();//獲取SQL執(zhí)行對(duì)象String sql = "select * from users where `NAME`='"+ name +"' AND `PASSWORD`='"+ password +"'" ;rs=st.executeQuery(sql);//查詢完畢返回結(jié)果集while (rs.next()){System.out.println(rs.getString("NAME"));}jdbcUtils.release(conn,st,rs);} catch (Exception e) {e.printStackTrace();}finally {jdbcUtils.release(conn,st,rs);}} }

PreparedStatement對(duì)象

PreparedStatement 可以防止SQL注入 ,效率更高。

  • 新增
  • 刪除
  • 更新
  • 查詢
  • [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-EKd8ML8C-1609080184750)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227170521886.png)]

    package com.kuang.lesson03; import com.kuang.lesson02.utils.jdbcUtils;import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class Test01 {public static void main(String[] args) throws SQLException {Connection connection= null;PreparedStatement pstm=null;try {connection = jdbcUtils.getConnection();//區(qū)別//使用問好占位符代替參數(shù)String sql = "insert into users(id,`NAME`) values(?,?)";pstm = connection.prepareStatement(sql);//預(yù)編譯sql,先寫sql然后不執(zhí)行//手動(dòng)賦值pstm.setInt(1,6);pstm.setString(2,"SANJIN");//執(zhí)行int i = pstm.executeUpdate();if (i>0){System.out.println("插入成功");}} catch (Exception e) {e.printStackTrace();}finally {jdbcUtils.release(connection,pstm,null);}} }

    防止SQL注入本質(zhì),傳遞字符 帶有“ ”,轉(zhuǎn)義字符會(huì)被轉(zhuǎn)義

    使用IDEA連接數(shù)據(jù)庫(lib目錄下有mysql-connect-java…jar)

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-HwgIvCMB-1609080184750)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227185251423.png)]

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-WalrH5lR-1609080184751)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227185501047.png)]

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-xl7gs151-1609080184752)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227185915654.png)]

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-mPXDyp17-1609080184752)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227190700551.png)]

    先執(zhí)行一條SQL語句,雙擊數(shù)據(jù)庫才會(huì)出現(xiàn)

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-MGhm34W3-1609080184753)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227190930417.png)]

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-JMVCeygR-1609080184755)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227191201321.png)]

    連接成功后,可以選擇數(shù)據(jù)庫


    雙擊數(shù)據(jù)庫

    更新數(shù)據(jù)


    編寫sql代碼的地方

    JDBC事務(wù)

    要么都成功,要么都失敗

    ACID原則

    原子性:要么全部完成,要么都不完成

    一致性:結(jié)果總數(shù)不變

    隔離性:多個(gè)進(jìn)程互不干擾

    持久性:一旦提交不可逆,持久化到數(shù)據(jù)庫了

    隔離性的問題:

    臟讀: 一個(gè)事務(wù)讀取了另一個(gè)沒有提交的事務(wù)

    不可重復(fù)讀:在同一個(gè)事務(wù)內(nèi),重復(fù)讀取表中的數(shù)據(jù),表發(fā)生了改變

    虛讀(幻讀):在一個(gè)事務(wù)內(nèi),讀取到了別人插入的數(shù)據(jù),導(dǎo)致前后讀出來的結(jié)果不一致

    代碼實(shí)現(xiàn)

  • 開啟事務(wù)conn.setAutoCommit(false);

  • 一組業(yè)務(wù)執(zhí)行完畢,提交事務(wù)

  • 可以在catch語句中顯示的定義回滾,但是默認(rèn)失敗會(huì)回滾

    package com.kuang.lesson04; import com.kuang.lesson02.utils.jdbcUtils; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class TestTransaction1 {public static void main(String[] args) {Connection conn =null;PreparedStatement ps = null;ResultSet rs = null;try {conn = jdbcUtils.getConnection();//關(guān)閉數(shù)據(jù)庫的自動(dòng)提交功能, 開啟事conn.setAutoCommit(false);//自動(dòng)開啟事務(wù)String sql = "update account set money = money-500 where id = 1";ps =conn.prepareStatement(sql);ps.executeUpdate();String sql2 = "update account set money = money-500 where id = 2";ps=conn.prepareStatement(sql2);ps.executeUpdate();//業(yè)務(wù)完畢,提交事務(wù)conn.commit();System.out.println("操作成功");} catch (Exception e) {try {//如果失敗,則默認(rèn)回滾conn.rollback();//如果失敗,回滾} catch (SQLException throwables) {throwables.printStackTrace();}e.printStackTrace();}finally {try {jdbcUtils.release(conn,ps,rs);} catch (SQLException throwables) {throwables.printStackTrace();}}} }
  • 數(shù)據(jù)庫連接池

    數(shù)據(jù)庫連接–執(zhí)行完畢–釋放

    連接–釋放 十分浪費(fèi)資源

    池化技術(shù): 準(zhǔn)備一些預(yù)先的資源,過來就連接預(yù)先準(zhǔn)備好的

    常用連接數(shù) 100

    最少連接數(shù):100

    最大連接數(shù) : 120 業(yè)務(wù)最高承載上限

    排隊(duì)等待,

    等待超時(shí):100ms

    編寫連接池,實(shí)現(xiàn)一個(gè)接口 DateSource

    開源數(shù)據(jù)源實(shí)現(xiàn)(拿來即用)

    DBCP

    C3P0

    Druid: 阿里巴巴

    使用了這些數(shù)據(jù)庫連接池之后,我們在項(xiàng)目開發(fā)中就不需要編寫連接數(shù)據(jù)庫的代碼了

    DBCP

    需要用到 的jar包

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-Jo3dBGrm-1609080184759)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227193656670.png)]

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-HQqGaL0h-1609080184760)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227193822869.png)]

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-XvkXwIf3-1609080184760)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227200134783.png)]

    #連接設(shè)置 driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true username=root password=123456#<!-- 初始化連接 --> initialSize=10#最大連接數(shù)量 maxActive=50#<!-- 最大空閑連接 --> maxIdle=20#<!-- 最小空閑連接 --> minIdle=5#<!-- 超時(shí)等待時(shí)間以毫秒為單位 6000毫秒/1000等于60--> maxWait=60000 #JDBC驅(qū)動(dòng)建立連接時(shí)附帶的連接屬性屬性的格式必須為這樣:【屬性名=property;】 #注意:"user""password" 兩個(gè)屬性會(huì)被明確地傳遞,因此這里不需要包含他們。 connectionProperties=useUnicode=true;characterEncoding=UTF8#指定由連接池所創(chuàng)建的連接的自動(dòng)提交(auto-commit)狀態(tài)。 defaultAutoCommit=true#driver default 指定由連接池所創(chuàng)建的連接的只讀(read-only)狀態(tài)。 #如果沒有設(shè)置該值,則“setReadOnly”方法將不被調(diào)用。(某些驅(qū)動(dòng)并不支持只讀模式,如:Informix) defaultReadOnly=#driver default 指定由連接池所創(chuàng)建的連接的事務(wù)級(jí)別(TransactionIsolation)。 #可用值為下列之一:(詳情可見javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE defaultTransactionIsolation=READ_UNCOMMITTED

    C3P0

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-WdJF5yxR-1609080184761)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227222517411.png)]

    c3p0數(shù)據(jù)庫的配置文件: <?xml version="1.0" encoding="UTF-8"?> <c3p0-config><!-- c3p0的缺省(默認(rèn))配置 如果在代碼中"ComboPooledDataSource ds=new ComboPooledDataSource();"這樣寫就表示使用的是c3p0的缺省(默認(rèn))--> <default-config><property name="driverClass">com.mysql.cj.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcstudy?userUnicode=true&characterEncoding=utf8&uesSSL=true&serverTimezone=UTC</property><property name="user">root</property><property name="password">123456</property><property name="acquiredIncrement">5</property><property name="initialPoolSize">10</property><property name="minPoolSize">5</property><property name="maxPoolSize">20</property> </default-config></c3p0-config>

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-R1GQBUeV-1609080184762)(C:\Users\王東梁\AppData\Roaming\Typora\typora-user-images\image-20201227223309752.png)]

    package com.kuang.lesson05.utils;import org.apache.commons.dbcp.BasicDataSourceFactory;import javax.sql.DataSource; import java.io.InputStream; import java.sql.*; import java.util.Properties; public class JdbcUtilss_C3P0 {private static DataSource dataSource=null;static {try{//創(chuàng)建數(shù)據(jù)源 工廠模式dataSource = new ComboPoolDataSource("MySQL");} catch (Exception e) {e.printStackTrace();}}//2.獲取連接public static Connection getConnection() throws Exception{return dataSource.getConnection();}//3.釋放資源public static void release(Connection conn, Statement st, ResultSet rs) throws SQLException {if(rs!=null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if (st!=null){try {st.close();} catch (SQLException e) {e.printStackTrace();}}if(conn!=null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}} }

    結(jié)論

    無論使用什么數(shù)據(jù)源,本質(zhì)是不變的,DateSource接口不會(huì)變,方法就不會(huì)變

    總結(jié)

    以上是生活随笔為你收集整理的MySQL(笔记)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    国产黄影院色大全免费 | 亚洲黄网站 | 四虎影视8848dvd | 国产在线看 | 亚洲视频免费 | 午夜精品一二区 | 久久av伊人 | 日本在线精品视频 | 92中文资源在线 | 91成人短视频在线观看 | 日韩天天操 | 亚洲国产精品电影在线观看 | 激情久久伊人 | 蜜臀av麻豆 | 91视频免费看| 麻豆一区在线观看 | 五月婷婷开心中文字幕 | 日本在线观看视频一区 | 精品欧美日韩 | 久久久国产在线视频 | 免费的黄色的网站 | 亚洲第一区在线播放 | 天天干中文字幕 | 国产99久久久国产精品 | 国产精品久久久久久久午夜片 | 黄色影院在线免费观看 | 免费看三级 | 色天堂在线视频 | 精品国产1区二区 | 亚洲日本va午夜在线电影 | 一区二区三区四区五区六区 | 中文国产成人精品久久一 | 中文字幕在线看视频 | www.国产视频 | 久久久天天操 | 亚洲自拍av在线 | 亚洲专区在线播放 | 99日精品 | 91视频在线免费看 | 人人爽人人爽av | 精品国产乱码一区二 | 免费久久精品视频 | 91尤物国产尤物福利在线播放 | 久久久午夜视频 | 国产婷婷vvvv激情久 | 精品国产美女 | 国产麻豆精品传媒av国产下载 | 亚洲精品国产精品国自 | 国产精品美女毛片真酒店 | 日韩理论片 | 91麻豆精品一区二区三区 | 玖玖在线看 | 天天综合亚洲 | av三区在线 | 97超碰资源网 | 精品国产视频在线观看 | 久久久久久久久毛片精品 | 亚洲区二区| 人人网av| 97在线观看免费高清 | 久久久片 | 日日弄天天弄美女bbbb | 亚洲精品视频免费在线观看 | 精品人人人 | 国产一级性生活 | 国产黄a三级三级 | 免费亚洲视频在线观看 | 一级黄色在线免费观看 | 麻豆一区二区三区视频 | 99高清视频有精品视频 | 91麻豆精品国产自产 | 超碰在线公开免费 | 天天操天天能 | 久久这里只有精品久久 | 色综合亚洲精品激情狠狠 | 深爱婷婷 | 日韩簧片在线观看 | 欧美久草在线 | 在线观看国产高清视频 | 久久久精品午夜 | 欧美黑人巨大xxxxx | 久久这里只有精品1 | 99久久成人 | 免费视频一二三区 | 丁香综合av | 欧美激情第一页xxx 午夜性福利 | 粉嫩高清一区二区三区 | 久久激情五月丁香伊人 | 欧美日韩视频 | 日本动漫做毛片一区二区 | 国产一区久久久 | 天天干天天射天天操 | 热久久这里只有精品 | 久久久资源网 | 成人av一区二区兰花在线播放 | 久草久草久草久草 | 国产在线精品区 | 午夜av不卡 | 色视频国产直接看 | 国产精品69久久久久 | 国产视频亚洲视频 | 久久久成人精品 | 亚洲精品一区二区在线观看 | 在线免费视频你懂的 | 超碰伊人网 | 欧美成人免费在线 | 99福利影院 | 啪啪凸凸 | 亚洲精品国产精品国自产 | 国产成人一级 | 久久综合亚洲鲁鲁五月久久 | 欧美日韩免费视频 | 色婷婷狠 | 精品一二| 久久伊人免费视频 | 天天色天天上天天操 | 国际精品久久久久 | 中文字幕一区二区三区精华液 | 在线观看免费高清视频大全追剧 | 久久免费国产精品 | 日韩视频www | 国产精品免费久久久久久久久久中文 | 久久久免费毛片 | 免费av网站在线 | 欧美不卡视频在线 | 91亚洲欧美 | 国产一区视频在线播放 | 麻豆传媒电影在线观看 | 久久高清免费 | 免费瑟瑟网站 | 最近免费观看的电影完整版 | 亚洲精品在线视频观看 | 狠狠干干 | 久久黄色免费 | 成年人av在线播放 | 国产一区欧美二区 | 中文字幕有码在线播放 | 国产一级片在线播放 | 日韩在线观看a | 亚洲免费永久精品国产 | 久久久91精品国产一区二区三区 | 国产一区二区视频在线 | 91精品一区二区在线观看 | 最近的中文字幕大全免费版 | 中文字幕免费观看 | 欧美激情视频三区 | 人人狠狠综合久久亚洲 | 国产亲近乱来精品 | 国产精品久久久久久吹潮天美传媒 | 国产在线不卡视频 | 激情丁香久久 | 欧美国产日韩一区 | 精品视频中文字幕 | 国内三级在线观看 | 日韩av午夜在线观看 | 色婷婷视频在线观看 | 国语久久 | 精品国内自产拍在线观看视频 | 亚洲影院色| 波多野结衣一区二区三区中文字幕 | 九九视频在线 | 激情欧美国产 | 国产亚洲va综合人人澡精品 | 99在线热播精品免费 | 美女黄频网站 | 999国产 | 欧洲一区二区在线观看 | 三级视频日韩 | 狠狠干网站 | 国产裸体无遮挡 | 亚洲欧洲一区二区在线观看 | 黄色成人91 | 国产精品一区专区欧美日韩 | 国产精品午夜在线观看 | 色综合www| 九九有精品| 在线一二三四区 | 欧美性生活久久 | 久久久久久综合 | 免费在线色电影 | 91人人爱 | 亚洲天堂精品 | 久久免费视频2 | 国产精品ⅴa有声小说 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 最近中文字幕完整高清 | 五月天精品视频 | 国产精品中文字幕在线播放 | 五月婷婷中文字幕 | 一区二区三区四区影院 | 久99久精品视频免费观看 | 在线免费av网 | 激情综合网色播五月 | 天天干天天操天天操 | 天天操天天色天天射 | 超级碰碰免费视频 | 日韩中文字幕国产精品 | 精品福利视频在线 | 中文字幕乱码电影 | 久久婷亚洲五月一区天天躁 | 69国产盗摄一区二区三区五区 | 免费黄a大片 | 久久亚洲私人国产精品 | 久久国产经典视频 | aⅴ视频在线 | 九色在线视频 | 中文字幕在线网 | 亚洲精品午夜一区人人爽 | 亚洲国产午夜精品 | 亚洲天堂在线观看完整版 | 亚洲综合色站 | 高清av在线免费观看 | 国产精品尤物视频 | 亚洲一区二区三区四区在线视频 | 亚洲伊人色 | 伊人久久婷婷 | 亚洲免费国产 | 在线观看中文字幕一区二区 | 成年人在线播放视频 | 亚洲黄色免费网站 | 99爱在线| 亚洲日韩中文字幕 | 九草在线观看 | 免费在线观看一区 | 成人av手机在线 | 天天看天天干 | 91精品国产成人观看 | 麻豆视频入口 | 中文字幕麻豆 | 亚洲 欧美 综合 在线 精品 | 国产三级视频在线 | 久久久午夜视频 | 中文字幕在线国产 | 在线免费观看视频一区二区三区 | 日本在线观看黄色 | 成人h在线播放 | 天天插天天爽 | 免费在线观看的av网站 | 亚洲成人黄色在线观看 | 亚洲久草在线 | 成年人在线免费看视频 | 91成人免费电影 | 激情综合啪啪 | 激情五月婷婷激情 | 国产一级三级 | 色91av | 九精品| 视频福利在线观看 | 一本一道久久a久久综合蜜桃 | 波多野结衣在线视频一区 | 久久免费视频8 | 91色在线观看视频 | 免费看的黄色小视频 | 狠狠操狠狠干2017 | 视频在线精品 | 亚洲 中文 欧美 日韩vr 在线 | av电影在线观看完整版一区二区 | 狠狠做深爱婷婷综合一区 | 人人澡人人澡人人 | 日韩视频一区二区三区在线播放免费观看 | 久久久久免费精品国产小说色大师 | 精品国产观看 | 欧美亚洲成人免费 | 欧美日韩免费观看一区=区三区 | 激情视频一区二区三区 | 夜夜爽88888免费视频4848 | 成人av直播 | 久久久久久久久艹 | 亚洲欧美日韩一区二区三区在线观看 | 91污视频在线 | 色91在线 | 精品日本视频 | 婷婷综合久久 | 一区在线播放 | 91视频下载 | 国产在线看 | 国产精品久久久久久久久久ktv | 在线视频福利 | 99热在线精品观看 | 日本黄色一级电影 | 一二三区高清 | 国产一区二区三区视频在线 | 亚洲欧美成人综合 | 五月婷婷电影网 | 色综合久久88色综合天天 | 国产成人精品久久久 | 免费成人黄色 | 欧美日韩天堂 | 亚洲精品成人av在线 | 精品一区二区影视 | 亚洲精品午夜一区人人爽 | 在线黄色av电影 | 91视频在线国产 | 日韩一级片观看 | 97福利| 激情综合网在线观看 | 国产片免费在线观看视频 | 日韩小视频网站 | 国产麻豆视频免费观看 | 丁香综合激情 | 亚洲欧美精品一区 | 狠狠色噜噜狠狠狠狠2021天天 | 国产精品久久久久永久免费观看 | 香蕉国产91| 欧美日韩激情网 | 成片免费观看视频999 | 91专区在线观看 | 成人91av| 免费亚洲片 | 97色视频在线 | av官网| av网站手机在线观看 | 国产精品短视频 | 91自拍成人 | 日韩三级.com | 久久久受www免费人成 | 国产精品久久久久久久久久久久冷 | 国产亚洲精品久久久久久网站 | 开心丁香婷婷深爱五月 | 97**国产露脸精品国产 | 色香蕉在线 | 五月婷综合 | 四虎成人精品永久免费av九九 | 欧美尹人 | 麻豆视频在线免费 | 国产精品婷婷午夜在线观看 | 一本一本久久a久久 | 亚洲黄色影院 | 亚洲综合色站 | 婷婷丁香社区 | 麻豆一区二区 | 美腿丝袜一区二区三区 | 99精品视频在线观看播放 | 精品免费99久久 | 亚洲精品午夜aaa久久久 | 美女久久久久久久久久 | 国产精品国产亚洲精品看不卡 | a级成人毛片 | 深爱婷婷网 | 97中文字幕| 国产不卡视频在线 | 91热爆视频 | 日日精品| 探花视频免费观看高清视频 | 天天综合中文 | 久草在线视频在线观看 | 色视频网站在线观看一=区 a视频免费在线观看 | 国产成人精品不卡 | 99久久网站 | 久久久综合 | 综合久久影院 | 爱爱av网| www.av中文字幕.com | 亚洲综合狠狠干 | 97超碰资源| 精品国产网址 | 免费看黄20分钟 | 日韩av女优视频 | 国产精品嫩草在线 | 美女免费视频黄 | 日韩av一区二区在线播放 | 超级碰99 | 国产午夜精品一区二区三区嫩草 | 天天操天天操天天爽 | 国产视频1区2区3区 久久夜视频 | 丁香六月婷婷综合 | 久久精品一区二区三区视频 | 99视频国产精品免费观看 | 欧美日韩久 | 国产老妇av| 中文字幕av一区二区三区四区 | 超碰个人在线 | 成人av影视在线 | 特黄特色特刺激视频免费播放 | 日韩免费视频观看 | 91专区在线观看 | 18久久久久 | 亚洲黄色片一级 | 天天摸天天舔天天操 | 99久热在线精品视频观看 | 中文字幕在线免费97 | 韩国av免费在线 | 黄色a级片在线观看 | 99国产免费网址 | 国际精品久久久久 | 国产精品99在线播放 | 成人久久久久久久久久 | 91av综合| 国产特级毛片aaaaaa毛片 | 波多野结衣久久资源 | 成人禁用看黄a在线 | 亚洲电影第一页av | 日韩在线观看视频免费 | 成人三级视频 | 国内精品免费 | 国产精品女 | 国产麻豆精品久久 | 欧美激情视频在线免费观看 | 99国产情侣在线播放 | 久久艹艹 | 欧美性久久久久久 | 国产成人av电影在线观看 | 97免费视频在线播放 | 国产高清中文字幕 | 国产精品一区二区三区观看 | 波多野结衣一区二区三区中文字幕 | 欧美一区二区三区在线播放 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 丁香在线观看完整电影视频 | 欧美久久久久久 | 国产高清不卡一区二区三区 | 国产色视频一区二区三区qq号 | 国产精品精品国产 | 97天堂 | 亚洲精品日韩在线观看 | 国产一区欧美日韩 | 午夜电影久久 | 人人爽久久久噜噜噜电影 | 亚洲综合爱 | 综合激情| 91精品视频免费观看 | 国产成人在线网站 | 国产成人精品久久久久 | 欧美日韩一区二区在线观看 | 国产精品午夜在线观看 | 99久久精品免费看国产麻豆 | 成人av电影在线播放 | 天堂视频一区 | 国产精品久久久久久一二三四五 | 超碰97网站 | 久久国产精品99久久久久久老狼 | 久久伦理| 中文字幕影片免费在线观看 | 久久电影国产免费久久电影 | 国产精品久久在线 | wwwav视频| 国产黄色一级大片 | 天天干天天拍天天操天天拍 | 蜜桃av综合网 | 91黄色在线视频 | 国产三级午夜理伦三级 | 波多野结衣综合网 | 久久久麻豆 | 国产成人精品av在线 | 国产精品久久久久一区二区 | 狠狠操导航 | 国产精品久久久久免费观看 | 久久人人爽爽人人爽人人片av | 国产精品麻豆视频 | 日韩欧美精品在线视频 | 亚洲精选99 | 日韩精品电影在线播放 | 久久99精品久久久久久三级 | 国产精品美女在线观看 | 欧洲色综合 | 国产手机在线视频 | 久草视频在线免费播放 | 国产成人精品一区二区三区 | 97视频在线播放 | 久久黄色小说视频 | 丁香六月伊人 | www色片| 天天操夜夜操天天射 | 国产午夜三级 | 五月婷婷综合在线观看 | avwww在线观看 | 欧美日韩亚洲在线观看 | 久久久久久久久久久福利 | 在线观看视频一区二区三区 | 91成人看片 | 九九久久婷婷 | 国产成人一区二区精品非洲 | 亚洲 欧美 91 | 欧美天天干 | 国产黄色看片 | 欧美精品国产综合久久 | 天堂av免费看 | 国产字幕在线播放 | 日韩欧美aaa | av黄色国产 | 久久夜色精品国产欧美乱极品 | 日本激情视频中文字幕 | 久久伦理| 成人午夜免费剧场 | 国产一级在线免费观看 | 久久久久国产免费免费 | 国产免费亚洲高清 | 日韩com| 91在线最新 | 97久久精品午夜一区二区 | 亚洲免费在线观看视频 | 久久国产成人午夜av影院宅 | 国产又粗又硬又爽的视频 | 国产视频一区在线免费观看 | 日韩亚洲欧美中文字幕 | 国产精品成人一区二区 | 91视频高清完整版 | 国产免费不卡av | 久久精品一区 | 精品一区二区久久久久久久网站 | 亚洲精品乱码久久久久久高潮 | 国产精品久久久久久久电影 | 婷婷在线色| 国产午夜亚洲精品 | 日本中文字幕在线视频 | 国产成人亚洲在线观看 | 色吧久久| 成人小视频免费在线观看 | 国产麻豆精品在线观看 | 99久久婷婷国产综合亚洲 | 日韩黄色在线 | av大全在线看 | 69视频网站| www.五月天激情 | 久久婷婷五月综合色丁香 | 99九九热只有国产精品 | 国产超碰在线 | 国产精品美女999 | 日韩中字在线 | 丁香花在线视频观看免费 | 美女精品国产 | 黄色av电影网 | 久久99精品热在线观看 | 肉色欧美久久久久久久免费看 | 人人爽人人片 | 奇米影视四色8888 | 91视频免费国产 | 色播六月天 | 国产99久久精品一区二区300 | 欧美一级视频一区 | 亚洲精品456在线播放第一页 | 97天天干 | 日本在线视频网址 | 亚洲天天在线日亚洲洲精 | 久久激情婷婷 | 国产成人精品电影久久久 | 久久丝袜视频 | 亚洲一区动漫 | 精品国产乱码久久久久久浪潮 | 99精品电影 | 日韩成人xxxx| 日一日操一操 | 日韩一区二区三区不卡 | 国产精品一区久久久久 | 国产中文字幕一区二区 | 久久久久亚洲精品男人的天堂 | 91最新视频 | 国产精品观看视频 | 国产精选在线 | 免费看片网站91 | 国产18精品乱码免费看 | 久久精品99国产精品日本 | 日韩手机在线 | 91亚洲综合 | 黄免费网站| 亚洲国产精品成人av | av福利第一导航 | 日本中文字幕视频 | 日韩大陆欧美高清视频区 | 国产日韩在线一区 | 91大神电影 | www.com在线观看 | 天天综合区 | 一级片观看 | 亚洲视频免费在线 | 一区二区观看 | 欧美日韩视频精品 | 婷婷亚洲最大 | www国产亚洲精品久久麻豆 | 日韩网站在线观看 | 欧美另类交在线观看 | 一区二区三区电影 | 精品国产欧美一区二区 | 午夜av剧场 | 不卡视频一区二区三区 | 亚洲伊人av | 国产91小视频 | 精品一区二区久久久久久久网站 | 欧美一区二区三区四区夜夜大片 | 男女视频久久久 | 亚洲91中文字幕无线码三区 | 成人国产精品久久久春色 | 人人爱人人做人人爽 | 国产亚洲亚洲 | 黄污在线看 | 看av免费网站 | 亚洲精品五月 | 久久香蕉电影网 | 999久久国产 | 精品国产一区二区三区四 | 国产日韩欧美视频在线观看 | 在线成人短视频 | 激情网第四色 | 久久在草 | av天天澡天天爽天天av | 97在线免费观看视频 | 欧美最猛性xxxxx(亚洲精品) | 高清一区二区 | 日日夜夜天天久久 | 国产精品永久免费视频 | 色婷婷a | av在线网站大全 | 国产精品一区二区在线免费观看 | 国产美女视频网站 | 激情久久五月 | 亚洲精品乱码久久久久久蜜桃欧美 | 日本黄色免费观看 | 在线观看韩日电影免费 | 亚洲播播 | 欧美一级淫片videoshd | 91成人小视频 | www.久久91| 国产精品va视频 | 九九精品久久久 | 91精品办公室少妇高潮对白 | 有码中文字幕 | 久久精品99久久 | 99精品视频中文字幕 | 911香蕉视频 | 中文字幕中文字幕在线中文字幕三区 | 国产精品久久久久久久久久 | 天天综合久久综合 | 在线观看91av | 中文字幕永久 | 亚洲欧洲日韩在线观看 | 一二三久久久 | 五月天天天操 | 狠狠综合久久av | 亚洲精品456在线播放乱码 | 国产精品理论片在线播放 | 97在线观看视频国产 | 99久热在线精品 | 婷婷在线不卡 | 97视频在线观看成人 | 久久国产视频网 | 狠狠色丁香久久婷婷综合丁香 | www久久国产 | 天天干一干 | 99久久99| a久久免费视频 | 久久色网站 | 亚洲美女免费精品视频在线观看 | 免费av试看 | 日韩久久精品一区二区三区 | 97视频网址 | 欧美午夜a | 香蕉久草| 久精品在线 | 日本最大色倩网站www | 在线a人v观看视频 | 久久a国产 | 国产欧美日韩精品一区二区免费 | 中文在线字幕免 | 91亚色视频在线观看 | 日韩色av色资源 | 久久五月网 | 久久精品看片 | 国产精品自产拍在线观看中文 | 精品久久久精品 | 国产成人免费在线观看 | 美女久久久久久久久久久 | 中文国产字幕 | 日韩精品黄 | 亚洲精品字幕在线观看 | 五月婷婷在线视频观看 | 日韩视频一| 日夜夜精品视频 | 国产91勾搭技师精品 | av片中文字幕 | 日韩中文免费视频 | 五月激情电影 | 色综合久久综合 | 精品视频久久 | 91av电影在线| 91中文字幕在线观看 | 天堂av在线网址 | 亚洲国产无| 最新av免费在线观看 | 国产精品视频最多的网站 | 精品视频免费观看 | 狠狠躁天天躁综合网 | 色爱区综合激月婷婷 | 美女视频黄免费 | 有码中文在线 | 国产精品ssss在线亚洲 | 开心激情久久 | 国产69精品久久99的直播节目 | www.国产精品 | 国产九九在线 | 99精品免费网 | 伊人中文字幕在线 | 91麻豆精品国产91久久久使用方法 | 欧洲视频一区 | 国产精品久久久久久久久久白浆 | 91探花在线 | 热久在线 | 久久桃花网 | 在线探花| 国产美女网站视频 | 国产欧美最新羞羞视频在线观看 | 亚洲天天在线日亚洲洲精 | av免费观看高清 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 日韩成人邪恶影片 | 中文字幕人成乱码在线观看 | 精品久久福利 | 色搞搞 | 日韩三级成人 | 亚洲国产精品人久久电影 | 成人黄色av网站 | 国产视频在线看 | 国产精在线 | 五月婷婷色 | 一本一本久久a久久精品牛牛影视 | 成年人免费在线观看 | 色综合激情久久 | 91精品国自产在线偷拍蜜桃 | 亚洲国产福利视频 | 成人一区二区三区在线观看 | 香蕉久草| 日韩激情视频 | 国内精品国产三级国产aⅴ久 | 久久久久久久18 | 中文字幕精品一区二区精品 | 日日日网| 久久久久97国产 | 日韩欧美高清不卡 | 亚洲欧美国产精品 | av中文在线观看 | 天天躁日日躁狠狠躁av中文 | 在线观看黄色免费视频 | 天天干夜夜操视频 | 丝袜av一区 | 日韩一级理论片 | 婷婷综合激情 | 成人小视频在线观看免费 | 高清免费在线视频 | 久久电影国产免费久久电影 | 亚洲a成人v| 美女免费视频网站 | 热99在线视频 | 日韩免费电影在线观看 | 超碰在线9| 久久你懂的 | 97av影院 | 中文字幕欧美激情 | 久久激五月天综合精品 | 久久精品爱爱视频 | 91在线视频播放 | 久久免费国产视频 | 五月天综合 | 欧美疯狂性受xxxxx另类 | 亚洲精品男人的天堂 | 爱av在线网 | 在线成人av| 亚洲一级黄色片 | 黄色国产在线观看 | 国产日韩欧美在线看 | 成年人网站免费观看 | 中文字幕av在线不卡 | 992tv人人草 黄色国产区 | 69国产成人综合久久精品欧美 | 中文字幕日韩有码 | 四虎国产精品免费观看视频优播 | 日韩欧美视频在线 | 韩国精品视频在线观看 | 日日夜夜狠狠操 | 98涩涩国产露脸精品国产网 | 婷婷免费视频 | 黄污在线观看 | 欧美成人精品三级在线观看播放 | 久久超碰网 | 97在线免费观看视频 | 久久草 | 成人午夜电影网 | 国产精品999久久久 久产久精国产品 | 免费看成人片 | 国产精品一区免费看8c0m | 久久国色夜色精品国产 | 在线导航av | 91麻豆精品一区二区三区 | 欧美日韩亚洲在线观看 | 色婷婷久久一区二区 | 成人亚洲综合 | 国内免费久久久久久久久久久 | 国产夫妻自拍av | 国产黄在线 | 视频国产在线观看18 | 国产精品手机视频 | 免费在线成人av | 亚洲伊人av | 国产免费激情久久 | 一区在线观看 | 欧美日韩高清一区二区 国产亚洲免费看 | 欧美九九视频 | 国外成人在线视频网站 | 欧美成人tv | 手机在线看片日韩 | 亚洲女欲精品久久久久久久18 | 视频在线观看日韩 | 在线视频 亚洲 | 日韩av看片 | 四虎免费在线观看视频 | 久久综合狠狠综合久久狠狠色综合 | 丝袜一区在线 | 懂色av一区二区三区蜜臀 | 国产亚洲精品久久网站 | 久久91网 | 丝袜网站在线观看 | 日韩欧美精品在线 | 国产一级淫片在线观看 | 日韩欧美国产精品 | 韩国三级在线一区 | 91香蕉国产在线观看软件 | aaa亚洲精品一二三区 | 免费av网址在线观看 | 777视频在线观看 | 国产字幕在线看 | 国产91精品一区二区麻豆网站 | 91亚洲在线观看 | 四虎免费在线观看 | 综合网av| 国产精品大片在线观看 | 久久久精品日本 | 一区二区电影在线观看 | 久久综合久久综合这里只有精品 | 日日操天天射 | 在线播放第一页 | 99久久精品国产欧美主题曲 | 手机看片午夜 | av网站在线观看免费 | 国产伦精品一区二区三区高清 | 国产午夜激情视频 | 波多野结依在线观看 | 国产97色在线 | www.夜夜草| av资源免费在线观看 | 欧美一区二视频在线免费观看 | 天天操夜夜干 | 天堂av网在线 | 超碰av在线 | 国产精品6999成人免费视频 | 在线观看视频在线观看 | 成人手机在线视频 | 亚洲视频专区在线 | www.91av在线| 天天综合日 | 欧美国产日韩一区二区三区 | 亚洲精品乱码久久久久久蜜桃动漫 | 国产精品免费av | www.国产在线观看 | 国产资源精品在线观看 | 韩国av一区二区三区 | 国产精品福利无圣光在线一区 | 久久99最新地址 | 中文字幕观看在线 | 久久久夜色| 日日干天天爽 | 色婷婷在线视频 | 黄色av三级在线 | 99视频这里有精品 | www.日日日.com| 日韩av免费一区二区 | 日韩av手机在线观看 | av在线电影播放 | 亚洲在线视频观看 | 97精品国产97久久久久久久久久久久 | 人人爽人人干 | 日韩精品久久久久久久电影竹菊 | 99久久精品日本一区二区免费 | 中文字幕成人av | 国产视频网站在线观看 | 午夜视频在线观看一区二区三区 | 久久99视频精品 | 欧美大片在线观看一区 | 99热免费在线 | 天天摸天天干天天操天天射 | 中文字幕高清视频 | 久青草电影| 日韩精品一区二区在线观看 | 日韩精品一区二区免费 | 日韩久久久久久久 | 久久久久久久久黄色 | 国产99久久久精品 | 久久精品99精品国产香蕉 | 综合久久久久久久 | 久久久久国产一区二区三区四区 | 成人av在线播放网站 | www.91国产 | 国产精品九九久久久久久久 | 天天色棕合合合合合合 | 国产亚洲欧美精品久久久久久 | 国产拍揄自揄精品视频麻豆 | 国产三级午夜理伦三级 | 毛片网站观看 | 精品一区二区综合 | 久久av免费观看 | 久久久久激情视频 | 精品综合久久 | 亚洲v欧美v国产v在线观看 | 亚洲一级免费电影 | 一二三四精品 | 欧美男同网站 | 精品久久精品久久 | 91在线小视频| 国产在线精 | 美女在线免费观看视频 | 欧美va天堂在线电影 | 片黄色毛片黄色毛片 | 色99色| 男女视频久久久 | 激情综合色综合久久 | 久久无码av一区二区三区电影网 | 五月激情五月激情 | 国产精品情侣视频 | 色欧美88888久久久久久影院 | 成人欧美亚洲 | 欧美极品一区二区三区 | 国内精品免费久久影院 | 最新色站 | 国产精品成人av电影 | 韩国在线视频一区 | 欧美在线久久 | 韩日电影在线观看 | 成人免费观看网站 | 天天操天天爽天天干 | 三级黄色免费片 | 欧美性脚交 | 国产涩图 | 五月天九九 | 国产又粗又猛又爽 | 国产99区| av天天澡天天爽天天av | 亚洲精选久久 | 人人澡人| 国产黄在线看 | 午夜12点 | 色偷偷网站视频 | 国产亚洲一区 | 国产精品小视频网站 | 久久久久久久久综合 | 又黄又爽又湿又无遮挡的在线视频 | 久草热久草视频 | 欧美一区二区精品在线 | 国产精品久久影院 | 久久草在线免费 | 日韩精品亚洲专区在线观看 | 国产成人综 | 午夜在线日韩 | 日韩高清片 | www.色国产 | 92精品国产成人观看免费 | 久久精品欧美日韩精品 | 欧美极品xxx | 狠狠干天天操 | 黄色一集片 | 久久久久亚洲国产精品 | 91成熟丰满女人少妇 | 日韩精品一区电影 | 久久综合精品一区 | 五月色综合 | 国产精品video | 亚洲欧美成人网 | 91热在线| 亚洲第一区在线播放 | 9在线观看免费高清完整版 玖玖爱免费视频 | 亚洲视频网站在线观看 | 97精品一区二区三区 | 久久国产精品99久久久久 | www.国产毛片 | 婷婷www | 国产女人免费看a级丨片 | 国产亚洲日本 | 九月婷婷色 | 激情五月激情综合网 | 毛片网站观看 | 日韩av手机在线观看 | 最近日韩免费视频 | 丝袜美腿一区 | 奇米影音四色 | 午夜美女av | 国产精品午夜在线 | 欧美日韩国产一区二区三区 | 玖玖爱在线观看 | 五月开心综合 | 欧美日韩精品电影 | 狠狠干狠狠操 | 看国产黄色片 | 久久久久免费精品国产小说色大师 | 午夜精品久久久久久久99热影院 | 久久精品在线 | 亚洲三级网 | 欧美作爱视频 | 久久亚洲福利视频 | 日韩天天干| 欧美日韩精品久久久 | 久亚洲| 免费黄色av片 |