MySQL資料庫基礎知識點總結

来源:https://www.cnblogs.com/Enid/archive/2023/10/07/17747591.html
-Advertisement-
Play Games

一、概念 資料庫:DataBase,簡稱DB。按照一定格式存儲數據的一些文件的組合顧名思義: 存儲數據的倉庫,實際上就是一堆文件。這些文件中存儲了具有特定格式的數據。 資料庫管理系統:DataBaseManagement,簡稱DBMS。資料庫管理系統是專門用來管理資料庫中數據的,資料庫管理系統可以對 ...


一、概念

  • 資料庫:DataBase,簡稱DB。按照一定格式存儲數據的一些文件的組合顧名思義: 存儲數據的倉庫,實際上就是一堆文件。這些文件中存儲了具有特定格式的數據。

  • 資料庫管理系統:DataBaseManagement,簡稱DBMS。資料庫管理系統是專門用來管理資料庫中數據的,資料庫管理系統可以對資料庫當中的數據進行增刪改查。

    • 常見的資料庫管理系統:
      MySQL、 OracleMS SqlServer、 DB2、 sybase等
  • SQL: 結構化查詢語言程式員需要學習SQL語句,程式員通過編寫SQL語句,然後DBMS負責執行SQL語句,最終來完成資料庫中數據的增刪改查操作。

  • 以上三者關係:

    DBMS --(執行)--> SQL --(操作)--> DB



二、基礎

  • 在Windows操作系統中,使用命令來啟動和停止MySQL服務:

    net stop MySQL;
    net start MySQL;
    #其他服務的啟停也可以使用以上命令,修改服務名稱即可
    
  • 使用客戶端登錄MySQL資料庫:(前提:MySQL安裝了,服務啟動了)

    使用bin目錄下的mysql.exe命令來連接mysql資料庫伺服器

    1. 本地登錄(顯示編寫密碼):

      mysql -uroot -p123  #root是用戶名,123是密碼
      
    2. 本地登錄(隱藏密碼):

      mysql -uroot -p  #p後面不加密碼直接回車
      
  • 表(table)

  • 資料庫中是以表格的形式表示數據的

  • 任何一張表都有行和列:

    行(row):被稱為數據/記錄

    列(column):被稱為欄位。[每一個欄位都有:欄位名、數據類型、約束等屬性]

  • SQL語句的分類

    1. DQL:數據查詢語言(凡是帶有select關鍵字的都是查詢語句)

      ​ select…

    2. DML:數據操作語言(凡是對表當中的數據進行增刪改的都是DML)

      ​ insert:增

      ​ delete:刪

      ​ update:改

      註意:DML主要是操作表中的數據data。

    3. DDL:數據定義語言(凡是帶有create、drop、alter的都是DDL)

      ​ create:新建,等同於增

      ​ drop:刪除

      ​ alter:修改

      註意:DDL主要是操作表結構。

    4. TCL:事務控制語言

      ​ commit:事務提交

      ​ rollback:事務回滾

    5. DCL:數據控制語言

      ​ grant:授權

      ​ revoke:撤銷許可權

      ​ ……

  • 導入.sql數據:

    source D:\document\mysql\node.sql  #路徑中不要有中文
    
  • MySQL常用命令

*以下命令不區分大小寫,且命令要有";"才能執行

退出mysql:

exit

查看mysql中有哪些資料庫:

show databases; #以英文分號結尾
#mysql預設自帶了4個資料庫

選擇使用某個資料庫:

use 資料庫名;

創建資料庫:

create database 資料庫名;

查看某個資料庫下的表:

show tables;

查看表中的數據:

select * from 表名;

查看表的結構,不看表的數據:

desc 表名;  # “describe 表名;” 的縮寫

查看MySQL資料庫的版本號:

select version();

查看當前使用的資料庫:

select database();
  • 增刪改查又叫做CRUD

    Create

    Retrive

    Update

    Delete



三、查詢

(一)單表查詢

1、簡單查詢
  • 查詢一個欄位:
select 欄位名 from 表名;
  • 查詢多個欄位:
select 欄位1,欄位2,... from 表名;
  • 查詢所有欄位:
select * from 表名;  #這種方式效率低、可讀性差,在實際開發中不建議使用
select 所有欄位名 from 表名;
  • 給查詢的列起別名:
select 欄位名 (as) 別名 from 表名;
#as可以省略,原表列名不變,只是將查詢的欄位顯示為別名
#如果起的別名有空格,可以用單引號or雙引號將別名括起來
  • 對查詢的欄位進行運算操作:
select 欄位表達式 from 表名;
#比如 “select sal*12 as '年薪' from emp;”  

註意:在所有的資料庫中,字元串統一使用單引號括起來。(單引號是標準,雙引號在Oracle資料庫中用不了,在MySQL中可以使用)

select後面可以跟某個表的欄位名(可以等同看做變數名),也可以跟字面量/字面值(數據)。


2、條件查詢

條件查詢需要用到where語句,where必須放到from語句表的後面

select 欄位1,欄位2,... from 表名 where 條件;
運算符 說明
= 等於
<>或!= 不等於
< 小於
<= 小於等於
> 大於
>= 大於等於
between...and... 兩個值之間,等同於>=and<=(要遵循左小右大,閉區間)
is null 為null(is not null表示不為空)(null不能用=進行衡量
and 並且
or 或者
in 包含,相當於多個or(not in表示不在這個範圍內)(in後面加的是具體的值,不是區間)
not not可以取非,主要用在is或in中
like like稱為模糊查詢,支持%或下劃線匹配
%:匹配任意個字元
下劃線:一個下劃線只匹配一個字元
\為轉義字元

and和or的優先順序:and > or。如果想讓or先執行,需要加()。


3、排序
  • 單欄位排序:

    select 欄位 from 表名 order by 欄位;  #預設升序
    select 欄位 from 表名 order by 欄位 desc;  #指定降序
    select 欄位 from 表名 order by 欄位 asc;  #指定升序
    
  • 多欄位排序:

    select 欄位 from 表名 order by 欄位a (desc/asc), 欄位b (desc/asc);  #先按照欄位a進行排序,序號相同的再按照欄位b進行排序
    
  • 根據欄位位置進行排序:

    select 欄位 from 表名 order by 2;  #2表示第2列,按照第2列進行排序
    #不建議使用這種方式,列的順序會改變,不健壯
    
  • 條件查詢+排序:

    select ... from ... where ... order by ...;  #關鍵字順序不能變
    #執行順序:from、where、select、order by
    

4、數據處理函數/單行處理函數
  • 單行處理函數:一個輸入對應一個輸出
函數 含義
lower 轉換小寫
upper 轉換大寫
substr 取子串 [ substr(被截取的字元串, 起始下標, 截取的長度) ]
length 取長度
trim 去空格
str_to_date 將字元串varchar類型轉換成date類型
date_format 格式化日期。將date類型轉換成具有一定格式的varchar字元串類型。
格式:date_format(日期類型數據, '日期格式')
這個函數通常使用在查詢日期方面。設置展示的日期格式。
format 設置千分位。
format(數字, '格式')
round 四捨五入
rand 生成0~1的隨機數
ifnull 可以將null轉換成一個具體值[ ifnull(欄位, 如果為null被當作哪個值) ]
concat 進行字元串的拼接
case...when...then...when...then...else...end 當怎樣就怎麼做,當怎樣就怎麼做,其餘情況怎麼做

實例:

select lower(name) as name from student;
select substr(name,1,1) as name from student; #將會輸出所有name的第1個字元
select name from student where substr(name,1,1)='A';  #相當於:select name from student where name like 'A%';
select concat(upper(substr(name, 1, 1)), substr(name, 2, length(name)-1)) as result from student;  #將name欄位的數據首字母大寫
select round(1236.567, 2) as result form student;  #round(數據, 保留小數位數),生成的結果行數為student表的行數
select name,job,sal as oldsal,(case job when 'MANAGER' then sal*1.1 when 'SALEMAN' then sal*1.5 else sal end) as newsal from emp;

*在所有資料庫中,只要有null參與的數學運算,結果就為null

  • MySQL的日期格式

    符號 含義
    %Y
    %m
    %d
    %h
    %i
    %s

5、分組函數/多行處理函數
  • 多行處理函數:輸入多行,輸出一行。
函數 含義
count 計數
sum 求和
avg 平均值
max 最大值
min 最小值

實例:

select max(sal) from emp;
  • 分組函數在使用的時候必須先進行分組,然後才能使用。如果沒有對數據進行分組,預設整張表為一組

  • 註意事項:

    1. 分組函數自動忽略NULL,你不需要提前對null進行處理。

    2. count(*)和count(具體欄位)的區別:

      count(*):統計表中的總行數。(只要一行數據中有一列不為NULL,則這行數據有效)

      count(具體欄位):表示統計該欄位下所有不為NULL的元素的總數。

    3. 分組函數不能直接使用在where子句中。


6、分組查詢(重點!!!)
  • 分組查詢語法

    select ... from ... group by ...
    

實例:

#找出每個工作崗位的工資和
select job,sum(sal) from emp group by job;
#找出每個部門,不同工作崗位的最高薪資
#技巧:兩個欄位聯合成一個欄位看
select deptno,job,max(sal) from emp group by deptno,job;
  • 重要結論:

    在一條select語句中,如果有group by語句的話,select後面只能跟:參加分組的欄位分組函數。其他的不能跟。

  • having

    • having可以對分完組後的數據再次進行過濾。

    • having不能單獨使用,不能代替where,只能和group by搭配使用。

      #找出每個部門最高薪資,並顯示最高薪資大於3000的
      select deptno,max(sal) from emp group by deptno having max(sal)>3000;
      #或者先使用where過濾
      select deptno,max(sal) from emp where sal>3000 group by deptno;
      
    • 優化策略:where和having,優先選擇where。

  • 執行順序

select ... from ... where ... group by ... having ... order by ...
#以上關鍵字只能按照這個順序來,不能顛倒

以上語句的執行順序:from、where、group by、having、select、order by

實例:

#找出每個崗位的平均薪資,要求顯示平均薪資大於1500的,除MANAGER崗位之外,要求按照平均薪資降序排
select job,avg(sal) as avgsal
from emp
where job <> 'MANAGER'
group by job
having avg(sal)>1500
order by avgsal desc;

7、查詢結果去重:distinct
select distinct 欄位 from 表名;
  • distinct只能出現在所有欄位的前面

  • distinct出現在兩個欄位之前,則表示兩個欄位聯合起來去除

實例:

#統計工作崗位數量
select count(distinct job) from emp;

(二)連接查詢

*** 重點!!!**

1、連接查詢
  • 連接查詢分類:

    根據語法的年代分類:SQL92、SQL99(重點學習SQL99)

    根據表連接的方式分類:內連接(等值連接+非等值連接+自連接)、外連接(左外連接/左連接+右外連接/右連接、全連接

  • 笛卡爾積現象:當兩張表進行連接查詢,沒有任何條件限制時,最終查詢結果的條數是兩張表條數的乘積。(數學現象)

    如何避免?

    連接時加條件,滿足這個條件的記錄將會被篩選出來。

    #各個員工對應的部門
    select e.ename,d.dname from emp e,dept d where e.deptno=d.deptno;  #SQL92語法
    #SQL99語法在‘內連接之等值連接’中
    
    • 此時最終查詢的結果條數變少了,匹配次數沒有減少,還是兩張表的條數的乘積。
    • 通過笛卡爾積現象得出,表的連接次數越多,效率越低,儘量避免表的連接次數。

2、內連接
等值連接
  • SQL99語法(內連接):

    select ...
    from a (inner) join b
    on a和b的連接條件
    where 篩選條件
    #inner可以省略,加上可讀性更強,表示內連接
    

    實例:

    #各個員工對應的部門
    select e.ename,d.dname from emp e join dept d on e.deptno=d.deptno;  #SQL99語法(將sql92中from後面的,換成join,where換成了on)
    
  • SQL92和SQL99對比

    SQL92缺點:結構不清晰,表的連接條件和後期進一步篩選的條件,都放到了where後面,用and連接。

    SQL99優點:表連接的條件時獨立的,連接之後,如果還需要進一步篩選,則再往後添加where

  • 在on後面是一個等值條件,所以稱為等值連接

非等值連接
  • 非等值連接:on後面的條件不是等值關係。

實例:

#找出每個員工的薪資等級,並顯示員工名、薪資、等級
select e.ename, e.sal, s.grade
from emp e (inner) join salgrade s
on e.sal between s.losal and s.hisal;
自連接
  • 自連接技巧:一張表看作兩張表。

實例:

#查詢員工的上級領導,要求顯示員工名和對應的領導名
select a.ename as '員工名', b.ename as '領導名'
from emp a join emp b
on a.mgr=b.empno;
#將一張表看成兩張表

3、外連接
  • 外連接與內連接的區別:內連接中,連接的兩張表沒有主次關係,平等的;在外連接中,兩張表連接,產生主次關係。(主要看join前面有無right/left來區分)

  • 帶有right的是右外連接,又叫做右連接。

    帶有left的是左外連接,又叫做左連接。

    任何一個右連接都有左連接的寫法。

    任何一個左連接都有右連接的寫法。

  • 外連接的查詢結果條數一定是>=內連接的查詢結果條數

實例:

#各個員工對應的部門,同時將沒有員工對應的部門也顯示出來
select e.ename,d.dname
from emp e right (outer) join dept d
on e.deptno=d.deptno; 
#右外連接
  • 這裡的right:表示將join關鍵字右邊的這張表看成主表,主要是為了將這張主表的數據全部查詢出來,捎帶著關聯查詢左邊的表emp。
  • outer可以省略,加上可讀性就強一些,表示外連接。

4、多表連接
  • 語法:

    select ...
    from
    	a
    join
    	b
    on
    	a和b的連接條件
    join
    	c
    on
    	a和c的連接條件
    join
    	d
    on
    	a和d的連接條件
    ...
    
    • 一條SQL中,內連接和外連接可以混合,都可以出現。

    實例:

    #找出每個員工的部門名稱以及工資等級,還有上級領導,要求顯示出員工名、領導名、部門名、薪資、薪資等級
    select e.ename, l.ename, e.sal, d.dname, s.grade
    from  emp e 
    join dept d on e.deptno=d.deptno
    join salgrade s on e.sal between s.losal and s.hisal
    left join emp l on e.mgr=l.empno;
    

(三)子查詢

  • 子查詢:select語句中嵌套select語句,配嵌套的select語句稱為子查詢。
在where語句中使用子查詢

實例:

# 找出比最低工資高的員工名字和工資
select ename,sal
from emp
where sal > (select min(sal) from emp);
在from語句中使用子查詢
  • from後面的子查詢,可以將子查詢的查詢結果當作一張臨時表。

實例:

#找出每個崗位的平均工資的薪資等級
select t.*, s.grade 
from (select job, avg(sal) as avgsal from emp group by job) t
on t.avgsal between s.losal and s.hisal; #

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • (1)前言:總結三次題目集的知識點、題量、難度等情況 第一次的作業基本就是熟悉一下java基本的語法,這部分Java就算需要自學也並不算難,並且本身就有了一些c語言的基礎,作業的問題主要是我們對於輸入輸出和判斷迴圈語句的使用,總體的難度很低。第二次的作業就是類的使用以及私有化和相關封裝。第三次是是除 ...
  • Dart語言是純面向對象的編程語言,就算是函數(對象的成員函數一般稱為方法)也是對象,它也有類型,那麼函數也可以作為其他函數的參數,或者賦值給其他變數。除此之外,Dart中的函數還有什麼特別之處、它有什麼規則和約束…… ...
  • 相信小伙伴們在日常的開發中,調試代碼時,免不了經常修改代碼,這個時候,為了驗證效果,必須要重啟 Spring Boot 應用。 頻繁地重啟應用,導致開發效率降低,加班隨之而來。有沒有什麼辦法,能讓 Spring Boot 項目熱部署呢,從而不用每次都手點。答案是肯定的。 第一步:添加 spring- ...
  • Capstone 是一款開源的反彙編框架,目前該引擎支持的CPU架構包括x86、x64、ARM、MIPS、POWERPC、SPARC等,Capstone 的特點是快速、輕量級、易於使用,它可以良好地處理各種類型的指令,支持將指令轉換成AT&T彙編語法或Intel彙編語法等多種格式。Capstone的... ...
  • Seata 簡介 傳統的單體應用中,業務操作使用同一條連接操作不同的數據表,一旦出現異常就可以整體回滾。隨著公司的快速發展、業務需求的變化,單體應用被拆分成微服務應用,原來的單體應用被拆分成多個獨立的微服務,分別使用獨立的數據源,業務操作需要調用三個服務來完成。此時每個服務內部的數據一致性由本地事務 ...
  • Css實現瀏覽滾動條效果 前言 也是有大半個月沒有更新文章了,大部分時間都在玩,然後就是入職的事。今天就更新一個小知識,刷抖音的時候看到的,感覺還不錯。 屬性介紹 關鍵屬性animation-timeline:動畫名稱; 用於控制動畫的時間軸。它可以讓你在一個元素上同時播放多個動畫,控制它們的開始時 ...
  • 一、官網下載JDK1.8 https://www.oracle.com/java/technologies/oracle-java-archive-downloads.html JDK1.8 因為1.8是目前項目中用到最多的 基本都是基於JDK1.8 可以直接在虛擬機中的瀏覽器訪問下載,但是嘗試過的 ...
  • 一、許可權介紹 在Linux中分別有讀、寫、執行許可權: 讀許可權: 對於文件夾來說,讀許可權影響用戶是否能夠列出目錄結構 對於文件來說,讀許可權影響用戶是否可以查看文件內容 寫許可權: 對文件夾來說,寫許可權影響用戶是否可以在文件夾下“創建/刪除/複製到/移動到”文檔 對於文件來說,寫許可權影響用戶是否可以編輯文 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...