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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

《黑马程序员 MySQL数据库入门到精通,从MySQL安装到MySQL高级、MySQL优化全囊括》——学习笔记基础篇

發布時間:2023/12/9 数据库 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《黑马程序员 MySQL数据库入门到精通,从MySQL安装到MySQL高级、MySQL优化全囊括》——学习笔记基础篇 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基礎篇

前言

本文僅用作個人筆記使用,整理自《黑馬程序員 MySQL數據庫入門到精通,從MySQL安裝到MySQL高級、MySQL優化全囊括》(https://www.bilibili.com/video/BV1Kr4y1i7ru/)


什么是數據庫?

  • 數據庫:DataBase 簡稱 :DB
    • 是按照數據結構來組織、存儲和管理數據的倉庫。
    • 是保存有組織的數據的一種容器,通常表現為一個或一組文件
    • 我們也可以將數據存儲在文件中,但是在文件中讀寫數據速度相對較慢。
    • 所以,現在我們使用關系型數據庫管理系統(RDBMS)來存儲和管理大數據量。所謂的關系型數據庫,是建立在關系模型基礎上的數據庫,借助于集合代數等數學概念和方法來處理數據庫中的數據。
  • 數據庫的作用:將一組具有相同特征的數據以表為基礎單位通過存儲介質進行高效地存儲,存儲介質:內存、磁盤
  • 概念混淆點:數據庫及數據庫軟件是錯誤
  • 數據庫系統:DataBase System = DBMS + DB
  • 數據庫軟件——DBMS,數據庫管理系統,過DBMS來創建和管理數據庫
    • 一般開發人員會針對每一個應用創建一個數據庫。為保存應用中實體的數據,一般會在數據庫創建多個表,以保存程序中實體用戶的數據

數據庫類別

  • 基于存儲介質可以分為關系型數據庫非關系型數據庫

    • 關系型數據庫是將數據存放于磁盤中,非關系型數據庫則存放于內存里
    • 在數據訪問性能上看非關系型數據庫的效率更高;在數據安全性、持久性看,關系型數據庫有明顯優勢。關系型數據庫有利于數據的持久化保存與管理
  • 關系型數據庫產品:

    • 大型:Oracle、DB2

    • 中型:MySQL、SQL-SERVER等

    • 小型:access等

  • 非關系型數據庫產品:

    • Memcached
    • MongoDB
    • Redis(同步技術,數據同步到磁盤)
  • 數據庫排名:https://db-engines.com/en/ranking

  • 定義:關系型數據庫是建立在關系模型上的數據庫,關系模型是一種建立在關系上的模型,大致上分為:

    • 數據結構:數據以二維表形式存儲(行和列)
    • 操作指令集合:SQL語句
    • 完整性約束:對于表內的約束和表與表之間的約束(實體內部、實體之間)

而本文所學習、研究的對象就是RDBMS中的MySQL數據庫。

RDBMS 即關系數據庫管理系統(Relational Database Management System)的特點:

  • 數據以表格的形式出現
  • 每行為各種記錄名稱
  • 每列為記錄名稱所對應的數據域
  • 許多的行和列組成一張表單
  • 若干的表單組成database,格式統一,便于維護
  • 使用SQL語言操作,標準同意,使用方便

**概念:**建立在關系模型基礎上,由多張相互連接的二維表組成的數據庫。

SQL語言

SQL通用語法

  • SQL語句可以單行或多行書寫,最后以分號結尾

  • SQL語句可以使用空格/縮進來增強語句的可讀性。

  • MySQL數據庫的SQL語句不區分大小寫,但是為了可讀性建議關鍵字使用大寫。

  • 注釋:

    單行注釋: --單行注釋 或 #單行注釋多行注釋: /* 這是多行注釋 這是多行注釋 這是多行注釋 */
  • SQL分類

    分類全稱說明
    DDLData Definition Language數據定義語言,用來定義數據庫對象(數據庫,表,字段)
    DMLData Manipulation Language數據操作語言,用來對數據庫表中的數據進行增刪改
    DQLData Query Language數據查詢語言,用來查詢數據庫中表的記錄
    DCLData Control Language數據控制語言,用來創建數據庫的用戶以及權限的管理

    DDL-數據定義語言

    數據庫-查詢

    查詢所有數據庫:SHOW DATABASES;

    (Wed Aug 10 13:44:49 2022)[root@MySQL][(none)]>show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec)

    查詢當前數據庫:SELECT DATABASE();

    (Wed Aug 10 13:46:52 2022)[root@MySQL][mysql]>select database(); +------------+ | database() | +------------+ | mysql | +------------+ 1 row in set (0.00 sec)
    數據庫-創建

    創建數據庫:CREATE DATABASE [IF NOT EXISTS] 數據庫名稱 [DEFAULT CHARSET 編碼] [COLLATE 排序規則];

    #如果當前服務端不存在testdb數據庫的話就創建一個名叫testdb的數據庫,并指定它的編碼為utf8mb4。(Wed Aug 10 13:50:33 2022)[root@MySQL][(none)]>create database if not exists testdb default charset utf8mb4; Query OK, 1 row affected (0.00 sec)(Wed Aug 10 13:53:52 2022)[root@MySQL][(none)]>show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | testdb | +--------------------+ 5 rows in set (0.00 sec)

    在這里多提一嘴,在創建數據庫時不建議將編碼指定為utf8,因為在MySQL中utf8的存儲長度為3字節,而有一些特殊的字符需要占到4字節。

    數據庫-刪除

    刪除數據庫:DROP DATABASE [IF EXISTS] 數據庫名稱;

    #如果存在名稱為testdrop的數據庫,那么就將其刪除。(Wed Aug 10 14:01:00 2022)[root@MySQL][(none)]>show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | testdb | +--------------------+ 5 rows in set (0.00 sec)
    數據庫-切換

    切換數據庫:USE 數據庫名稱;

    #將當前數據庫切換至testdb數據庫。(Wed Aug 10 14:01:02 2022)[root@MySQL][(none)]>use testdb; Database changed (Wed Aug 10 14:02:34 2022)[root@MySQL][testdb]> #原先這里的none就變成了testdb
    表-數據類型

    原文地址:詳解MySQL數據類型 - 五月的倉頡 - 博客園 (cnblogs.com)

    整型
    數據類型字節數帶符號最小值帶符號最大值不帶符號最小值不帶符號最大值
    TINYINT1-1281270255
    SMALLINT2-3276832767065535
    MEDIUMINT3-83886088388607016777215
    INT4-2147483648214748364704294967295
    BIGINT8-92233720368547758089223372036854775807018446744073709551616

    即使是帶符號的BIGINT,其實也已經是一個天文數字了,什么概念,9223372036854775807我們隨便舉下例子:

    • 以byte為例可以表示8589934592GB–>8388608TB–>8192PB
    • 以毫秒為例可以表示292471208年

    所以從實際開發的角度,我們一定要為合適的列選取合適的數據類型,即到底用不用得到這種數據類型?舉個例子:

    • 一個枚舉字段明明只有0和1兩個枚舉值,選用TINYINT就足夠了,但在開發場景下卻使用了BIGINT,這就造成了資源浪費
    • 簡單計算一下,假使該數據表中有100W數據,那么總共浪費了700W字節也就是6.7M左右,如果更多的表這么做了,那么浪費的更多

    要知道,MySQL本質上是一個存儲,以Java為例,可以使用byte類型的地方使用了long類型問題不大,因為絕大多數的對象在程序中都是短命對象,方法執行完畢這塊內存區域就被釋放了,7個字節實際上不存在浪不浪費一說。但是MySQL作為一個存儲,8字節的BIGINT放那兒就放那兒了,占據的空間是實實在在的。

    舉個例子:

    drop table if exists test_tinyint; create table test_tinyint (num tinyint ) engine=innodb charset=utf8;insert into test_tinyint values(-100); insert into test_tinyint values(255);

    執行第7行的代碼時候報錯"Out of range value for column ‘num’ at row 1",即很清楚的我們可以看到插入的數字范圍越界了,這也同樣反映出MySQL中整型默認是帶符號的

    把第3行的num字段定義改為"num tinyint unsigned"第7的插入就不會報錯了,但是第6行的插入-100又報錯了,因為無符號整型是無法表示負數的。

    整型(N)形式

    在開發中,我們會碰到有些定義整型的寫法是int(11),這種寫法從我個人開發的角度看我認為是沒有多大用,不過作為一個知識點做一下講解吧。

    int(N)我們只需要記住兩點:

    • 無論N等于多少,int永遠占4個字節
    • N表示的是顯示寬度,不足的用0補足,超過的無視長度而直接顯示整個數字,但這要整型設置了unsigned zerofill才有效
    浮點型

    整型之后,下面是浮點型,在MySQL中浮點型有兩種,分別為float、double,它們用一張表格總結一下:

    數據類型字節數備注
    float4單精度浮點數
    double8雙精度浮點數

    從這個結果我們總結一下float(M,D)、double(M、D)的用法規則:

    • D表示浮點型數據小數點之后的精度,假如超過D位則四舍五入,即1.233四舍五入為1.23,1.237四舍五入為1.24
    • M表示浮點型數據總共的位數,D=2則表示總共支持五位,即小數點前只支持三位數,所以我們并沒有看到1000.23、10000.233、100000.233這三條數據的插入,因為插入都報錯了

    當我們不指定M、D的時候,會按照實際的精度來處理。

    定點型

    介紹完float、double兩種浮點型,我們介紹一下定點型的數據類型decimal類型,有了浮點型為什么我們還需要定點型?

    float、double類型存在精度丟失問題,即寫入數據庫的數據未必是插入數據庫的數據,而decimal無論寫入數據中的數據是多少,都不會存在精度丟失問題,這就是我們要引入decimal類型的原因,decimal類型常見于銀行系統、互聯網金融系統等對小數點后的數字比較敏感的系統中。

    最后講一下decimal和float/double的區別:

    • float/double在db中存儲的是近似值,而decimal則是以字符串形式進行保存的
    • decimal(M,D)的規則和float/double相同,但區別在float/double在不指定M、D時默認按照實際精度來處理而decimal在不指定M、D時默認為decimal(10, 0)
    日期類型

    接著我們看一下MySQL中的日期類型,MySQL支持五種形式的日期類型:date、time、year、datetime、timestamp,用一張表格總結一下這五種日期類型:

    數據類型字節數格式備注
    date3yyyy-MM-dd存儲日期值
    time3HH:mm:ss存儲時分秒
    year1yyyy存儲年
    datetime8yyyy-MM-dd HH:mm:ss存儲日期+時間
    timestamp4yyyy-MM-dd HH:mm:ss存儲日期+時間,可作時間戳

    MySQL的時間類型的知識點比較簡單,這里重點關注一下datetime與timestamp兩種類型的區別:

    • 上面列了,datetime占8個字節,timestamp占4個字節
    • 由于大小的區別,datetime與timestamp能存儲的時間范圍也不同,datetime的存儲范圍為1000-01-01 00:00:00——9999-12-31 23:59:59,timestamp存儲的時間范圍為19700101080001——20380119111407
    • datetime默認值為空,當插入的值為null時,該列的值就是null;timestamp默認值不為空,當插入的值為null的時候,mysql會取當前時間
    • datetime存儲的時間與時區無關,timestamp存儲的時間及顯示的時間都依賴于當前時區
    char和varchar類型

    最后看一下常用到的字符型,說到MySQL字符型,我們最熟悉的應該就是char和varchar了,關于char和varchar的對比,我總結一下:

  • char是固定長度字符串,其長度范圍為0255且與編碼方式無關,無論字符實際長度是多少,都會按照指定長度存儲,不夠的用空格補足;varchar為可變長度字符串,在utf8編碼的數據庫中其長度范圍為021844
  • char實際占用的字節數即存儲的字符所占用的字節數,varchar實際占用的字節數為存儲的字符+1或+2或+3
  • MySQL處理char類型數據時會將結尾的所有空格處理掉而varchar類型數據則不會
  • varchar型數據占用空間大小及可容納最大字符串限制探究

    接上一部分,我們這部分來探究一下varchar型數據實際占用空間大小是如何計算的以及最大可容納的字符串為多少,首先要給出一個結論:這部分和具體編碼方式有關,且MySQL版本我現在使用的是5.7,當然5.0之后的都是可以的

    先寫一段SQL創建表,utf8的編碼格式:

    drop table if exists test_varchar; create table test_varchar (varchar_value varchar(100000) ) engine=innodb charset=utf8;

    執行報錯:

    Column length too big for column 'varchar_value' (max = 21845); use BLOB or TEXT instead

    按照提示,我們把大小改為21845,執行依然報錯:

    Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

    改為21844就不會有問題,因此在utf8編碼下我們可以知道varchar(M),M最大=21844。那么gbk呢:

    drop table if exists test_varchar; create table test_varchar (varchar_value varchar(100000) ) engine=innodb charset=gbk;

    同樣的報錯:

    Column length too big for column 'varchar_value' (max = 32767); use BLOB or TEXT instead

    把大小改為32766,也是和utf8編碼格式一樣的報錯:

    Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

    可見gbk的編碼格式下,varchar(M)最大的M=32765,那么為什么會有這樣的區別呢,分點詳細解釋一下:

    • MySQL要求一個行的定義長度不能超過65535即64K
    • 對于未指定varchar字段not null的表,會有1個字節專門表示該字段是否為null
    • varchar(M),當M范圍為0<=M<=255時會專門有一個字節記錄varchar型字符串長度,當M>255時會專門有兩個字節記錄varchar型字符串的長度,把這一點和上一點結合,那么65535個字節實際可用的為65535-3=65532個字節
    • 所有英文無論其編碼方式,都占用1個字節,但對于gbk編碼,一個漢字占兩個字節,因此最大M=65532/2=32766;對于utf8編碼,一個漢字占3個字節,因此最大M=65532/3=21844,上面的結論都成立
    • 舉一反三,對于utfmb4編碼方式,1個字符最大可能占4個字節,那么varchar(M),M最大為65532/4=16383,可以自己驗證一下

    同樣的,上面是表中只有varchar型數據的情況,如果表中同時存在int、double、char這些數據,需要把這些數據所占據的空間減去,才能計算varchar(M)型數據M最大等于多少

    varchar、text和blob

    最后講一講text和blob兩種數據類型,它們的設計初衷是為了存儲大數據使用的,因為之前說了,MySQL單行最大數據量為64K。

    先說一下text,text和varchar是一組既有區別又有聯系的數據類型,其聯系在于當varchar(M)的M大于某些數值時,varchar會自動轉為text

    • M>255時轉為tinytext
    • M>500時轉為text
    • M>20000時轉為mediumtext

    所以過大的內容varchar和text沒有區別,同時varchar(M)和text的區別在于:

    • 單行64K即65535字節的空間,varchar只能用63352/65533個字節,但是text可以65535個字節全部用起來
    • text可以指定text(M),但是M無論等于多少都沒有影響
    • text不允許有默認值,varchar允許有默認值

    varchar和text兩種數據類型,使用建議是能用varchar就用varchar而不用text(存儲效率高),varchar(M)的M有長度限制,之前說過,如果大于限制,可以使用mediumtext(16M)或者longtext(4G)。

    至于text和blob,簡單過一下就是text存儲的是字符串而blob存儲的是二進制字符串,簡單說blob是用于存儲例如圖片、音視頻這種文件的二進制數據的。

    表-創建

    創建一張表:

    CREATE TABLE 表名稱(字段1 類型 [COMMENT 字段1注釋],字段2 類型 [COMMENT 字段2注釋],...字段n 類型 [COMMENT 字段n注釋] )[COMMENT 表注釋];

    思考一下,如何創建出下方這張表?

    idnameageclass
    1甲殼蟲22一班
    2花蝴蝶27一班
    3劉六六66二班
    (Wed Aug 10 14:22:35 2022)[root@MySQL][testdb]>CREATE TABLE table_student(-> id int COMMENT '編號',-> name varchar(10) COMMENT '姓名',-> age int COMMENT '年齡',-> class varchar(20) COMMENT '班級'-> ) COMMENT '學生表'; Query OK, 0 rows affected (0.01 sec)(Wed Aug 10 14:23:22 2022)[root@MySQL][testdb]>SHOW TABLES; +------------------+ | Tables_in_testdb | +------------------+ | table_student | +------------------+ 1 row in set (0.00 sec)
    表-查詢

    查詢當前數據庫下所有表:SHOW TABLES;

    (Wed Aug 10 14:18:05 2022)[root@MySQL][mysql]>SHOW TABLES; +------------------------------------------------------+ | Tables_in_mysql | +------------------------------------------------------+ | columns_priv | | component | | db | | default_roles | | engine_cost | | func | | general_log | | global_grants | | gtid_executed | | help_category | | help_keyword | | help_relation | | help_topic | | innodb_index_stats | | innodb_table_stats | | password_history | | plugin | | procs_priv | | proxies_priv | | replication_asynchronous_connection_failover | | replication_asynchronous_connection_failover_managed | | role_edges | | server_cost | | servers | | slave_master_info | | slave_relay_log_info | | slave_worker_info | | slow_log | | tables_priv | | time_zone | | time_zone_leap_second | | time_zone_name | | time_zone_transition | | time_zone_transition_type | | user | +------------------------------------------------------+ 35 rows in set (0.00 sec)

    查詢某一張表的表結構:DESC 表名稱;

    (Wed Aug 10 14:32:52 2022)[root@MySQL][testdb]>DESC table_student; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int | YES | | NULL | | | name | varchar(10) | YES | | NULL | | | age | int | YES | | NULL | | | class | varchar(20) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 4 rows in set (0.01 sec)

    查詢指定表的建表語句:SHOW CREATE TABLE 表名稱;

    (Wed Aug 10 14:33:44 2022)[root@MySQL][testdb]>SHOW CREATE TABLE table_student; +---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | table_student | CREATE TABLE `table_student` (`id` int DEFAULT NULL COMMENT '編號',`name` varchar(10) DEFAULT NULL COMMENT '姓名',`age` int DEFAULT NULL COMMENT '年齡',`class` varchar(20) DEFAULT NULL COMMENT '班級' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='學生表' | +---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.02 sec)
    表-修改

    添加字段:ALTER TABLE 表名 ADD 字段名 類型(長度) [COMMENT 注釋] [約束];

    #為emp表新增一個字段“昵稱”為nickname,類型為varchar(20)(Wed Aug 10 16:35:22 2022)[root@MySQL][testdb]>ALTER TABLE Employee_info ADD nickname varchar(20) comment '昵稱'; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0(Wed Aug 10 16:35:31 2022)[root@MySQL][testdb]>DESC Employee_info; +-------------------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------------+------------------+------+-----+---------+-------+ | id | int | YES | | NULL | | | employee_no | varchar(10) | YES | | NULL | | | employee_name | varchar(10) | YES | | NULL | | | employee_gender | char(1) | YES | | NULL | | | employee_age | tinyint unsigned | YES | | NULL | | | employee_idnum | char(18) | YES | | NULL | | | employee_hiredate | date | YES | | NULL | | | nickname | varchar(20) | YES | | NULL | | +-------------------+------------------+------+-----+---------+-------+ 8 rows in set (0.00 sec)

    修改數據類型:ALTER TABLE 表名 MODIFY 字段名 新數據類型(長度);

    修改字段名和字段類型:ALTER TABLE 表名 CHANGE 舊字段名 新字段名 新數據類型(長度) [COMMENT 注釋] [約束];

    #將Employee_info表的nickname字段修改為employee_username,類型為varchar(30)。(Wed Aug 10 16:45:47 2022)[root@MySQL][testdb]>ALTER TABLE Employee_info CHANGE nickname employee_username varchar(30); Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0(Wed Aug 10 16:46:19 2022)[root@MySQL][testdb]>DESC Employee_info; +-------------------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------------+------------------+------+-----+---------+-------+ | id | int | YES | | NULL | | | employee_no | varchar(10) | YES | | NULL | | | employee_name | varchar(10) | YES | | NULL | | | employee_gender | char(1) | YES | | NULL | | | employee_age | tinyint unsigned | YES | | NULL | | | employee_idnum | char(18) | YES | | NULL | | | employee_hiredate | date | YES | | NULL | | | employee_username | varchar(30) | YES | | NULL | | +-------------------+------------------+------+-----+---------+-------+ 8 rows in set (0.00 sec)

    修改表名:ALTER TABLE 表名 RENAME TO 新表名;

    #將Employee_info表名修改為Emp_info(Wed Aug 10 16:50:52 2022)[root@MySQL][testdb]>ALTER TABLE Employee_info RENAME TO Emp_info; Query OK, 0 rows affected (0.01 sec) (Wed Aug 10 16:53:09 2022)[root@MySQL][testdb]>SHOW TABLES; +------------------+ | Tables_in_testdb | +------------------+ | Emp_info | | table_student | +------------------+ 2 rows in set (0.00 sec)
    表-刪除

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

    #刪除Employee_info表的字段employee_username(Wed Aug 10 16:46:29 2022)[root@MySQL][testdb]>ALTER TABLE Employee_info DROP employee_username; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0(Wed Aug 10 16:50:46 2022)[root@MySQL][testdb]>DESC Employee_info; +-------------------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------------+------------------+------+-----+---------+-------+ | id | int | YES | | NULL | | | employee_no | varchar(10) | YES | | NULL | | | employee_name | varchar(10) | YES | | NULL | | | employee_gender | char(1) | YES | | NULL | | | employee_age | tinyint unsigned | YES | | NULL | | | employee_idnum | char(18) | YES | | NULL | | | employee_hiredate | date | YES | | NULL | | +-------------------+------------------+------+-----+---------+-------+ 7 rows in set (0.00 sec)

    刪除表:DROP TABLE [IF EXISTS] 表名;

    #刪除table_student表(Wed Aug 10 16:53:22 2022)[root@MySQL][testdb]>DROP TABLE IF EXISTS table_student; Query OK, 0 rows affected (0.01 sec)(Wed Aug 10 16:59:53 2022)[root@MySQL][testdb]>SHOW TABLES; +------------------+ | Tables_in_testdb | +------------------+ | Emp_info | +------------------+ 1 row in set (0.00 sec)

    刪除指定表,并重新創建該表:TRUNCATE TABLE 表名;

    (Wed Aug 10 17:00:14 2022)[root@MySQL][testdb]>TRUNCATE TABLE Emp_info; Query OK, 0 rows affected (0.01 sec)(Wed Aug 10 17:08:20 2022)[root@MySQL][testdb]>SHOW TABLES; +------------------+ | Tables_in_testdb | +------------------+ | Emp_info | +------------------+ 1 row in set (0.00 sec)
    小結
  • 數據庫操作
  • SHOW DATABASES; #查詢所有的數據庫 CREATE DATABASE 數據庫名; #創建一個新的數據庫 USE 數據庫名; #切換到該數據庫 SELECT DATABASE(); #查詢當前所在數據庫 DROP DATABASE 數據庫名; #刪除數據庫
  • 表操作
  • SHOW TABLES; CREATE TABLE 表名(字段 字段類型,字段 字段類型); DESC 表名; SHOW CREATE TABLE 表名; ALTERTABLE 表名 ADD/MODIFY/CHANGE/DROP/RENAME TO...; DROP TABLE 表名;

    DML-數據操作語言

    數據-添加

    給指定字段添加數據:INSERT INTO 表名(字段1,字段2,...) VALUES(值1,值2,...);

    (Thu Aug 11 14:49:37 2022)[root@MySQL][testdb]>INSERT INTO Emp_info(id,employee_no,employee_name,employee_gender,employee_age,employee_idnum,employee_hiredate) VALUES(2,'2','張十五','男',25,'123456789012345687','2021-05-16'); Query OK, 1 row affected (0.01 sec)(Thu Aug 11 14:58:07 2022)[root@MySQL][testdb]>select * from Emp_info; +------+-------------+---------------+-----------------+--------------+--------------------+-------------------+ | id | employee_no | employee_name | employee_gender | employee_age | employee_idnum | employee_hiredate | +------+-------------+---------------+-----------------+--------------+--------------------+-------------------+ | 1 | 1 | 劉六六 || 21 | 123456789012345678 | 2022-08-10 | | 2 | 2 | 張十五 || 25 | 123456789012345687 | 2021-05-16 | +------+-------------+---------------+-----------------+--------------+--------------------+-------------------+ 2 rows in set (0.00 sec)

    給全部字段添加數據:INSERT INTO 表名 VALUES(值1,值2,...);

    (Thu Aug 11 14:49:37 2022)[root@MySQL][testdb]>INSERT INTO Emp_info VALUES(1,'1','劉六六','男',21,'123456789012345678','2022-08-10'); Query OK, 1 row affected (0.01 sec)(Thu Aug 11 14:49:52 2022)[root@MySQL][testdb]>select * from Emp_info; +------+-------------+---------------+-----------------+--------------+--------------------+-------------------+ | id | employee_no | employee_name | employee_gender | employee_age | employee_idnum | employee_hiredate | +------+-------------+---------------+-----------------+--------------+--------------------+-------------------+ | 1 | 1 | 劉六六 || 21 | 123456789012345678 | 2022-08-10 | +------+-------------+---------------+-----------------+--------------+--------------------+-------------------+ 1 row in set (0.00 sec)

    批量添加數據:INSERT INTO 表名(字段1,字段2,...) VALUES(值1,值2,...),(值1,值2,...);

    INSERT INTO 表名 VALUES(字段1,字段2,...),(字段1,字段2,...),(字段1,字段2,...);

    (Thu Aug 11 14:58:25 2022)[root@MySQL][testdb]>INSERT INTO Emp_info VALUES(1,'1','劉六六','男',21,'123456789012345678','2022-08-10'),(1,'1','劉六六','男',21,'123456789012345678','2022-08-10'),(1,'1','劉六六','男',21,'123456789012345678','2022-08-10'),(1,'1','劉六六','男',21,'123456789012345678','2022-08-10'); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0(Thu Aug 11 15:00:01 2022)[root@MySQL][testdb]>select * from Emp_info; +------+-------------+---------------+-----------------+--------------+--------------------+-------------------+ | id | employee_no | employee_name | employee_gender | employee_age | employee_idnum | employee_hiredate | +------+-------------+---------------+-----------------+--------------+--------------------+-------------------+ | 1 | 1 | 劉六六 || 21 | 123456789012345678 | 2022-08-10 | | 2 | 2 | 張十五 || 25 | 123456789012345687 | 2021-05-16 | | 1 | 1 | 劉六六 || 21 | 123456789012345678 | 2022-08-10 | | 1 | 1 | 劉六六 || 21 | 123456789012345678 | 2022-08-10 | | 1 | 1 | 劉六六 || 21 | 123456789012345678 | 2022-08-10 | | 1 | 1 | 劉六六 || 21 | 123456789012345678 | 2022-08-10 | +------+-------------+---------------+-----------------+--------------+--------------------+-------------------+ 6 rows in set (0.01 sec)

    注意:

    • 插入數據時,指定的字段順序需要與值的順序是一一對應的。
    • 字符串和日期型數據應該包含在引號中。
    • 插入的數據大小,應該在字段的規定范圍內。
    數據-修改

    修改數據:UPDATE 表名 SET 字段1=值1,字段2=值2,...[WHERE 條件];

    注意:修改語句的條件可以有,也可以沒有,如果沒有條件,則會修改整張表的所有數據

    #修改id為1的數據,將name修改為王哈哈(Thu Aug 11 15:18:37 2022)[root@MySQL][testdb]>select * from Emp_info; +------+-------------+---------------+-----------------+--------------+--------------------+-------------------+ | id | employee_no | employee_name | employee_gender | employee_age | employee_idnum | employee_hiredate | +------+-------------+---------------+-----------------+--------------+--------------------+-------------------+ | 1 | 1 | 王哈哈 || 21 | 123456789012345678 | 2022-08-10 | | 2 | 2 | 張十五 || 25 | 123456789012345687 | 2021-05-16 | | 1 | 1 | 王哈哈 || 21 | 123456789012345678 | 2022-08-10 | | 1 | 1 | 王哈哈 || 21 | 123456789012345678 | 2022-08-10 | | 1 | 1 | 王哈哈 || 21 | 123456789012345678 | 2022-08-10 | | 1 | 1 | 王哈哈 || 21 | 123456789012345678 | 2022-08-10 | +------+-------------+---------------+-----------------+--------------+--------------------+-------------------+ 6 rows in set (0.00 sec) #修改id為2的數據,將name改為小花,gender改為女(Thu Aug 11 15:29:25 2022)[root@MySQL][testdb]>UPDATE Emp_info SET employee_name='小花',employee_gender='女' WHERE id=2; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0(Thu Aug 11 15:29:31 2022)[root@MySQL][testdb]>select * from Emp_info; +------+-------------+---------------+-----------------+--------------+--------------------+-------------------+ | id | employee_no | employee_name | employee_gender | employee_age | employee_idnum | employee_hiredate | +------+-------------+---------------+-----------------+--------------+--------------------+-------------------+ | 1 | 1 | 王哈哈 || 21 | 123456789012345678 | 2022-08-10 | | 2 | 2 | 小花 || 25 | 123456789012345687 | 2021-05-16 | | 1 | 1 | 王哈哈 || 21 | 123456789012345678 | 2022-08-10 | | 1 | 1 | 王哈哈 || 21 | 123456789012345678 | 2022-08-10 | | 1 | 1 | 王哈哈 || 21 | 123456789012345678 | 2022-08-10 | | 1 | 1 | 王哈哈 || 21 | 123456789012345678 | 2022-08-10 | +------+-------------+---------------+-----------------+--------------+--------------------+-------------------+ 6 rows in set (0.00 sec) #修改所有人的入職日期為2021年8月15日(Thu Aug 11 15:29:34 2022)[root@MySQL][testdb]>UPDATE Emp_info SET employee_hiredate='2021-08-15'; Query OK, 6 rows affected (0.00 sec) Rows matched: 6 Changed: 6 Warnings: 0(Thu Aug 11 15:33:41 2022)[root@MySQL][testdb]>select * from Emp_info; +------+-------------+---------------+-----------------+--------------+--------------------+-------------------+ | id | employee_no | employee_name | employee_gender | employee_age | employee_idnum | employee_hiredate | +------+-------------+---------------+-----------------+--------------+--------------------+-------------------+ | 1 | 1 | 王哈哈 || 21 | 123456789012345678 | 2021-08-15 | | 2 | 2 | 小花 || 25 | 123456789012345687 | 2021-08-15 | | 1 | 1 | 王哈哈 || 21 | 123456789012345678 | 2021-08-15 | | 1 | 1 | 王哈哈 || 21 | 123456789012345678 | 2021-08-15 | | 1 | 1 | 王哈哈 || 21 | 123456789012345678 | 2021-08-15 | | 1 | 1 | 王哈哈 || 21 | 123456789012345678 | 2021-08-15 | +------+-------------+---------------+-----------------+--------------+--------------------+-------------------+ 6 rows in set (0.00 sec)
    數據-刪除

    刪除數據:DELETE FROM 表名 [WHERE 條件];

    #刪除gender為男的員工(Thu Aug 11 15:33:42 2022)[root@MySQL][testdb]>DELETE FROM Emp_info WHERE employee_gender='男'; Query OK, 5 rows affected (0.00 sec)(Thu Aug 11 15:44:48 2022)[root@MySQL][testdb]>select * from Emp_info; +------+-------------+---------------+-----------------+--------------+--------------------+-------------------+ | id | employee_no | employee_name | employee_gender | employee_age | employee_idnum | employee_hiredate | +------+-------------+---------------+-----------------+--------------+--------------------+-------------------+ | 2 | 2 | 小花 || 25 | 123456789012345687 | 2021-08-15 | +------+-------------+---------------+-----------------+--------------+--------------------+-------------------+ 1 row in set (0.00 sec) #刪除所有員工(Thu Aug 11 15:44:52 2022)[root@MySQL][testdb]>DELETE FROM Emp_info; Query OK, 1 row affected (0.01 sec)(Thu Aug 11 15:46:40 2022)[root@MySQL][testdb]>select * from Emp_info; Empty set (0.00 sec)

    注意:

    • DELETE語句的條件可以有也可以沒有,如果不加上WHERE的話,是刪除整張表的數據。
    • DELETE語句不能刪除某一個字段的值,但可以使用UPDATE。
    小結
  • 數據操作
  • INSERT INTO 表名(字段1,字段2,...) VALUES(1,2,...); #對指定字段插入數據 UPDATE 表名 SET 字段1=1,字段2=2,...[WHERE 條件]; #更新指定字段的數據 DELETE FROM 表名 [WHERE 條件]; #刪除指定(全部)的數據

    DQL-數據查詢語言

    語法:

    SELECT字段1,字段2,... FROM1,2,... WHERE條件1,條件2,... GROUP BY分組字段1,分組字段2,... HAVING分組后條件1,分組后條件2,... ORDER BY排序字段1,排序字段2,... LIMIT分頁參數
    基本查詢
  • 查詢多個字段
  • SELECT 字段1,字段2, ... FROM 表名; #查詢指定的字段 SELECT * FROM 表名; #查詢所有字段
  • 設置別名
  • SELECT 字段1 [AS 別名1], 字段2 [AS 別名2], ... FROM 表名;
  • 去除重復記錄
  • SELECT DISTINCT 字段1,字段2, ... FROM 表名; #查詢指定的字段并去除重復記錄

    實例:

    #查詢指定字段 name,workno,age返回SELECT name,workno,age FROM emp; #查詢所有字段返回SELECT * FROM emp; #查詢所有員工的工作地址,起別名SELECT name AS '姓名',workaddress AS '工作地址' FROM emp; #查詢員工的工作地址,不要重復的SELECT DISTINCT workaddress FROM emp;
    條件查詢

    語法:SELECT 字段1,字段2,... FROM 表名 WHERE 條件...;

    實例:

    #查詢年齡為53歲的員工SELECT * FROM emp WHERE age = 53; #查詢年齡小于20的員工SELECT name,age FROM emp WHERE age < 20; #查詢年齡小于等于20的員工SELECT name,age FROM emp WHERE age <= 20; #查詢身份證號為空的員工SELECT name,idcard FROM emp WHERE idcard IS NULL; #查詢身份證號不為空的員工SELECT name,idcard FROM emp WHERE idcard IS NOT NULL; #查詢年齡不等于25的員工 SELECT name,age FROM emp WHERE age <> 25; #或 SELECT name,age FROM emp WHERE age != 25; #查詢年齡在18-28歲之間的員工SELECT name,age FROM emp WHERE age BETWEEN 18 AND 28; #查詢性別為女且年齡小于23的員工SELECT name,age,gender FROM emp WHERE gender='女' AND age < 23; #查詢年齡為18或23或40的員工SELECT name,age FROM emp WHERE age = 18 or age = 23 or age = 40; #查詢姓名為兩個字的員工SELECT name FROM emp WHERE name LIKE "__"; #查詢身份證號最后一位是X的員工SELECT name,idcard FROM emp WHERE idcard LIKE "%X";
    聚合函數
    函數說明
    count統計數量
    max最大值
    min最小值
    avg平均數
    sum求和

    語法:SELECT 聚合函數(字段) FROM 表名;

    實例:

    #統計該企業員工數量SELECT COUNT(*) FROM emp; #或 SELECT COUNT(字段) FROM emp; #統計該企業員工的平均年齡SELECT ROUND(AVG(age),0) FROM emp; #這里的ROUND是四舍五入,其中0是保留幾位小數,從0開始。 #統計該企業員工最大年齡SELECT MAX(age) FROM emp; #統計該企業員工最小年齡SELECT MIN(age) FROM emp; #統計北京市員工年齡之和以及平均值SELECT workaddress as '工作地址',SUM(age) as '北京地區年齡之和',AVG(age) as '北京地區年齡平均值' FROM emp WHERE workaddress = '北京市';

    注意:所有的NULL值不參與聚合函數的計算。

    分組查詢

    語法:SELECT 字段列表 FROM 表名 [WHERE 條件] GROUP BY 字段名 [HAVING 過濾條件]

    WHERE和HAVING的區別:

    • 執行的順序不同:WHERE時分組之前進行過濾,不滿足WHERE條件的數據不參與分組。而HAVING是對分組之后的結果進行過濾。
    • 判斷的條件不同:WHERE不能對聚合函數進行判斷,但是HAVING可以。

    實例:

    #根據性別分組,分別統計男性員工和女性員工的數量SELECT gender,count(*) FROM emp GROUP BY gender; #根據性別分組,統計男性員工和女性員工的平均年齡SELECT gender,ROUND(avg(age),0) FROM emp GROUP BY gender; #查詢年齡小于45的員工,并根據工作地址分組,獲取員工數量大于等于100的工作地址 SELECT workaddress,COUNT(*) FROM emp WHERE age < 45 GROUP BY workaddress HAVING COUNT(*) >= 100;

    注意

    • 執行順序:WHERE -> 聚合函數 -> HAVING。
    • 分組之后,查詢的字段一般為聚合函數和分組字段。
    排序查詢

    語法:SELECT 字段1, 字段2,... FROM 表名 ORDER BY 字段1 排序方式1, 字段2 排序方式2;

    排序方式:

    • ASC:升序(默認)
    • DESC:降序

    注意:如果是多字段排序,當第一個字段值相同時,才會根據第二個字段進行排序。

    #根據年齡對員工進行升序排序SELECT * FROM emp ORDER BY age ASC; #根據入職時間,對員工進行降序排序SELECT * FROM emp ORDER BY entrydate DESC; #根據年齡對員工進行升序排序,年齡相同再根據入職時間降序排序SELECT * FROM emp ORDER BY age ASC, entrydate DESC;
    分頁查詢

    語法:SELECT 字段1, 字段2, ... FROM 表名 LIMIT 起始索引, 查詢的記錄條數;

    注意:

    • 起始索引從0開始,起始索引=(查詢頁碼 - 1)* 查詢的記錄條數。
    • 分頁查詢是數據庫的方言,不同的數據庫有不同的實現,MySQL中是LIMIT。
    • 如果查詢的是第一頁的數據,則可以忽略起始索引。

    實例:

    #查詢第16頁員工數據,每頁顯示50條數據 SELECT * FROM emp LIMIT 750, 50;
    小測試
    #查詢年齡為20,21,22,23歲的員工信息SELECT * FROM emp WHERE age BETWEEN 20 AND 23; #查詢性別為男,年齡在30-50歲(含)且名字為三個字的員工SELECT name,age FROM emp WHERE age BETWEEN 30 AND 50 AND name LIKE '___'; #統計員工表中,年齡小于50的男性員工和女性員工人數。SELECT gender,COUNT(*) FROM emp WHERE age < 50 GROUP BY gender; #查詢所有年齡小于等于35歲員工的姓名和年齡,并對查詢結果根據年齡升序排序,如果年齡相同按入職時間降序排序SELECT name,age FROM emp WHERE age <= 35 ORDER BY age, entrydate DESC; #查詢性別為男,且年齡在30-50歲(含)以內的前20個員工信息,對結果按年齡升序排序,如果年齡相同按入職時間升序排序SELECT * FROM emp WHERE age BETWEEN 30 AND 50 ORDER BY age, entrydate LIMIT 20;
    執行順序

    編寫順序:SELECT -> FROM -> WHERE -> GROUP BY -> HAVING -> ORDER BY -> LIMIT

    執行順序:FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY -> LIMIT

    小結

    1.DQL語句

    SELECT字段1,字段2,... FROM1,2,... WHERE條件1,條件2,... GROUP BY分組字段1,分組字段2,... HAVING分組后條件1,分組后條件2,... ORDER BY排序字段1,排序字段2,... LIMIT分頁參數

    DCL-數據控制語言

    用戶-查詢用戶
    #查詢所有用戶USE mysql; SELECT * FROM user;
    用戶-創建用戶

    語法:CREATE USER '用戶名'@'主機名' IDENTIFIED BY '密碼';

    #創建一個新用戶名為Mask1密碼為MySQL123,只能被本機localhost登錄CREATE USER 'Mask1'@'localhost' IDENTIFIED BY 'MySQL123'; #創建一個新用戶名為Mask2密碼為MySQL123,且可以被任意主機登錄CREATE USER 'Mask2'@'%' IDENTIFIED BY 'MySQL123';
    用戶-修改密碼

    語法:ALTER USER '用戶名'@'主機名' IDENTIFIED WITH mysql_native_password BY '新密碼';

    #修改Mask2用戶的密碼為MySQL321ALTER USER 'Mask2'@'%' IDENTIFIED BY 'MYSQL321';
    用戶-刪除用戶

    語法:DROP USER '用戶名'@'主機名';

    #刪除Mask1用戶 DROP USER 'Mask1'@'localhost';

    注意:主機名可以用’%'通配。


    常用權限:

    權限說明
    ALL,ALL PRIVILEGES所有權限
    SELECT查詢數據
    INSERT插入數據
    UPDATE修改數據
    DELETE刪除數據
    ALTER修改表
    DROP刪除數據庫/表/視圖
    CREATE創建數據庫/表
    權限-查詢權限

    語法:SHOW GRANTS FOR '用戶名'@'主機名';

    #查詢Mask2用戶的權限SHOW GRANTS FOR 'Mask2'@'%';
    權限-授予權限

    語法:GRANT 權限 ON 數據庫名.表名 TO '用戶名'@'主機名';

    #給Mask2用戶所有數據庫所有表的ALL PRIVILEGES權限GRANT ALL PRIVILEGES ON *.* TO 'Mask2'@'%';
    權限-撤銷權限

    語法:REVOKE 權限 ON 數據庫名.表名 FROM '用戶名'@'主機名';

    #撤銷Mask2用戶的所有權限REVOKE ALL PRIVILEGES ON *.* FROM 'Mask2'@'localhost';

    注意:

    • 多個權限之間,使用逗號分割。
    • 授權時,數據庫名和表名可以使用’**'進行通配,代表所有。
    小結
    #用戶管理 CREATE USER '用戶名'@'主機名' IDENTIFIED BY '密碼'; ALTER USER '用戶名'@'主機名' IDENTIFIED WITH mysql_native_password BY '新密碼'; DROP USER '用戶名'@'主機名'; #權限控制 SHOW GRANTS FOR '用戶名'@'主機名'; GRANT ALL PRIVILEGES ON *.* TO 'Mask2'@'%'; REVOKE ALL PRIVILEGES ON *.* FROM 'Mask2'@'localhost';

    函數

    函數是指一段可以直接被另一端程序調用的程序或代碼。

    字符串函數

    函數說明
    CONCAT(S1,S2,…)字符串拼接,將S1,S2,…拼接成一個字符串
    LOWER(STR)將字符串STR全部轉為小寫R
    UPPER(STR)將字符串STR全部轉為大寫
    LPAD(STR,N,PAD)左填充,用字符串PAD對STR左邊進行填充,使STR字符串長度達到N
    RPAD(STR,N,PAD)右填充,用字符串PAD對STR右邊進行填充,使STR字符串長度達到N
    TRIM(STR)去掉字符串頭部和尾部的空格
    SUBSTRING(STR,START,LEN)返回字符串STR從START位置開始的LEN個長度的字符串

    實例:

    #由于業務需求變更,企業員工工號統一為5位數,不足5位數的全部在前面補0.UPDATE emp SET workno = LPAD(workno,5,'0');

    數值函數

    函數說明
    CEIL(X)向上取整
    FLOOR(X)向下取整
    MOD(X,Y)返回X/Y的模
    RAND()返回0-1之間的隨機數
    ROUND(X,Y)求參數X的四舍五入值,并保留Y位小數

    實例:

    #通過函數,生成一個六位數的隨機驗證碼SELECT LPAD(ROUND(RAND()*1000000,0),6,0);

    日期函數

    函數說明
    CURDATE()返回當前日期
    CURTIME()返回當前時間
    NOW()返回當前日期和時間
    YEAR(DATE)獲取指定DATE的年份
    MONTH(DATE)獲取指定DATE的月份
    DAY(DATE)獲取指定DATE的日期
    DATE_ADD(DATE, INTERVAL EXPR TYPE)返回一個日期/時間值加上一個時間間隔expr后的時間值
    DATEDIFF(DATE1,DATE2)返回起始時間DATE1和結束時間DATE2之間的天數

    實例:

    #查詢所有員工的入職天數SELECT name,DATEDIFF(CURDATE(),entrydate) AS entryday FROM EMP ORDER BY entryday DESC;

    流程函數

    函數說明
    IF(VALUE,T,F)如果VALUE為true,返回t,否則返回f
    IFNULL(VALUE1,VALUE2)如果VALUE1不為空,返回VALUE1,否則返回VALUE2
    CASE WHEN [VAL1] THEN [RES1] … ELSE [DEFAULT] END如果VAL1為true,返回RES1,…否則返回DEFAULT
    CASE [EXPR] WHEN [VAL1] THEN [RES1] … ELSE [DEFAULT] END如果EXPR的值等于VAL1,返回RES1, … 否則返回DEFAULT

    實例:

    #查詢員工姓名和工作地址(北京上海->一線城市,其他->二線城市)SELECT name,CASE WHEN workaddress='北京市' or workaddress='上海市' THEN '一線城市' ELSE '二線城市' END FROM EMP; create table score( id int comment 'ID', name varchar(20) comment '姓名', math int comment '數學', english int comment '英語', chinese int comment '語文' ) comment '學生成績表'; #統計班級各個學員的成績,規則如下:>= 85,顯示優秀>= 60,顯示及格否則顯示不及格

    小結

  • 字符串函數
  • CONCAT,LOWER,UPPER,LPAD,RPAD,TRIM,SUBSTRING
  • 數值函數
  • CEIL,FLOOR,MOD,RAND,ROUND
  • 日期函數
  • CURDATE,CURTIME,NOW,YEAR,MONTH,DAY,DATE_ADD,DATEDIFF
  • 流程函數
  • IF,IFNULL,CASE[...] WHEN ... THEN ... ELSE... END

    約束

    概述

  • 概念:約束是作用于表中字段上的規則,用于限制存儲在表中的數據。

  • 目的:保證數據庫中數據的正確、有效和完整性。

  • 分類:

    約束描述關鍵字
    非空約束限制該字段的數據不能為NULLNOT NULL
    唯一約束保證該字段的所有數據都是唯一并不重復的UNIQUE
    主鍵約束主鍵是一行數據的唯一標識,要求非空且唯一PRIMARY KEY
    默認約束保存數據時,如果未指定該字段的值,則采用默認DEFAULT
    檢查約束(8.0.16版本+)保證字段值滿足某一個條件CHECK
    外鍵約束用來讓兩張表的數據之間建立連接,保證數據的一致性和完整性FOREIGN KEY
  • 注意:約束是作用于表中字段上的,可以在創建表/修改表的時候添加約束

    約束演示

    需求表:

    字段名字段含義字段類型約束條件
    idID唯一標識int主鍵,自動遞增
    name姓名varchar(10)不為空
    age年齡int大于0,小于120
    status狀態char(1)如果沒有值默認為1
    gender性別char(1)
    create table user( id int PRIMARY KEY AUTO_INCREMENT comment'主鍵lID', name varchar(10) NOT NULL comment'姓名', age int CHECK(age > 0 && age<120) comment'年齡', status char(1) DEFAULT 1 comment'狀態', gender char(1) comment'性別' ) comment'用戶表';

    外鍵約束

    概念:外鍵用來讓兩張表之間建立連接,從而保證數據的一致性和完整性。

    注意:在數據庫層面,未建立外鍵關聯,是無法保證數據的一致性和完整性的。

    語法:

    #創建表時添加外鍵 CREATE TABLE 表名(字段名 數據類型,字段名 數據類型 [CONSTRAINT] [外鍵名稱] FOREIGN KEY(外鍵字段名) REFERENCES 主表(主表列名) );#創建表后添加外鍵 ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY(外鍵字段名) REFERENCES 主表(主表列名);#刪除外鍵 ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱;

    實例:

    #為emp表的dept_id字段添加外鍵,關聯dept表的id字段。ALTER TABLE emp ADD CONSTRAINT fk_emp_dept_id FOREIGN KEY(dept_id) REFERENCES dept(id); #刪除名為fk_emp_dept_id的外鍵ALTER TABLE emp DROP FOREIGN KEY fk_emp_dept_id;
    刪除/更新行為
    行為說明
    NO ACTION當在父表中刪除/更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則不允許刪除/更新。 (與 RESTRICT 一致) 默認行為
    RESTRICT當在父表中刪除/更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則不允許刪除/更新。 (與 NO ACTION 一致) 默認行為
    CASCADE當在父表中刪除/更新對應記錄時,首先檢查該記錄是否有對應外鍵,如果有,則也刪除/更新外鍵在子表中的記錄。
    SET NULL當在父表中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則設置子表中該外鍵值為null(這就要求該外鍵允許取null)。
    SET DEFAULT父表有變更時,子表將外鍵列設置成一個默認的值 (Innodb不支持)

    小結

  • 非空約束:NOT NULL
  • 唯一約束:UNIQUE
  • 主鍵約束:PRIMARY KEY
  • 默認約束:DEFAULT
  • 檢查約束:CHECK
  • 外鍵約束:FOREIGN KEY
  • 多表查詢

    多表關系

    項目開發中,在進行數據庫表結構設計時,會根據業務需求及業務模塊之間的關系,分析并設計表結構,由于業務之間相互關聯,所以各個表結構之間也存在著各種聯系,基本上分為三種:

    • 一對多(多對一)
    • 多對多
    • 一對一
    一對多(多對一)
    • 例如:部門與員工的關系、班級與學生的關系
    • 關系:一個部門對應多個員工,一個班級對應多個學生
    • 實現:在多的一方建立外鍵,指向一的一方的主鍵。學生(外鍵)->班級(主鍵)
    多對多
    • 例如:學生與課程的關系
    • 關系:一個學生可以選修多門課程,一個課程可以被多個學生選修
    • 實現:建立一張中間表,至少包含兩個外鍵,分別關聯兩方主鍵
    一對一
    • 例如:用戶與個人詳情的關系
    • 關系:一對一關系,多用于單表拆分,將一張表的基礎字段放在一張表中,其他詳細字段放在另一張表中,以提升操作效率
    • 實現:在任意一方添加外鍵,關聯另一方的主鍵,并且設置外鍵為唯一(UNIQUE)

    多表查詢概述

    • 概述:從多張表中查詢數據
    • 笛卡爾積:笛卡爾乘積是指在數學中,兩個集合A和B的所有組合情況。(在多表查詢時,需要消除無效的笛卡爾積)
    • 分類:
      • 連接查詢
        • 內連接:相當于查詢A、B交集部分數據
        • 外連接:
          • 左外連接:查詢左表所有數據,以及兩張表交集部分數據
          • 右外連接:查詢右表所有數據,以及兩張表交集部分數據
        • 自連接:當前表與自身的連接查詢,自連接必須使用表別名

    內連接

    語法:

    #隱式內連接 SELECT 字段列表 FROM 表列表 WHERE 條件...;#顯式內連接 SELECT 字段列表 FROM1 [INNER] JOIN2 ON 連接條件;

    內連接查詢的是兩張表交集的部分

    實例:

    #查詢每一個員工的姓名,以及關聯的部門名稱(隱式) SELECT emp.name,dept.name FROM emp,dept WHERE emp.dept_id = dept.id;#查詢每一個員工的姓名,以及關聯的部門名稱(顯示) SELECT e.name,d.name FROM emp e INNER JOIN dept d ON e.dept_id = d.id;

    外連接

    語法:

    #左外連接 SELECT 字段列表 FROM1 LEFT [OUTER] JOIN2 ON 條件...;#右外連接 SELECT 字段列表 FROM1 RIGHT [OUTER] JOIN2 ON 條件...;

    實例:

    #查詢emp表的所有數據,和對應的部門信息(左外連接) SELECT * FROM emp e LEFT OUTER JOIN dept d ON e.dept_id = d.id;#查詢dept表的所有數據,和對應的員工信息(右外連接) SELECT d.*,e.* FROM emp e RIGHT OUTER JOIN dept d ON e.dept_id = d.id;

    自連接

    語法:

    SELECT 字段列表 FROM 表A 別名A JOIN 表A 別名B ON 條件...;

    自鏈接查詢,可以是內連接查詢,也可以是外連接查詢

    實例:

    #查詢員工及其直屬領導的名字 SELECT e1.name 員工,e2.name 領導 FROM emp e1 JOIN emp e2 ON e1.managerid = e2.id;#查詢所有員工emp及其領導的名字emp,如果沒有領導也要查詢出來 SELECT e1.*,e2.name 領導 FROM emp e1 LEFT JOIN emp e2 ON e1.managerid = e2.id;

    聯合查詢

    對于UNION查詢,就是把多次查詢的結果合并起來,形成一個新的查詢結果集

    語法:

    SELECT 字段列表 FROM 表A ... UNION [ALL] SELECT 字段列表 FROM 表B ...;

    實例:

    #將薪資低于5000的員工,和年齡大于50歲的員工都查詢出來。 SELECT * FROM emp WHERE salary < 5000 UNION SELECT * FROM emp WHERE age > 50 ORDER BY id ASC;
    • 對于聯合查詢的多張表的列數必須保持一致,字段類型也需要保持一致
    • UNION ALL會直接將兩個結果集合并,而UNION會進行去重

    子查詢

    概念:SQL語句中嵌套SELECT語句,稱為嵌套查詢,又稱子查詢

    語法:

    SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);

    子查詢外部的語句可以是INSERT/UPDATE/DELETE/SELECT的任何一個

    根據子查詢結果不同,分為:

    • 標量子查詢(結果為單個值)
    • 列子查詢(結果為一列)
    • 行子查詢(結果為一行)
    • 表子查詢(結果為多行多列)

    根據子查詢位置,分為:WHERE之后、FROM之后、SELECT之后

    標量子查詢

    子查詢返回的結果是單個值(數字、字符串、日期等),最簡單的形式,這種子查詢稱為標量子查詢。

    常用操作符:=、<>、>、>=、<、<=

    實例:

    #查詢銷售部的所有員工信息 SELECT * FROM emp WHERE dept_id = (SELECT id FROM dept WHERE name = '銷售部');#查詢方東白之后入職的員工信息 SELECT * FROM emp WHERE entrydate > (SELECT entrydate FROM emp WHERE name = '方東白');
    列子查詢

    子查詢返回的結果是一列(可以是多行),這種子查詢稱為列子查詢

    常用操作符:IN、NOT IN、ANT、SOME、ALL

    操作符描述
    IN在指定的集合范圍內,多選一
    NOT IN不在指定的集合范圍之內
    ANY子查詢返回列表中,有任意一個滿足即可
    SOME與ANY相同,使用SOME的地方都可以使用ANY
    ALL子查詢返回的所有值都必須滿足

    實例:

    #查詢銷售部和市場部的所有員工信息 SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE name = '銷售部' OR name = '市場部');#查詢比財務部所有人工資都高的員工信息 SELECT * FROM emp WHERE salary > ALL (SELECT salary FROM emp WHERE dept_id = (SELECT id FROM dept WHERE name = '財務部'));#查詢比研發部其中任意一人工資高的員工信息 SELECT * FROM emp WHERE salary > ANY (SELECT salary FROM emp WHERE dept_id = (SELECT id FROM dept WHERE name = '研發部'));
    行子查詢

    子查詢返回的結果是一行(可以是多列),這種子查詢稱為行子查詢。

    常用操作符:=、<>、IN、NOT IN

    實例:

    #查詢與張無忌的薪資及直屬領導都相同的員工 SELECT * FROM emp WHERE salary = (SELECT salary FROM emp WHERE name = '張無忌') AND managerid = (SELECT managerid FROM emp WHERE name = '張無忌'); #或 SELECT * FROM emp WHERE (salary,managerid) = (SELECT salary,managerid FROM emp WHERE name = '張無忌');
    表子查詢

    子查詢返回的結果是多行多列,這種子查詢稱為表子查詢

    常用操作符:IN

    實例:

    #查詢與鹿杖客、宋遠橋的職位和薪資相同的員工信息SELECT * FROM emp WHERE job IN (SELECT job FROM emp WHERE name = '鹿杖客' OR name = '宋遠橋') AND salary IN (SELECT salary FROM emp WHERE name = '鹿杖客' OR name = '宋遠橋');#查詢入職日期是2006-01-01之后的員工信息,及部門信息 SELECT e.*,d.name FROM emp e LEFT JOIN dept d ON e.dept_id = d.id WHERE e.entrydate > '2006-01-01';

    多表查詢案例

    #查詢員工的姓名、年齡、職位、部門信息 SELECT e.name,e.age,e.job,d.name FROM emp e LEFT JOIN dept d ON e.dept_id = d.id;#查詢年齡小于30歲的員工姓名、年齡、職位、部門信息 SELECT e.name,e.age,e.job,d.name FROM emp e LEFT JOIN dept d ON e.dept_id = d.id WHERE age < 30;#查詢擁有員工的部門ID、部門名稱 SELECT d.* FROM dept d WHERE d.id IN (SELECT e.dept_id FROM emp e);#查詢所有年齡大于40的員工,及其歸屬的部門名稱;如果員工沒有分配部門,也需要展示出來 SELECT e.name,d.name FROM emp e LEFT JOIN dept d ON e.dept_id = d.id WHERE e.age > 40;#查詢所有員工的工資等級 SELECT e.name,s.grade FROM emp e,salgrade s WHERE e.salary >s.losal AND e.salary <s.hisal;#查詢研發部所有員工的信息及工資等級 SELECT e.name,s.grade FROM emp e,salgrade s WHERE e.salary >s.losal AND e.salary <s.hisal AND e.dept_id = 1;#查詢研發部員工的平均工資 SELECT AVG(salary) FROM emp WHERE dept_id = 1;#查詢工資比滅絕高的員工信息 SELECT * FROM emp WHERE salary > (SELECT salary FROM emp WHERE name = '滅絕');#查詢比平均工資高的員工信息 SELECT * FROM emp WHERE salary > (SELECT AVG(salary) FROM emp);#查詢比本部門平均工資低的員工信息 SELECT * FROM emp e2 WHERE e2.salary < (SELECT AVG(e1.salary) FROM emp e1 WHERE e1.dept_id = e2.dept_id);#查詢所有的部門信息,并統計部門的員工人數 SELECT d.id,d.name,(SELECT COUNT(*) FROM emp e WHERE e.dept_id = d.id) 人數 FROM dept d;

    小結

  • 多表關系
  • 一對多:在多的一方設置外鍵,關聯一的主鍵
  • 多對多:建立中間表,中間表包含兩個外鍵,關聯雙方主鍵
  • 一對一:用于表結構查費呢,在其中任何一方設置外鍵(UNIQUE),關聯另一方的主鍵
  • 多表查詢
  • 內連接
  • 隱式內連接
    SELECT 字段列表 FROM 表列表 WHERE 條件...;
  • 顯式內連接
    SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 連接條件;
  • 外連接
  • 左外連接
    SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 條件...;
  • 右外連接
    SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 條件...;
  • 自連接
  • SELECT 字段列表 FROM 表A 別名A JOIN 表A 別名B ON 條件...;
  • 子查詢
  • SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
  • 事務

    事務簡介

    事務是一組操作的集合,他是一個不可分割的工作單位,事務會把所有的操作作為一個整體一起向系統提交或撤銷操作請求,即這些操作要么同時成功,要么同時失敗。

    MySQL默認事務是自動提交的,也就是當執行一條DML(數據操作語言)時,MySQL會馬上隱式的提交事務。

    事務操作

    #表準備 drop table if exists account; create table account( id int primary key AUTO_INCREMENT comment 'ID', name varchar(10) comment '姓名', money double(10,2) comment '余額' ) comment '賬戶表'; insert into account(name, money) VALUES ('張三',2000), ('李四',2000); #張三給李四轉賬1000元#1.查詢張三賬戶余額 SELECT money FROM account WHERE name = '張三';#2.將張三賬戶余額減少1000 UPDATE account SET money = money - 1000 WHERE name = '張三';#3.將李四賬戶余額增加1000 UPDATE account SET money = money + 1000 WHERE name = '李四';

    查看/設置事務提交方式:

    SELECT @@AUTOCOMMIT;#1--為開啟自動提交; 0--為關閉自動提交; SET @@AUTOCOMMIT = 0;#關閉自動提交

    提交事務:

    COMMIT;

    回滾事務:

    ROLLBACK;

    開啟事務:

    START TRANSACTIONBEGIN;

    提交事務:

    COMMIT;

    回滾事務:

    ROLLBACK;

    事務四大特性(ACID)

    • 原子性(Atomicity):事務是不可分割的最小操作單元,要么全部成功,要么全部失敗
    • 一致性(Consistency):事務完成時,必須使所有的數據都保持一致狀態
    • 隔離性(Isolation):數據庫系統提供的隔離機制,保證事務在不受外部并發操作影響的獨立環境下運行
    • 持久性(Durability):事務一旦提交或回滾,它對數據庫中的數據的改變就是永久的。

    并發事務問題

    問題說明
    臟讀一個事務讀到另一個事務還沒有提交的數據
    幻讀一個事務按照條件查詢數據時,沒有對應的數據行,但是在插入時,又發現這行數據已經存在了,好像出現了“幻覺”
    不可重復讀一個事務先后讀取同一條記錄,但兩次讀取出來的數據不同,稱為不可重復讀

    事務隔離級別

    隔離級別臟讀不可重復讀幻讀
    Read Uncommitted讀未提交
    Read Committed讀已提交(Orcal默認)×
    Repeatable Read可重復讀(MySQL默認)××
    Serializable串行化×××
    #查看事務隔離級別 SELECT @@TRANSACTION_ISOLATION;#設置事務隔離級別 SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}

    注意:事務隔離級別越高,數據越安全,性能越低。

    小結

    • 事務簡介

      • 事務是一組操作的集合,他是一個不可分割的工作單位,事務會把所有的操作作為一個整體一起向系統提交或撤銷操作請求,即這些操作要么同時成功,要么同時失敗。
    • 事務操作

      • START TRANSACTION;#開啟事務 COMMIT/ROLLBACK;#提交或回滾
    • 四大特性

      • 原子性(Atomicity)
      • 一致性(Consistency)
      • 隔離性(Isolation)
      • 持久性(Durability)
    • 并發事務問題

      • 臟讀
      • 幻讀
      • 不可重復讀
    • 事務隔離級別

      • READ UNCOMMITTED讀未提交
      • READ COMMITTED讀已提交
      • REPEATABLE READ可重復讀
      • SERIALIZABLE串行化
        李四’;
    查看/設置事務提交方式:```sql SELECT @@AUTOCOMMIT;#1--為開啟自動提交; 0--為關閉自動提交; SET @@AUTOCOMMIT = 0;#關閉自動提交

    提交事務:

    COMMIT;

    回滾事務:

    ROLLBACK;

    開啟事務:

    START TRANSACTIONBEGIN;

    提交事務:

    COMMIT;

    回滾事務:

    ROLLBACK;

    事務四大特性(ACID)

    • 原子性(Atomicity):事務是不可分割的最小操作單元,要么全部成功,要么全部失敗
    • 一致性(Consistency):事務完成時,必須使所有的數據都保持一致狀態
    • 隔離性(Isolation):數據庫系統提供的隔離機制,保證事務在不受外部并發操作影響的獨立環境下運行
    • 持久性(Durability):事務一旦提交或回滾,它對數據庫中的數據的改變就是永久的。

    并發事務問題

    問題說明
    臟讀一個事務讀到另一個事務還沒有提交的數據
    幻讀一個事務按照條件查詢數據時,沒有對應的數據行,但是在插入時,又發現這行數據已經存在了,好像出現了“幻覺”
    不可重復讀一個事務先后讀取同一條記錄,但兩次讀取出來的數據不同,稱為不可重復讀

    事務隔離級別

    隔離級別臟讀不可重復讀幻讀
    Read Uncommitted讀未提交
    Read Committed讀已提交(Orcal默認)×
    Repeatable Read可重復讀(MySQL默認)××
    Serializable串行化×××
    #查看事務隔離級別 SELECT @@TRANSACTION_ISOLATION;#設置事務隔離級別 SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}

    注意:事務隔離級別越高,數據越安全,性能越低。

    小結

    • 事務簡介

      • 事務是一組操作的集合,他是一個不可分割的工作單位,事務會把所有的操作作為一個整體一起向系統提交或撤銷操作請求,即這些操作要么同時成功,要么同時失敗。
    • 事務操作

      • START TRANSACTION;#開啟事務 COMMIT/ROLLBACK;#提交或回滾
    • 四大特性

      • 原子性(Atomicity)
      • 一致性(Consistency)
      • 隔離性(Isolation)
      • 持久性(Durability)
    • 并發事務問題

      • 臟讀
      • 幻讀
      • 不可重復讀
    • 事務隔離級別

      • READ UNCOMMITTED讀未提交
      • READ COMMITTED讀已提交
      • REPEATABLE READ可重復讀
      • SERIALIZABLE串行化

    總結

    以上是生活随笔為你收集整理的《黑马程序员 MySQL数据库入门到精通,从MySQL安装到MySQL高级、MySQL优化全囊括》——学习笔记基础篇的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    日韩91av | 一级片视频在线 | 精品久久一区 | 免费亚洲黄色 | 伊人影院在线观看 | 免费黄色在线网址 | 伊人伊成久久人综合网小说 | 香蕉久草在线 | 国产一级淫片免费看 | 精品视频在线免费 | 黄色毛片在线观看 | 99色网站 | 日本三级中文字幕在线观看 | 99九九热只有国产精品 | 色成人亚洲网 | 欧美性天天 | 精品9999| 天天色天天爱天天射综合 | 久草网在线 | 国产专区日韩专区 | 国产精品手机在线播放 | 韩日精品在线 | 中文字幕网站视频在线 | 国产99一区二区 | 麻豆激情电影 | 97碰碰精品嫩模在线播放 | 色爱区综合激月婷婷 | 日韩免费av网址 | 国产精品视频内 | 久久这里只有精品1 | 91精品国产成人 | 日韩欧美在线视频一区二区 | 天天av资源 | 午夜精品久久久久久久久久久久久久 | 日本特黄一级 | 精品久久国产一区 | 日韩和的一区二在线 | 波多野结依在线观看 | 天天干天天射天天插 | 国产一区在线免费观看视频 | 欧美激情视频一二区 | 国产麻豆剧传媒免费观看 | 欧美激情第28页 | 18av在线视频 | 久久精品视频观看 | 天天色视频 | 在线观看91视频 | 精品麻豆入口免费 | 99久久精品无免国产免费 | 欧美大片aaa| 深爱激情五月婷婷 | 天天色 天天 | 欧美日韩一区二区三区视频 | 欧美成人手机版 | 国产黄色观看 | 一个色综合网站 | 免费av网站在线看 | 欧美一区二区伦理片 | 国产精品久久久久久久久久久免费 | 69av视频在线观看 | 伊人亚洲精品 | 国产麻豆精品免费视频 | 99热在线免费观看 | 亚洲免费成人av电影 | 九色精品 | 国产美女精品久久久 | 国产精品久久久亚洲 | www.com在线观看 | 国产九九精品视频 | 一级特黄aaa大片在线观看 | 国产亚洲视频在线免费观看 | 国产午夜影院 | 天天干,夜夜爽 | 三级黄色在线观看 | 日韩欧美综合视频 | 黄色官网在线观看 | 欧美999| 日日爽天天爽 | 午夜精品电影 | 麻豆精品传媒视频 | 91看片在线免费观看 | 亚洲开心激情 | 国产在线欧美日韩 | 99久久夜色精品国产亚洲 | 偷拍区另类综合在线 | 成人国产综合 | 国产精选在线 | 亚洲一区二区三区精品在线观看 | 黄色福利网站 | 精品久久久久久亚洲综合网站 | 久久精品91久久久久久再现 | 91久久人澡人人添人人爽欧美 | 又黄又刺激又爽的视频 | 国产九九九视频 | 欧美精品一区二区三区一线天视频 | 国产成人一区二区啪在线观看 | 午夜精品一区二区三区可下载 | 韩日成人av | 99精品国产高清在线观看 | 中文字幕有码在线观看 | 六月激情久久 | 久久久久日本精品一区二区三区 | 色香网| 久草在线费播放视频 | 日韩精品aaa| 日本高清中文字幕有码在线 | 蜜臀久久99精品久久久无需会员 | 日日综合| 久久99亚洲网美利坚合众国 | 丁香国产视频 | 天天操,夜夜操 | 日本高清xxxx | 久产久精国产品 | 国内精品久久久久久久久久久久 | а天堂中文最新一区二区三区 | 国产日产欧美在线观看 | 免费欧美 | 久久精品亚洲一区二区三区观看模式 | 97香蕉视频 | 久久久精品国产免费观看一区二区 | 黄网站污| 97久久久免费福利网址 | 91久久在线观看 | 在线观看第一页 | 17videosex性欧美| 91中文字幕一区 | 黄色精品视频 | 日韩欧美精品在线视频 | 999久久久精品视频 日韩高清www | 人人爽人人香蕉 | 免费精品久久久 | 狠狠狠狠狠狠操 | 在线视频欧美精品 | 亚洲草视频 | 久久久电影网站 | 久久国产精品99久久久久 | 久久情网 | 91九色视频导航 | 国产一线二线三线在线观看 | 午夜影院一级 | 日韩精品一区二区三区中文字幕 | 500部大龄熟乱视频 欧美日本三级 | 成人午夜电影在线 | 国产男男gay做爰 | 国产精品亚洲视频 | 日韩av看片 | 毛片网站在线 | 日韩av电影一区 | 日韩色综合 | 日韩在线色视频 | 国产成人一区二区三区在线观看 | 欧美韩日精品 | 免费涩涩网站 | 国产韩国日本高清视频 | 香蕉久草| 人人澡视频 | 欧美精品一二三 | 日韩免费中文字幕 | 69欧美视频| 99精品视频在线观看播放 | 一区二区激情 | 成人sm另类专区 | 成人影音av| 国产成人精品av在线 | 日韩午夜在线播放 | 四虎www.| 久草视频在线播放 | 超碰99人人 | 国产偷国产偷亚洲清高 | 亚洲欧美国产精品久久久久 | 深爱激情站 | 91精品啪| 色偷偷av男人天堂 | 欧美黑人猛交 | 精品96久久久久久中文字幕无 | 美女视频久久久 | 免费黄色一区 | 日本精品一区二区三区在线观看 | 久久精品美女 | 99精品久久99久久久久 | 成人黄色毛片视频 | 久久久久久福利 | 免费看一级特黄a大片 | 久久久91精品国产 | 欧美一进一出抽搐大尺度视频 | 在线免费观看国产视频 | 久久久久国产免费免费 | 狠狠操狠狠干天天操 | 毛片99| 国产视频日韩视频欧美视频 | 久久久电影 | 手机av电影在线 | 在线看中文字幕 | 在线视频麻豆 | 69av在线播放 | 91精品秘密在线观看 | 国产精品久久久久aaaa九色 | 成人免费一区二区三区在线观看 | www黄com| 日韩在线网址 | av福利在线免费观看 | 天操夜夜操 | 狠狠色伊人亚洲综合成人 | 久久99精品久久久久婷婷 | 日韩com| 成年人免费在线观看网站 | 国产一级黄色av | aaawww| 婷婷网在线 | 91丨精品丨蝌蚪丨白丝jk | 亚洲理论影院 | 欧美一级片 | 成年人视频免费在线播放 | 精品久久久久久久久亚洲 | 亚洲欧美色婷婷 | 99免费在线视频 | 久久久天天操 | 91精选在线观看 | 人人舔人人舔 | 不卡视频一区二区三区 | 九九视频热| 在线看片91 | 在线观看免费黄视频 | 国产福利在线不卡 | 黄色av高清 | 免费亚洲精品 | 欧美一级片免费播放 | 国产精品嫩草55av | 久久精品www人人爽人人 | 五月网婷婷 | 久草在线费播放视频 | 久久国产精品二国产精品中国洋人 | 欧美日韩一区二区视频在线观看 | 久久人人爽人人 | 久久久私人影院 | 久久国产精品免费观看 | 久久99精品视频 | 99爱视频 | 99视频在线播放 | 欧美经典久久 | av直接看| 亚洲一区精品人人爽人人躁 | 97视频在线免费 | 久久最新 | 国产精品一区二区av影院萌芽 | 国产艹b视频 | 国产精品手机在线观看 | 亚洲午夜精品一区 | 欧美伦理一区二区三区 | 日本一区二区三区视频在线播放 | 久久久999免费视频 日韩网站在线 | 一本一道久久a久久综合蜜桃 | 日韩一区二区在线免费观看 | 999久久久精品视频 日韩高清www | 色就是色综合 | 久久久私人影院 | 免费av网站在线看 | 精品国产_亚洲人成在线 | 黄色免费观看网址 | 免费一区在线 | 免费亚洲视频 | 91精品系列 | 国产黄a三级三级三级三级三级 | 91麻豆文化传媒在线观看 | 国产97色在线 | 99久久爱| 五月天久久婷婷 | 国产在线播放观看 | www.xxx.性狂虐 | 国产精品一区在线播放 | 久久成人综合视频 | 国产精品成人一区二区 | 久草国产在线观看 | 免费在线观看黄网站 | 久久综合久久八八 | 色婷婷啪啪免费在线电影观看 | 久草在线 | av在线网站观看 | 国产精品24小时在线观看 | 一级黄网 | 99精品成人 | 99久久国产免费,99久久国产免费大片 | 美女黄视频免费 | 欧美十八 | 国产精品99久久久久久小说 | 在线免费观看视频一区 | 免费看一级特黄a大片 | 97久久精品午夜一区二区 | 成人 国产 在线 | 久久高清国产 | 国产精品日韩在线观看 | 国产日产亚洲精华av | 天天干,天天操 | 免费看十八岁美女 | 在线免费观看视频你懂的 | 亚洲高清av在线 | 日本中文字幕高清 | 免费看污在线观看 | 国产精品久久久久久一二三四五 | 国产亚洲小视频 | 日韩久久激情 | 国产日产高清dvd碟片 | 99麻豆久久久国产精品免费 | 久久精品国产亚洲精品 | 91av视频免费观看 | 欧美日韩网址 | 五月婷婷在线观看 | 福利视频午夜 | 国产精品一区欧美 | 成人精品一区二区三区电影免费 | 黄污在线看 | 在线观看一区 | 激情久久久 | 97成人精品视频在线观看 | 精品久久五月天 | 99久高清在线观看视频99精品热在线观看视频 | 天天曰天天爽 | 日韩精品一区二区三区免费观看 | 精品久久美女 | 亚洲精品国产第一综合99久久 | 国产黄网站在线观看 | 免费精品视频在线 | 国产高清在线永久 | 日韩精品在线看 | 在线观看一区二区视频 | 国产视频久久 | 在线观看91| 国产精品久久久久久一二三四五 | 国产精品精品国产色婷婷 | 51久久成人国产精品麻豆 | 一本一道波多野毛片中文在线 | 国产精品对白一区二区三区 | 亚洲综合在线观看视频 | 婷婷在线色 | 黄色av电影免费观看 | 人人玩人人爽 | 狠狠操电影网 | 波多野结衣动态图 | 青青草在久久免费久久免费 | 日日爽日日操 | 免费看黄在线观看 | 久久免费成人网 | 黄色三级网站在线观看 | 色播五月激情五月 | www.狠狠色 | 亚洲 欧美变态 另类 综合 | 中文字幕网址 | 狠狠干网址| 18久久久久 | 在线中文字幕一区二区 | 一级黄色片在线免费看 | 欧美日韩精品电影 | 免费观看日韩av | 色噜噜在线观看视频 | 亚洲视频在线观看 | 亚洲综合在线五月天 | 九七人人干 | 久久精品久久综合 | 久久精品小视频 | 伊香蕉大综综综合久久啪 | 久久久www成人免费毛片麻豆 | 久久久亚洲国产精品麻豆综合天堂 | 中文字幕视频播放 | 天天艹天天 | 国产男女爽爽爽免费视频 | 婷婷在线免费观看 | 三级黄色网络 | 欧美精品乱码99久久影院 | 人人澡人人爽 | 精品在线观看免费 | 西西44人体做爰大胆视频 | 国产亚洲视频在线观看 | 911香蕉视频 | 午夜色场 | av直接看 | 久久网站最新地址 | 国产福利91精品一区二区三区 | 日本精品久久久久中文字幕 | 久久综合导航 | 日韩高清在线不卡 | 在线免费观看一区二区三区 | 国产一区福利 | 亚洲黄色一级电影 | 99精品欧美一区二区 | 97免费视频在线播放 | 婷婷五月情 | 国产成人99av超碰超爽 | 成年人黄色av| 欧美精品久久久久久久免费 | 手机在线视频福利 | 国产亚洲精品电影 | 欧美日韩aaaa | 国产精品 日韩 欧美 | 91大神电影 | 国产高清免费在线观看 | 成人免费xyz网站 | 国产黄色片免费在线观看 | 免费av网址在线观看 | 黄色毛片网站在线观看 | 中文字幕一区二区三区四区久久 | 成人亚洲欧美 | 欧美黑人xxxx猛性大交 | 亚洲一区精品二人人爽久久 | 国产在线1区 | 国产成人亚洲精品自产在线 | 亚洲,国产成人av | 91精品国产网站 | 五月黄色| 中文资源在线观看 | 国产成人精品综合久久久久99 | 欧美激精品 | 超碰伊人网 | 最新在线你懂的 | 99亚洲精品在线 | www久久99| 在线观看日韩免费视频 | 99热免费在线 | 久久九九影院 | 三级视频日韩 | 亚洲国内精品视频 | 日韩区欠美精品av视频 | 国产视频中文字幕 | 在线精品在线 | 日韩中出在线 | 成人av免费在线观看 | 国产精品二区三区 | 亚洲成人精品在线观看 | 欧美日韩xxx| 久久久午夜剧场 | 国产 日韩 在线 亚洲 字幕 中文 | www.黄色小说.com| 黄色小说视频网站 | 欧美久久久久久久久久久久久 | 手机看片 | 美女福利视频网 | 精品视频在线看 | 一区三区视频在线观看 | 热re99久久精品国产66热 | 久草免费在线视频观看 | 天天综合区| 免费av试看 | 亚州精品在线视频 | 黄色片视频免费 | 99精品欧美一区二区 | 欧美精品一区二区三区四区在线 | 久久免费在线观看视频 | 国产在线日本 | 亚洲一区日韩 | 亚洲精品免费播放 | 国产精品一区电影 | 免费一级片视频 | 亚洲最新av在线 | 最新日韩中文字幕 | 亚洲成人av片在线观看 | 二区中文字幕 | 欧美一级黄色片 | 亚洲综合欧美激情 | 在线中文字幕网站 | 精品一区二区精品 | 粉嫩av一区二区三区入口 | 午夜精品久久久久久久99 | 91精品国产高清自在线观看 | 成人在线观看网址 | 欧美久久久久久久久久 | 国产视频精品免费播放 | 国产日韩精品欧美 | 青青河边草观看完整版高清 | 91成人免费观看视频 | 日本在线观看一区二区三区 | 日av免费| 中文字幕在线字幕中文 | 婷婷.com| 久久a级片| 18国产精品白浆在线观看免费 | 欧美久久久久久久久 | 玖操| 99热只有精品在线观看 | 国产精品成人久久久久久久 | 国产999精品久久久 免费a网站 | 精品国产乱子伦一区二区 | 高潮久久久久久 | 色偷偷男人的天堂av | 成年人网站免费在线观看 | 黄色在线观看网站 | 国产黑丝一区二区 | 亚洲国产小视频在线观看 | 亚洲精品国产品国语在线 | 久久精品视频在线观看免费 | 日韩久久久久久久久久 | 麻豆一区二区 | 国产黑丝一区二区三区 | 久久国产片 | 亚洲欧美乱综合图片区小说区 | 精品一区二区综合 | 国产精品一区二区果冻传媒 | 西西4444www大胆无视频 | 国产精品免费一区二区 | 免费一级片久久 | 日韩中文字幕在线不卡 | 日韩av图片 | 91桃色视频| 国产精品99久久久久 | 亚洲天堂网站 | 五月开心六月伊人色婷婷 | 亚洲涩涩色 | 国精产品一二三线999 | 91片在线观看 | 激情五月五月婷婷 | 欧美日韩国产二区三区 | 人人射人人澡 | 久久久久看片 | 不卡av电影在线 | 欧美资源 | 在线中文字幕视频 | 日本精品久久久久中文字幕5 | 综合久久婷婷 | av在线播放快速免费阴 | 欧美 另类 交 | 色婷婷狠狠五月综合天色拍 | 在线看av的网址 | 国产成人久久av免费高清密臂 | 狠狠躁日日躁狂躁夜夜躁av | 日韩网站一区二区 | 黄色免费网战 | 久久久资源网 | 波多野结衣视频在线 | 综合久久久 | 视频一区二区国产 | 中文字幕在线一区二区三区 | 久久免费成人 | 美女免费视频观看网站 | 久久看毛片 | 99久久久国产精品免费99 | 国色天香在线观看 | 激情六月婷婷久久 | 99久久久国产免费 | 国产高清视频免费在线观看 | 日韩视频一二三区 | 日韩在线免费高清视频 | 国产高清视频色在线www | 国产精品亚洲片夜色在线 | 亚洲理论影院 | 91精品国产综合久久久久久久 | 麻豆传媒视频在线免费观看 | 丁香婷婷激情网 | 欧美激情视频免费看 | 91成人免费视频 | 国产美女黄网站免费 | 国产福利在线不卡 | 国产精品久久伊人 | 精品久久电影 | 久久婷婷五月综合色丁香 | 欧美一级视频在线观看 | 97精品国产91久久久久久 | 男女免费视频观看 | 亚洲欧美日韩不卡 | 天天综合网在线观看 | 日本大片免费观看在线 | 国内久久精品视频 | 五月婷婷操| 亚洲国产综合在线 | 天堂av一区二区 | 国产精品大片在线观看 | 五月天中文在线 | 久久精品一区二区三区中文字幕 | 日韩二区在线播放 | 激情综合一区 | 狠狠色噜噜狠狠狠狠2022 | 不卡视频在线看 | 中文字幕免费看 | 日日操网站 | adn—256中文在线观看 | 亚洲最新视频在线播放 | 久久91久久久久麻豆精品 | 最新av网址在线 | 91成人精品 | 国产成人免费在线 | 超级碰99 | 精品国产1区 | 亚洲国产丝袜在线观看 | 激情av一区二区 | 香蕉视频在线播放 | 日本激情动作片免费看 | 91chinesexxx| 日韩性xxx| 99热在线免费观看 | 久久亚洲成人网 | 欧美精品久久久久久久久久久 | 欧美日韩国产一区二区在线观看 | 成人一级免费视频 | 久久国产精品久久w女人spa | 亚洲视频2 | 欧美精品久久久久久久久免 | 日本黄色a级大片 | 色全色在线资源网 | 亚洲精品免费在线观看视频 | 欧美日韩三级在线观看 | www.超碰97.com | 久久天天操 | 久久久av电影| 91精品无人成人www | 99精品视频一区二区 | 国产成人精品一区二区三区网站观看 | 国内精品福利视频 | 国产精品成人a免费观看 | 日韩av有码在线 | 午夜手机电影 | 国产精品 视频 | www91在线观看 | 国产精在线| 在线视频精品 | 欧美黑人性猛交 | 亚洲综合网站在线观看 | 99久久久久免费精品国产 | 亚洲日本激情 | 国产伦精品一区二区三区在线 | 国产在线国偷精品产拍 | 国产亚洲精品美女 | 五月激情六月丁香 | 精品国产一区二区三区日日嗨 | 国产一区免费看 | 免费高清无人区完整版 | 亚洲国产精品小视频 | 国产在线看一区 | 91av精品 | 国产小视频在线播放 | 黄色片网站大全 | 日韩精品一区二区三区视频播放 | 欧美日韩午夜爽爽 | 麻豆91小视频 | 日日摸日日添日日躁av | 久久综合丁香 | 免费看国产曰批40分钟 | 久久久2o19精品 | 日韩在线观看一区二区 | 国产在线观看你懂的 | 福利av影院 | 天天插天天操天天干 | 国产精品一区二区三区免费视频 | 精品国产色 | 五月婷激情 | 尤物97国产精品久久精品国产 | 狠狠狠狠狠狠狠狠 | 91在线播 | 久久亚洲国产精品 | 天天草网站 | 欧美一区二区伦理片 | 欧美性生活免费看 | 精品99在线视频 | 欧美日韩免费一区 | 日韩久久久久久久 | 粉嫩av一区二区三区四区五区 | 99精品视频在线免费观看 | 国产一级性生活视频 | zzijzzij亚洲日本少妇熟睡 | 欧美日韩破处 | 欧美少妇xxx | 中文字幕观看在线 | 国内久久看 | 又黄又爽的免费高潮视频 | 黄色毛片观看 | 91黄色免费看 | 欧美人人爱 | 国产一区自拍视频 | 亚洲六月丁香色婷婷综合久久 | 日韩精品久久久久久 | 婷婷丁香av | 成人在线免费看视频 | 中文字幕4 | 国内一级片在线观看 | 九九热免费在线视频 | 欧洲亚洲精品 | avwww在线| 高清在线观看av | 久久精品久久久久 | 亚洲激情精品 | 6080yy午夜一二三区久久 | 中文字幕免费观看视频 | a v在线观看 | 色天天久久 | 激情小说网站亚洲综合网 | 伊人手机在线 | 91久久精品一区二区二区 | 国产精品久久久久久影院 | 日本护士撒尿xxxx18 | 欧美日韩视频在线观看一区二区 | 欧美性色综合网 | 九色琪琪久久综合网天天 | 日日麻批40分钟视频免费观看 | 91成品视频 | 精品久久久网 | 久草精品电影 | 久久精品五月 | 91精品视频网站 | 国产在线999 | 九九九在线观看 | 亚洲免费av网站 | 日日干美女 | 国内三级在线 | 国内久久久久 | 东方av免费在线观看 | 亚洲免费视频在线观看 | 国产一级一级国产 | 日韩av偷拍| 国产成人免费高清 | 欧美日韩一级久久久久久免费看 | 97超在线| 欧美夫妻生活视频 | 青青河边草免费观看完整版高清 | 国产在线不卡视频 | 超碰在线最新 | 少妇bbbb搡bbbb搡bbbb | 天天操夜夜操天天射 | 97看片| 最近中文字幕国语免费av | 国内精品中文字幕 | 在线亚洲人成电影网站色www | 99热超碰在线 | 久久三级毛片 | 黄色在线观看网站 | 国产999视频 | 91av美女| 亚洲四虎在线 | 精品免费视频123区 午夜久久成人 | 成人亚洲网 | 91精品对白一区国产伦 | 丁香综合网 | 99r国产精品 | 国产一二区免费视频 | 日韩av快播电影网 | 久久国产美女 | 在线观看mv的中文字幕网站 | 久久久一本精品99久久精品 | se婷婷| 黄色小说视频在线 | 亚洲视频1区2区 | 国产伦精品一区二区三区高清 | 亚洲狠狠干 | 精品久久久免费视频 | 狠狠狠色丁香婷婷综合久久五月 | 天天色天天艹 | 手机看片午夜 | 四虎国产精品成人免费影视 | 日韩一三区 | 丁香婷婷电影 | 日韩黄色免费在线观看 | 成年人天堂com | 99热在线观看免费 | 久视频在线播放 | 在线观看一 | 91在线视频导航 | www日韩在线观看 | 四虎在线免费观看 | 免费看黄色毛片 | 国产在线看一区 | 久久久免费在线观看 | 三三级黄色片之日韩 | 午夜精品在线看 | 激情文学丁香 | 久久国产品 | 亚洲精品久久在线 | 97超碰中文字幕 | 日本久久电影网 | 2022国产精品视频 | 欧美性生交大片免网 | 欧美精品一区二区在线观看 | 天天射天天爱天天干 | 97av精品 | 国产精品久久久久久电影 | 亚洲综合导航 | 日韩久久午夜一级啪啪 | 99精品一级欧美片免费播放 | 麻豆精品视频在线 | 中文av不卡| 激情综合色播五月 | 97超碰国产精品女人人人爽 | 国产免费黄视频在线观看 | 天天干天天干 | 欧美色道| 亚洲免费在线视频 | 欧美激情精品久久久久久 | 国产成人亚洲在线观看 | av中文天堂在线 | 亚洲在线日韩 | 国产又粗又硬又爽的视频 | 99视频免费观看 | 在线中文字幕一区二区 | 国产精品高清免费在线观看 | 摸bbb搡bbb搡bbbb | 成人免费一级 | 天天躁天天操 | 国产精品免费观看国产网曝瓜 | 国产精品无 | 五月婷综合 | 91你懂的 | 久久精品99国产精品酒店日本 | 最新av在线播放 | 黄色视屏av | av超碰在线 | 91亚洲欧美 | 成人久久久久久久久久 | 免费av免费观看 | 在线视频手机国产 | 天天摸天天舔天天操 | 国产精品日韩欧美 | 天天草天天操 | 97超碰国产在线 | 伊人影院在线观看 | 视频在线观看入口黄最新永久免费国产 | 国产99黄 | 欧美精品免费视频 | 911久久香蕉国产线看观看 | 又黄又爽又色无遮挡免费 | 免费视频你懂的 | 国产高潮久久 | 欧美日韩精品电影 | 五月激情婷婷丁香 | 亚洲精品日韩在线观看 | 成人91在线观看 | 99久久精品国产一区二区三区 | 亚洲经典视频 | 午夜电影 电影 | 免费看黄色毛片 | 天天操夜操视频 | 国产成本人视频在线观看 | 丰满少妇在线观看网站 | 久久久久激情视频 | 欧美日韩一区二区在线 | 天天操操操操操操 | 久久精品视频网站 | 91在线日本| 中日韩免费视频 | 91视频三区| 国产精品日韩久久久久 | 天天综合网 天天 | 六月激情网 | 日韩a级黄色片 | 日韩欧美视频免费观看 | av在线成人 | 久草在线观看视频免费 | 日日操网 | 高清不卡一区二区三区 | 国产精品亚洲人在线观看 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 在线观看亚洲国产 | www狠狠 | 成人午夜剧场在线观看 | www.色午夜.com| 免费观看久久 | 五月婷社区 | 天天综合网天天综合色 | 欧美日一级片 | 久久99精品久久久久久秒播蜜臀 | 六月丁香综合 | 国产女人40精品一区毛片视频 | 国产精品免费久久久久影院仙踪林 | 国产高清视频网 | 日韩理论视频 | 日本久久中文字幕 | 久久精品这里热有精品 | 免费在线观看黄 | 国产精品涩涩屋www在线观看 | 国产五月色婷婷六月丁香视频 | 亚洲人在线 | 一本一道久久a久久综合蜜桃 | 四虎影视精品永久在线观看 | 午夜精品999| 国内精品小视频 | av网站免费在线 | 一区二区不卡高清 | 狠狠色丁婷婷日日 | 免费在线观看av不卡 | www免费视频com━ | 99视频精品免费视频 | 国产v在线| 精品xxx| 免费a网址| 一区二区三区在线免费 | 久久精品精品电影网 | 五月婷在线观看 | 欧美成人基地 | 久久精品一级片 | 在线观看黄色小视频 | 一区中文字幕在线观看 | 特级毛片aaa | 在线观看国产区 | 成人在线视频在线观看 | 成人蜜桃视频 | 亚洲天堂自拍视频 | 欧美a级成人淫片免费看 | 欧美久久精品 | 亚洲一区精品人人爽人人躁 | 四虎最新入口 | www.操.com| 91手机视频 | 天堂av在线中文在线 | 国产精品美女久久久 | 欧美孕妇与黑人孕交 | 国产一级高清视频 | 日本精品视频在线 | 97人人视频| 日韩精品一二三 | 成人免费在线看片 | 亚洲精品在线观看的 | 国产精品久久久久久五月尺 | 亚洲 综合 专区 | 国产又粗又长的视频 | 五月天婷婷狠狠 | 成人av网址大全 | 一区二区三区在线观看 | 中文字幕久久久精品 | 国产精品区在线观看 | 久久夜视频 | 天天干天天操人体 | 久久精品之 | 黄a在线 | 午夜精品久久久久久久99水蜜桃 | 亚洲综合在线视频 | 在线 你懂| 操操爽| 美女视频一区二区 | 国产精品国产亚洲精品看不卡 | 午夜av在线 | 不卡的av电影 | 欧美一级大片在线观看 | 午夜10000| 好看的国产精品视频 | 国产精品久久精品 | 国产 中文 日韩 欧美 | 在线免费观看视频你懂的 | 成人a大片 | 波多野结衣在线视频免费观看 | 在线观看中文字幕一区 | 成人中心免费视频 | 日韩午夜剧场 | 婷婷丁香在线 | 久久久久这里只有精品 | 久久在线精品 | 久久国产精品99国产 | 国产福利91精品张津瑜 | 国产一区二区电影在线观看 | 亚洲涩涩网站 | 日韩精品一区二区三区免费观看视频 | 中文网丁香综合网 | 9797在线看片亚洲精品 | 欧美一级日韩免费不卡 | 午夜视频免费播放 | 美女视频黄频大全免费 | 日韩电影黄色 | 九九热久久免费视频 | 亚洲国产中文字幕在线视频综合 | 天天干.com | 激情影院在线 | 久草在线资源免费 | 黄色在线观看免费 | 欧美一区二区精美视频 | 99精品久久久久久久 | 伊人五月天婷婷 | 免费看的黄网站软件 | 婷婷国产一区二区三区 | 精品免费观看视频 | 精品一区二区亚洲 | 69中文字幕| 伊人伊成久久人综合网站 | 成x99人av在线www | 国产精久久| av再线观看| 狠狠干夜夜爽 | 密桃av在线 | 日韩精品中文字幕久久臀 | 特级xxxxx欧美 | 日日干天天插 | 狠狠天天 | 91av视频| 国产精彩在线视频 | 96精品高清视频在线观看软件特色 | 日韩精品久久久久 | 日韩 国产 | 国产精品mm | 日韩亚洲国产精品 | 日韩欧美视频二区 | 黄色亚洲免费 | 91九色精品国产 | 亚洲成色777777在线观看影院 | 精品国产一区二区三区不卡 | 蜜桃av人人夜夜澡人人爽 | 另类老妇性bbwbbw高清 | 99视频免费观看 | 超碰av免费 | 99久久er热在这里只有精品15 | 久草在线视频在线观看 | 国产一二三在线视频 | 丁香激情综合久久伊人久久 | 婷婷综合五月天 | 亚洲激精日韩激精欧美精品 | 国产黄色在线网站 | 国产精品二区在线 | 深爱五月激情网 |