MySQL 基礎(chǔ)

作者:Gakki

1. 基礎(chǔ)

1.1 數(shù)據(jù)庫(kù)管理系統(tǒng)(數(shù)據(jù)庫(kù)軟件)

  • 關(guān)系型數(shù)據(jù)庫(kù)(RDBMS)
  1. Oracle 數(shù)據(jù)庫(kù)
  2. MySQL 數(shù)據(jù)庫(kù)
  3. SQL server 數(shù)據(jù)庫(kù)
  4. PostgreSQL
  5. SQLite
  • 非關(guān)系型數(shù)據(jù)庫(kù)(NoSQL)
  1. Redis(最好的緩存數(shù)據(jù)庫(kù))
  2. MongoDB(最好的文檔型數(shù)據(jù)庫(kù))
  3. Elasticsearch(最好的搜索服務(wù))
  4. Cassandra(最好的列式數(shù)據(jù)庫(kù))
  5. HBase(優(yōu)秀的分布式、列式數(shù)據(jù)庫(kù))

2. MySQL 的 DDL 操作

2.1 DDL 解釋

  • DDL(Data Definition Language):數(shù)據(jù)定義語(yǔ)言,該語(yǔ)言部分包括以下內(nèi)容:
    • 對(duì)數(shù)據(jù)庫(kù)的常用操作;
    • 對(duì)表結(jié)構(gòu)的常用操作;
    • 修改表的結(jié)構(gòu)。

2.2 對(duì)數(shù)據(jù)庫(kù)的常用操作

  1. 查看所有的數(shù)據(jù)庫(kù):show database;
  2. 創(chuàng)建數(shù)據(jù)庫(kù):create database [if not exists] 數(shù)據(jù)庫(kù)名字 [charset = utf-8];
  3. 切換數(shù)據(jù)庫(kù):use 數(shù)據(jù)庫(kù)名字;
  4. 刪除數(shù)據(jù)庫(kù):drop database [if exists] 數(shù)據(jù)庫(kù)名字;

2.3 對(duì)表結(jié)構(gòu)的常用操作 - 其他操作

  1. 查看當(dāng)前數(shù)據(jù)庫(kù)的所有表名稱:show tables;
  2. 查看指定某個(gè)表的創(chuàng)建語(yǔ)句:show create table 表名;
  3. 查看表結(jié)構(gòu):desc 表名;
  4. 刪除表:drop table 表名;

2.4 對(duì)表結(jié)構(gòu)的常用操作 - 修改表結(jié)構(gòu)格式

2.4.1 添加列

  • 語(yǔ)法格式:alter table 表名 add 列名 類(lèi)型(長(zhǎng)度) [約束];
  • 舉例:
    • 為 student 表添加一個(gè)新的字段為:系別 dept ,類(lèi)型為 varchar(20);
    • alter table student add dept varchar(20);

2.4.2 修改列名和類(lèi)型

  • 語(yǔ)法格式:alter table 表名 change 舊列名 新列名 類(lèi)型(長(zhǎng)度) [約束];
  • 舉例:
    • student 表 dept 字段更換為 department varchar(30);
    • alter table student change dept department varchar(30);

2.4.3 刪除列

  • 語(yǔ)法格式:alter table 表名 drop 列名
  • 舉例:
    • 刪除 student 表中 department 這一列;
    • alter table student drop department;

2.4.4 修改表名

  • 語(yǔ)法格式:rename table 表名 to 新表名
  • 舉例:
    • 將 student 表改為 stu;
    • rename table student to stu

3. MySQL 的 DML 操作

3.1 概念

  1. DML(Data Manipulation Language) 是數(shù)據(jù)操作語(yǔ)言,主要對(duì) Mysql 的數(shù)據(jù)進(jìn)行增刪改;
  2. 關(guān)鍵字:insert(插入)、update(更新)、delete(刪除)、truncate(刪除)

3.2 操作

3.2.1 數(shù)據(jù)插入

  • 關(guān)鍵字:insert
  • 格式:
    • 方式1:insert into 表名(列名1,列名2,……)value (值1,值2,……)
    • 方式2:insert into 表名 value (值1,值2,……)

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

  • 關(guān)鍵字:update
  • 格式:
    • 方式1:update 表名 set 字段名 = 值,字段名 = 值,……
    • 方式2:update 表名 set 字段名 = 值,字段名 = 值,…… where ……

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

  • 關(guān)鍵字:delete、truncate
  • 格式:
    • 方式1:delete from 表名 注:這種方式會(huì)將整個(gè)表的數(shù)據(jù)全部刪除
    • 方式2:delete from 表名 where ……
    • 方式3:truncate 表名 注:這個(gè)是清空整個(gè)表,本質(zhì)上可以理解為刪除了表,并創(chuàng)建新表,和 delete 不同。

4. MySQL 的約束

???4 . 1 主鍵約束

  • 關(guān)鍵字:primary key
  • 特點(diǎn):
    1. 一個(gè)表只有一個(gè)主鍵(包含聯(lián)合主鍵);
    2. 添加了主鍵約束的列不能為空,并且值不能重復(fù);
    3. 主鍵可以唯一的標(biāo)識(shí)表中的一行數(shù)據(jù),目的是提高查詢的效率;
  • 使用:create table emp ( eid int primary key; name varchar(20); deptId int; salary double );

?4.2 自增長(zhǎng)約束

  • 關(guān)鍵字:auto_increment
  • 特點(diǎn):
    1. 自增長(zhǎng)約束和主鍵一起使用;
    2. 自增長(zhǎng)約束默認(rèn)是從 1 開(kāi)始增長(zhǎng);
    3. 每次添加數(shù)據(jù),自增長(zhǎng)的值加 1;
  • 使用:create table t_user ( id int primary key auto_increment, name varchar(20) );
  • delete 和 truncate 自增長(zhǎng)的特點(diǎn):
    1. delete 刪除數(shù)據(jù)之后,自增長(zhǎng)的值會(huì)被保留,從上一個(gè)斷點(diǎn)持續(xù)增長(zhǎng);
    2. truncate 是將表刪除,然后重新創(chuàng)建新表。所以清空數(shù)據(jù)之后,自增是 1 開(kāi)始。

?4.3 非空約束

  • 關(guān)鍵字:not null
  • 特點(diǎn):
    1. 添加非空約束的列不能為空;
    2. 真正的空是 NULL,不是 'NULL', 也不是 '';
  • 使用:create table t_user ( id int varchar(20) not null, address varchar(29) not null);

?4.4 唯一約束

  • 關(guān)鍵字:unique
  • 特點(diǎn):
    1. 添加唯一約束之后,該列的值不能重復(fù);
    2. 雖然不能重復(fù),但是添加唯一的約束的列可以為 NULL,因?yàn)?NULL 不等于 NULL;
  • 使用:create table t_user ( id int, name varchar (20), phone number varchar(20) unique;

?4.5 默認(rèn)約束

  • 關(guān)鍵字:default
  • 特點(diǎn):
    1. 添加約束的列如果沒(méi)有指定值,則為默認(rèn)值;
  • 使用:create table t_user ( id int, name varchar(20), address varchar(20) default '北京' );

4.6 零填充約束

  • 關(guān)鍵字:zerofill
  • 特點(diǎn):
    1. 當(dāng)給數(shù)值類(lèi)型設(shè)置該約束,則左邊不夠指定的整形長(zhǎng)度時(shí),則自動(dòng)補(bǔ)充0;
    2. 默認(rèn)零填充約束的數(shù)據(jù) int(10);
    3. 指定零填充約束的列為 unsigned 類(lèi)型,即無(wú)符號(hào)類(lèi)型;
  • 使用:create table t_user ( id int zerofill, name varchar(20) );

5. MySQL 的 DML 操作

5.1 簡(jiǎn)單查詢

  1. 查全表:select * from 表名;
  2. 指定字段查詢:select 列名, 列名 from 表名;
  3. 別名查詢:
    • 列別名:select pid as ‘商品id’, pname '商品名字', price from product;
    • 列別名:select pname, price +10 as new price from product;
    • 表別名:select pid as '商品id'', pname '商品名字', price from product as p;
  4. 去重查詢:
    • 關(guān)鍵字:distinct
    • 操作:
      • 去除重復(fù)行:select distinct * from 表名;
      • 去除重復(fù)的列:select distinct 列名 from 表名;

5.2 運(yùn)算符操作

  1. 算數(shù)運(yùn)算符:+、-、*、/、%;
  2. 比較運(yùn)算符:<、>、<=、>=、!=、=、in、not in、like、is null、is not null;
  3. 邏輯運(yùn)算符:and(&&)、or(||)、not
  4. 位運(yùn)算符(了解):&、|、^、<<、>>、~;

5.3 排序查詢

  • 關(guān)鍵字:order by asc | desc;
  • 注:asc:升序(默認(rèn)),desc:降序;
  • 特點(diǎn):
    1. 如果 oder by 后面跟一個(gè)字段,則只會(huì)按照該字段的值進(jìn)行排序,該字段必須為數(shù)值類(lèi)型或者英文和數(shù)字字符串類(lèi)型或者'2025-01-03';
    2. 如果 oder by 后面跟多個(gè)字段:order by c1,c2;解釋: 先按照 c1 來(lái)排序,如果 c1 相同,則按照 c2 排序;
  • 操作:
    1. 使用價(jià)格排序(降序)select * from product order by price desc;
    2. 在價(jià)格排序(降序)的基礎(chǔ)上,以分類(lèi)排序(降序)select * from product order by price desc, category_id desc;

5.4 聚合查詢

  • 關(guān)鍵字:
    1. count();如:count(*),count(1)注:如果列有 null 值,則不會(huì)進(jìn)行統(tǒng)計(jì);
    2. sum();如:sum(price);注:如果列有 null 值,則不進(jìn)行計(jì)算,當(dāng)作不存在,列必須為數(shù)值列;
    3. max();如:max(price);注:如果列有 null 值,則不進(jìn)行計(jì)算,當(dāng)作不存在,列必須為數(shù)值列;
      4.min();如:min(price);注:如果列有 null 值,則不進(jìn)行計(jì)算,當(dāng)作不存在,列必須為數(shù)值列;
    4. avg();如:avg(price);注:如果列有 null 值,則不進(jìn)行計(jì)算,當(dāng)作不存在,列必須為數(shù)值列;
  • 注:一般情況下,聚合函數(shù)和分組會(huì)結(jié)合一起使用;

5.5 分組查詢

  • 關(guān)鍵字:group by
  • 特點(diǎn):
    1. 分組可以理解為將一張表格拆分成多張表,拆分的依據(jù)就是分組字段;
    2. 分組可以根據(jù)一個(gè)字段,也可以根據(jù)多個(gè)字段,如果是一個(gè)字段,則該字段相同就會(huì)分到同一組,如果是多個(gè)字段,則多個(gè)字段都相同才能分到同一組。
    3. 分組之后,select 的后面只可以跟組分字段和聚合操作。
  • 注:
    1. 一般情況下,聚合函數(shù)和分組會(huì)結(jié)合一起使用;
    2. 分組之后,對(duì)分組后的操作進(jìn)行條件判斷不能使用 where,必須使用 having;
      SQL 執(zhí)行順序
    3. 這是我們實(shí)際上 SQL 執(zhí)行順序:我們先執(zhí)行from,join來(lái)確定表之間的連接關(guān)系,得到初步的數(shù)據(jù);where對(duì)數(shù)據(jù)進(jìn)行普通的初步的篩選;group by 分組;各組分別執(zhí)行having中的普通篩選或者聚合函數(shù)篩選。然后把再根據(jù)我們要的數(shù)據(jù)進(jìn)行select,可以是普通字段查詢也可以是獲取聚合函數(shù)的查詢結(jié)果,如果是集合函數(shù),select的查詢結(jié)果會(huì)新增一條字段將查詢結(jié)果去重distinct;最后合并各組的查詢結(jié)果,按照order by的條件進(jìn)行排序。

5.6 分頁(yè)顯示

  • 關(guān)鍵字:limit
  • 操作:
    1. 查詢 product 表的前 5 條記錄:select * from product limit 5;
    2. 從第 4 條開(kāi)始顯示,顯示 5 條:select * from product limit 3,5;

6. MySQL 多表操作

6.1 前言

  1. 多表關(guān)系:1對(duì)1關(guān)系(很少用);1對(duì)多關(guān)系(很常見(jiàn));多對(duì)多關(guān)系(注意:多對(duì)多關(guān)系必須有中間表 )
  2. 外鍵【foreign key】約束
    • 術(shù)語(yǔ):主表、從表、外鍵列;
    • 創(chuàng)建方式:
      • 方式一:在創(chuàng)建表的同時(shí)創(chuàng)建外鍵約束;
      • 方式二:在創(chuàng)建表之后,通過(guò)修改表結(jié)構(gòu)的方式來(lái)添加外鍵約束;
    • 特點(diǎn):
    1. 主表的數(shù)據(jù)可以隨便添加,從表的外鍵列數(shù)據(jù)必須依賴主表;
    2. 主表的數(shù)據(jù)如果被從表依賴,則不能刪除,而從表的數(shù)據(jù)可以隨便刪除;

6.2 多表聯(lián)合查詢

  1. 交叉連接查詢
    • 特點(diǎn):形成一個(gè)笛卡爾集;
  2. 內(nèi)連接查詢:
    • 隱式內(nèi)連接:select * from A B where 條件;
    • 顯式內(nèi)連接:select * from A inner join B on 條件;
    • 特點(diǎn):求兩張表的交集;
  3. 外連接查詢:
    • 左外連接
      • 關(guān)鍵字:left join
      • 特點(diǎn):將左表的數(shù)據(jù)全部輸出,如果右邊有對(duì)應(yīng)的數(shù)據(jù)則輸出,沒(méi)有對(duì)應(yīng)的數(shù)據(jù),則輸出 null。
    • 右外連接
      • 關(guān)鍵字:right join
      • 特點(diǎn):將右表的數(shù)據(jù)全部輸出,如果左邊有對(duì)應(yīng)的數(shù)據(jù)則輸出,沒(méi)有對(duì)應(yīng)的數(shù)據(jù),則輸出 null。
    • 完全連接
      • 關(guān)鍵字:full join
      • 特點(diǎn):返回左表和右表的所有數(shù)據(jù),并使用 null 值填充缺失的數(shù)據(jù);oracle 支持,mysql 不太支持,可以使用 union 關(guān)鍵字來(lái)實(shí)現(xiàn)。
      • 方式一:select * from student s full join record r on s.id = r.student_id;
      • 方式二:
        select * from student left join record on student.id = record.student_id 
        union 
        select * from student right join record on student.id = record.student_id; 
    
  4. 子查詢
    • 概念:select 的嵌套
    • 查詢類(lèi)型:
      • 將子查詢結(jié)果當(dāng)作一個(gè)值:一行一列;
      • 將子查詢的結(jié)果當(dāng)成多個(gè)值:一列多行;
      • 將子查詢的結(jié)果當(dāng)做一張表:一行多列或者多行多列;
    • 關(guān)鍵字:
      • ALL:表示全部滿足;
      • ANY / SOME:只要有一個(gè)滿足即可;
      • IN:表示范圍內(nèi)的只要有匹配即可;
      • EXISTS:如果查詢有結(jié)果,則返回 true;否則返回 false;
  5. 自關(guān)聯(lián)查詢
    • 概念:一張表自己和自己關(guān)聯(lián);
    • 特點(diǎn):表必須起別名。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • MYSQL 基礎(chǔ)知識(shí) 1 MySQL數(shù)據(jù)庫(kù)概要 2 簡(jiǎn)單MySQL環(huán)境 3 數(shù)據(jù)的存儲(chǔ)和獲取 4 MySQL基本操...
    Kingtester閱讀 8,060評(píng)論 5 115
  • @[toc] 視圖是什么 視圖在數(shù)據(jù)庫(kù)中的作用類(lèi)似于窗戶,用戶可以通過(guò)這個(gè)窗口看到只對(duì)自己有用的數(shù)據(jù)。既保障了數(shù)據(jù)...
    夜雨流云閱讀 1,084評(píng)論 0 2
  • MySQL [TOC] 注釋 單行注釋: -- 多行注釋 :/* */ SQL分類(lèi) DDL :Data Defin...
    一昂Jone閱讀 298評(píng)論 0 0
  • SQL基礎(chǔ) SQL又叫結(jié)構(gòu)化查詢語(yǔ)言,分為三大類(lèi),分別是:DDL(數(shù)據(jù)定義語(yǔ)言),DML(數(shù)據(jù)操作語(yǔ)言),DCL(...
    木_Python閱讀 301評(píng)論 0 0
  • 1、什么是數(shù)據(jù)庫(kù) ? 答:數(shù)據(jù)的倉(cāng)庫(kù),如:在ATM的示例中我們創(chuàng)建了一個(gè) db 目錄,稱其為數(shù)據(jù)庫(kù) 2、什么是 M...
    明_27bf閱讀 785評(píng)論 0 0

友情鏈接更多精彩內(nèi)容