日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

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

数据库

6.数据库(讲义)

發布時間:2023/11/30 数据库 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 6.数据库(讲义) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

-da數據庫概述

  • 為什么要使用數據庫?

    • 那我們在沒有學習數據庫的時候,數據存放在json或者磁盤文件中不也挺好的嘛,為啥還要學習數據庫?

      • 文件中存儲數據,無法基于文件直接對數據進行操作或者運算,必須借助python將數據讀取到計算機內存中然后基于Python程序操作數據,麻煩而且性能不高。

      • 使用文件存儲數據,無法實現數據的共享。

  • 什么是數據庫呢?先介紹幾個概念:

    • 數據:Data

      • 描述事物的符號記錄稱為數據,描述事物的符號既可以是數字,也可以是文字、圖片,圖像、聲音、語言等,數據由多種表現形式,它們都可以經過數字化后存入計算機。

      • 例如:描述一個人的基本信息就是一組數據,在數據庫中叫一行記錄。

      • name age sexAilsa 23 女
    • 數據庫:DataBase(DB)

      • 即存放數據的倉庫,我們可以把它想象成文件夾,里面存放了很多張表,每個表就是一個文件,不過數據庫中的數據是按照一定的規則進行組織、描述和儲存,且具有較小的冗余度、較高的數據獨立性和易擴展性,并可為各種用戶共享

    • 數據庫管理軟件

      • 在了解了Data與DB的概念后,如何科學地組織和存儲數據,如何高效獲取和維護數據成了關鍵,這就用到了一個系統軟件—數據庫管理系統

      • 如MySQL、Oracle、SQLite、Access、MS SQL Server

      • 但是我們日常工作中經常會把數據庫管理軟件稱為數據庫,注意理解對象的意思:例如

        • 小王啊,你們公司用的什么數據庫啊,這個指的是數據庫管理軟件
        • 小王啊,這個學生管理系統的數據庫是哪個?這個指的就是數據庫文件夾,一般情況下一個項目的所有涉及到的數據會存放在一個數據庫中,方便統一管理。
    • 總結:

      • 數據庫服務器:運行數據庫管理軟件
      • 數據庫管理軟件:管理數據庫
      • 數據庫:即文件夾,用來組織文件/表
      • 表:即文件,用來存放多行內容/多條記錄
    • [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-s6x4mxXb-1640509917610)(imgs/40.png)]

Mysql介紹

  • 數據庫管理軟件按照分類分為 關系型數據庫非關系型數據庫
  • 關系型數據庫
    • 在數據庫中各個表之間存在關聯關系,需要設計表結構,一張表中每個字段之間也存在關系,通過SQL語句對數據庫進行增刪改查的操作。
    • 例如:MySQL、oracle 、sql server、sqllite,access,db2
    • 注意:sql語句通用
  • 非關系型數據庫
    • 非關系型數據庫是key-value存儲的,沒有表結構,存取速度快
    • 例如:redis、mongodb
  • Mysql:
    • MySQL是一個關系型數據庫管理系統,由瑞典MySQL AB 公司開發,目前屬于 Oracle 旗下公司。MySQL 最流行的關系型數據庫管理系統,在 WEB 應用方面MySQL是最好的 RDBMS (Relational Database Management System,關系數據庫管理系統) 應用軟件之一。
    • MySQL被廣泛的應用在Internet上的大中小型網站中。由于體積小、速度快、總體擁有成本低,開放源代碼
    • 特點:開源,免費,應用廣泛

Mysql下載和安裝

下載

我們下載安裝的是mysql管理軟件,它相當于是一個服務端,每個建立好的連接的用戶都可以訪問,但是這里為了讓自己自主學習,所以我們會把這個軟件下載安裝到每個人的自己電腦上,相當于在自己電腦上安裝了mysql的服務端,這個軟件他也自帶一個客戶端,我們可以通過cmd終端的形式進行訪問,當然也可以通過可視化工具navicate來訪問,接下來我們會一一講解。

  • mysql管理下載

    • 第一步:打開網址,https://www.mysql.com,點擊downloads之后跳轉到https://www.mysql.com/downloads

    • [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-bkyvK06q-1640509917613)(imgs/41.png)]

    • 第二步:選擇Community選項

    • [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-MeeA603D-1640509917613)(imgs/42.png)]

    • 第三步:選擇對應的操作系統版本

    • [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-4H5un31W-1640509917614)(imgs/43.png)]

    • 第四步:選擇具體版本的mysql,建議選擇5.6或者5.7版本

    • [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Dz1QVTKy-1640509917615)(imgs/44.png)]

    • 第五步:直接下載

    • [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-vjhL4uuS-1640509917617)(imgs/45.png)]

解壓

  • 下載的zip文件解壓,將解壓之后的文件夾放到任意目錄下,這個目錄就是mysql的安裝目錄。
  • 注意:安裝目錄盡量在某盤的根目錄下,如果不在根目錄,則安裝路徑中不能有中文,不能有特殊轉義符的出現。

配置環境變量

  • 在系統變量PATH后面添加: 你的mysql的bin文件夾的路徑(如C:\Program Files\mysql-5.6.41-winx64\bin)

執行初始化

在任意路徑下,以管理員的身份打開終端執行:

mysqld --initialize-insecure

初始化時將root用戶的登錄密碼設置為空。

注意,如果報錯:提示缺少MSVCP120.dll文件的話,后面有解決辦法。

初始化成功如下圖:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-tTRu6F8v-1640509917618)(imgs/56.png)]

初始化成功的另一個標志是,在MySQL的安裝目錄中,會多個data目錄,這個data目錄是是MySQL在初始化過程中創建的數據目錄。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-wicrz8zz-1640509917619)(imgs/57.png)]

安裝Mysql服務

  • 1.以管理員身份打開cmd窗口,記住,一定要是管理員身份
  • 2.輸入mysqld install回車運行

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xIaOeYLB-1640509917621)(imgs/58.png)]

啟動Mysql服務

  • 現在系統的服務中就可以找到MySQL了。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Nj7asoWS-1640509917622)(imgs/59.png)]

  • 但此時MySQL服務還沒有啟動,你可以在服務中點擊啟動,也可以在終端中使用net命令來啟動/關閉MySQL服務。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-UaBXJHAw-1640509917623)(imgs/60.png)]

  • ok,現在MySQL服務正常啟動了,并且,由于系統服務中的MySQL服務設置的是自動,下次系統啟動時,MySQL服務也默認啟動了。
  • 服務啟動成功之后,就可以登錄了
    • 輸入mysql -u root -p(第一次登錄沒有密碼,直接按回車過)
    • 但登錄成功之后需要設置密碼:
      • 語法: set password = password(‘密碼’) 為了方便記憶,密碼盡量簡單一點,但是實際工作中為了保證數據安全,密碼盡量設置的復雜一些。

可能發生問題處理

  • 缺少MSVCP120.dll文件

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-UIRGJGo5-1640509917623)(imgs/61.png)]

  • 報錯原因是,系統缺少Visual C ++可再發行組件包。

  • 解決:

    • 打開microsoft官網:https://www.microsoft.com/en-us/download/details.aspx?id=40784,點擊下載:
    • [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-00Porsji-1640509917625)(imgs/62.png)]
    • 根據系統位數選擇下載:
    • [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-cFNJPP2D-1640509917626)(imgs/63.png)]
    • 以管理員的身份運行,然后默認安裝即可。
    • [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-yUxkSD6Z-1640509917626)(imgs/64.png)]
    • 重新以管理員身份打開終端,重新執行初始化步驟吧!
    mysqld --initialize-insecure

Navicate下載安裝

  • Navicate是一種操作數據庫的可視化工具。
  • 下載地址:https://www.navicat.com.cn/products
  • 使用Navicate鏈接數據庫:連接成功之后,你就可以通過該軟件查看所有的數據庫文件了
    • [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ScF0DVAf-1640509917627)(imgs/47.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-sgqPrNF5-1640509917628)(imgs/48.png)]

Sql概述

  • 先來看一個例子:小王第一次使用數據庫,然后跟數據庫來了個隔空對話

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ebG34XXT-1640509917629)(imgs/49.png)]

    • 其實,我們想一想,mysql是一個軟件,它有它自己一套的管理規則,我們想要跟它打交道,就必須遵守它的規則,如果我想獲取數據,它自己有一套規則,這個規則就是SQL。
  • 什么是sql?

    • SQL : 結構化查詢語言(Structured Query Language)簡稱SQL,是一種特殊目的的編程言,是一種數據庫查詢和程序設計語言,SQL語言主要用于存取數據、查詢數據、更新數據和管理關系數據庫系統,SQL語言由IBM開發。
    • 其實簡單的說,就是你發送給他能識別的暗號,他懂了就會給你返回數據。
    • 注意:
      • 對于關系型數據庫而言,SQL語句是通用的,學會了一種,其他只是一些細微的差別,畢竟人家數據庫也是一個種族,語言是通用的,只不過有些存在方言的差別。
  • sql的分類

    • SQL語言分為3種類型:

      1、DDL語句 數據庫定義語言: 數據庫、表、視圖、索引、存儲過程,例如CREATE DROP ALTER

      2、DML語句 數據庫操縱語言: 插入數據INSERT、刪除數據DELETE、更新數據UPDATE、查詢數據SELECT

      3、DCL語句 數據庫控制語言: 例如控制用戶的訪問權限GRANT、REVOKE

庫表操作DDL

庫的增刪改查

這里的庫指的數據庫,也就是我們所謂的那個文件夾,一般情況下,我們在開發項目前,會先設計數據庫中相關表結構,一個項目中所有表都會放在同一個文件夾下,對于庫的操作屬于SQL分類中的DDL,也就是數據庫定義語言。

  • 創建數據庫

  • create database db1;
  • 創建數據庫并制定編碼

  • create database 庫名 charset 字符編碼 create database db1 charset utf8;
  • 使用數據庫

  • use 庫名
  • 查看所有數據庫和單獨常看當前數據庫

  • # 查看當前庫 select database(); # 查看所有數據庫 show datasets;
  • 修改數據庫

    • 數據庫的名稱一旦創建好之后就無法修改
    • 修改數據庫一般只修改編碼
  • alter database 庫名 charset 字符編碼 alter database db1 charset utf8;
  • 刪除數據庫

  • drop database 庫名 drop database db1;

表的增刪改查

創建表
  • create table 表名(字段名1 類型(寬度) 約束條件,字段名2 類型(寬度) 約束條件,字段名3 類型(寬度) 約束條件, ); 注意:1.字段名不能重復2.寬度和約束條件可選3.字段名和類型是必須的
查看表結構
  • desc 表名; show create table 表名;
數據類型

**字符串:**顧名思義,就是存儲的一連串的字符,例如文字

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-jAvoIxxB-1640509917630)(imgs/50.png)]

?

  • 我們主要用到的是char和varchar這兩種字符串類型,二者的區別是面試經常考的內容

    • 區別1:定長和變長

      • char 固定長度,例如你定義了char(8),則這一列中存儲的內容長度都為8,不足8則會用空格補充(但是我們在查詢的時候是不會帶空格的,mysql會對此進行處理)

      • varchar 變長存儲,則根據實際的字符長度存儲,例如varchar(8),則不足8按照實際存儲

      • 注意:對于上述兩個類型,如果存儲的數據超過設定好的長度會如何?

        • 如果超過8則會根據你設置的sql_mode而定,默認是【NO_ENGINE*SUBSTITUTION】-非嚴格模式,這種情況下,超過8會被截斷;如果你的sql_*mode是 【strict_trans_tables】則超過8會報錯

        • 查看sql_mode模式

        • # 查看模式:默認是非嚴格模式 show variables like '%mode%'
        • 修改成嚴格模式:改完之后需要退出重登

        • set global sql_mode="strict_trans_tables";
    • 區別2:存儲方式

      • char直接存儲字符內容
      • varchar 開頭由1-2個字節存儲該字符的總長度,后面接著存儲字符內容
      • 兩種存儲方式的優劣
        • char的存取速度很快,但是由于是定長,當大部分內容沒有達到規定長度時,會浪費不少空間資源;varchar則不會,它根據實際長度存儲,但是由于存儲的特殊形式造成存取速度不及char。
        • char存儲的內容都為一個定值,則可以提高存取效果,因為varchar還要留出一部分存儲字符串的長度,則存取速度不如char。
        • 很早之前,大家都覺得varchar好,節省資源,但是到現在,磁盤資源已經不成問題,因此我更傾向于選擇char,也就是所謂的以空間換時間了。

數值型:常用的有:int ,double, float

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-g7CMXeGi-1640509917631)(imgs/51.png)]

  • 整數型:int 基本int能夠處理日常工作中大部分整數存儲問題
  • 小數型:double float
  • 強調一下float(5,2)其中5代表總長度,2代表小數長度,這個意思是整數是3位,小數是2位
  • 日常工作中float足以解決小數問題了。

日期類型

  • now()函數:返回當前系統時間

  • date:年月日

  • time:時分秒

  • datetime:年月日時分秒

select now();

ENUM和SET類型

  • 這里的類似于下拉字段,在進行數據插入的時候,必須選擇事先設置的內容
  • 對于set而言,可以多選,但是enum只能單選

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-nUMfRpve-1640509917632)(imgs/53.png)]

create table t1(id int,name char(6),gender enum('female','male'),hobby set('抽煙','喝酒','燙頭')); insert into t1 values(1,'張三','female','喝酒,燙頭');
約束條件
  • 為了防止不符合規范的數據進入數據庫,在用戶對數據進行插入、修改、刪除等操作時,DBMS自動按照一定的約束條件對數據進行監測,使不符合規范的數據不能進入數據庫,以確保數據庫中存儲的數據正確、有效、相容。

  • 約束條件與數據類型的寬度一樣,都是可選參數,主要分為以下幾種:

    • NOT NULL :非空約束,指定某列不能為空;
    • DEFAULT:默認值
    • UNIQUE : 唯一約束,指定某列或者幾列組合不能重復
    • PRIMARY KEY :主鍵,指定該列的值可以唯一地標識該列記錄
    • FOREIGN KEY :外鍵,指定該行記錄從屬于主表中的一條記錄,主要用于參照完整性
  • not null:不為空,當你設置一個字段時,不允許它為空,可以使用此約束條件

  • create table t1(id int,name varchar(20) not null);
  • default 默認值

    • 例如:對于性別一列,如果大部分都是男性,可以設置成默認值,不填則取默認值,填寫了則覆蓋默認值
  • create table t2 (id int,name char(8),sex char(8) DEFAULT 'man');
  • unique 唯一:當有一列字段你不想讓它有重復值時,可以設置為唯一

create table t3(name varchar(10),perId int unique,age int)
  • 聯合唯一:只有當你設置的這些字段同時重復時才會報錯
create table t4(name varchar(10),perId int ,age int,unique(name,perID))
  • primary key

    • 主鍵為了保證表中的每一條數據的該字段都是表格中的唯一值。換言之,它是用來獨一無二地確認一個表格中的每一行數據。

    • 主鍵可以包含一個字段或多個字段。當主鍵包含多個字段時,稱為組合鍵 (Composite Key),也可以叫聯合主鍵。

    • 單字段主鍵:

    • create table t5(id int PRIMARY KEY,name varchar(10),age int)
    • 聯合主鍵:

    • create table t6(id int ,name varchar(10),age int,PRIMARY KEY(id,name))
  • auto_increment 自增字段:

    • 對于主鍵id而言,往往我們可以設置為自增字段,不用手動填寫

    • create table t7(id int PRIMARY KEY auto_increment ,name varchar(10),age int);
  • foreign key

    • 思考:

      • 假設我們要描述所有公司的員工,需要描述的屬性有這些 : 姓名,年齡,性別,部門,部門描述

      • 公司有3個部門,但是有1個億的員工,那意味著部門和部門描述這兩個字段需要重復存儲,部門名字和部門描述內容越長,越浪費內存,如何處理呢?

        • 解決方法: 我們完全可以定義一個部門表然后讓員工信息表關聯該表,如何關聯,即foreign key

        • [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-OsD7OoB0-1640509917632)(imgs/54.png)]

          • foreign key(當前表中建立關系的外鍵字段) references 被關聯表名(id)
        • #先創建被關聯表 create table dep (id int primary key auto_increment,dep_name char(10) not null,dep_desc varchar(50) not null )#創建關聯表 create table emp (id int PRIMARY KEY auto_increment,name varchar(10),age int,gender enum('male','female'),dep_id int,FOREIGN KEY(dep_id) references dep(id) ) #作用: #1.減少數據的冗余度 #2.防止插入無效的臟數據
    • 級聯刪除,級聯更新

      • 兩張表建立關聯之后,如果部門表某個部門的砍掉了,那對應的人員表中的那些部門的人員相應的該怎么處理呢?可以保存,也可以隨之一起刪除.

        • 如果要保證兩表一致,則需要在設置外鍵時添加on delete cascade

        • 如果部門id更新了,要一起更新的話,則添加on update cascade

        • create table emp (id int PRIMARY KEY auto_increment,name varchar(10),age int,gender enum('male','female'),dep_id int,FOREIGN KEY(dep_id) references dep(id) on delete cascade on update cascade )
修改表
  • 修改表名

  • 修改表字段的數據類型

  • 修改表字段名

  • 修改字段名以及數據類型和約束

  • 新增字段

  • 刪除字段

刪除表

記錄操作DML

插入數據

  • 插入完整的數據

  • insert into tableName values (字段1,字段2)
  • 插入指定字段的數據

  • insert into tableName (name,age) values ('lisi',23)
  • 插入多條數據

  • insert into tableName values (字段1,字段2),(字段1,字段2)

更新數據

  • 單獨更新一個字段

  • update emp set age = 33 where name = 'zhangsan'
  • 更新多個字段

  • update emp set age = 33,sex='female' where name = 'zhangsan'

刪除數據

  • 刪除指定數據

  • delete from emp where name = 'lisi'
  • 刪除表中所有數據

  • delete from emp

查詢數據

單表查詢
  • 準備數據

  • #創建員工表,字段為: #id自增,員工名不能為空,性別只可以為male或者female且不能為空,默認值為male #age不能為空,默認值28,入職日期只顯示年月日,職位名稱,工資保留兩位小數,辦公室門牌號,部門idcreate table emp (id int PRIMARY KEY auto_increment,name varchar(10) not null,sex enum('female','male') default 'male',age int default 28,hireDate date,post char(10),salary float(9,2),office_num int,dep_id int)insert into emp (name,sex,age,hireDate,post,salary,office_num,dep_id) values ('huahua','male',18,'20170301','teacher',7300.33,401,1), #以下是教學部 ('weiwei','male',78,'20150302','teacher',1000000.31,401,1), ('lala','male',81,'20130305','teacher',8300,401,1), ('zhangsan','male',73,'20140701','teacher',3500,401,1), ('liulaogen','male',28,'20121101','teacher',2100,401,1), ('aal','female',18,'20110211','teacher',9000,401,1), ('zhugelang','male',18,'19000301','teacher',30000,401,1), ('成龍','male',48,'20101111','teacher',10000,401,1),('歪歪','female',48,'20150311','sale',3000.13,402,2),#以下是銷售部門 ('丫丫','female',38,'20101101','sale',2000.35,402,2), ('丁丁','female',18,'20110312','sale',1000.37,402,2), ('星星','female',18,'20160513','sale',3000.29,402,2), ('格格','female',28,'20170127','sale',4000.33,402,2),('張野','male',28,'20160311','operation',10000.13,403,3), #以下是運營部門 ('程咬金','male',18,'19970312','operation',20000,403,3), ('程咬銀','female',18,'20130311','operation',19000,403,3),
  • 查詢所有字段信息

  • select * from emp
  • 查詢指定字段信息

  • select name,salary from emp
  • 通過四則運算查詢

  • #查看所有員工的年薪 select name,salary from emp
- 為字段重命名- ```select name,salary*12 as year_salary from emp
  • 條件查詢where語句

    • 單條件查詢

    • #查看崗位是sale的員工名稱和崗位名稱 select name,post from emp where post='sale'
    - 多條件查詢1:結合and- ```#查詢崗位是教師且工資大于10000的員工名字和薪資select name,salary from emp where post='teacher' and salary > 10000
    • 多條件查詢2:結合or

    • #查詢員工薪資為3500,4000和9000的員工名稱和年齡 select name,age from emp where salary=3500 or salary=4000 or salary=9000
    - 多條件查詢3:結合between...and- ```#查詢員工薪資在1000到5000的員工名字和年齡和崗位名稱select name,age,post from emp where salary BETWEEN 1000 and 5000
    • 多條件查詢4:結合in

    • #查詢員工薪資為3500,4000和9000的員工名稱和年齡 select name,age from emp where salary in (3500,4000,900)
    • 多條件查詢5:結合not in

    • #查詢員工薪資不為3500,4000和9000的員工名稱和年齡 select name,age from emp where salary not in (3500,4000,900)
    - 模糊查詢like- 通配符%:表示多個字符- ```#查看姓zhang的員工的年紀,名字和薪資select name,age,salary from emp where name like 'zhang%'
    • 通配符_:表示一個字符

      • #查看姓zhang的員工的年紀,名字和薪資 select name,age,salary from emp where name like 'zhang___'
  • 分組查詢:group by

    • 簡單的分組查詢

      • 注意:使用group by的查詢字段必須是分組字段,否則會出錯,想要獲取其他字段信息,可以借助于group_concat或聚合函數
    • #根據崗位名稱進行分組 select post from emp group by post
    - 使用group_concat(字段名),可以實現在使用group by的查詢字段為其他字段名- ```select post from emp group by post
    • 分組聚合

    • #對崗位分組,查看分組后的崗位名稱和崗位人數 select post,count(id) from emp GROUP BY post;

    or
    select post,count(1) from emp GROUP BY post;

    - having子句- where 與 having的區別: - where 是針對分組之前的字段內容進行過濾,而having是針對分組后的- 注意:having后面的條件字段只可以是分組后結果中存在的字段名,否則會報錯!- ```#查看不同崗位下薪資超過6000的員工數量select post,count(1) from emp where salary > 6000 GROUP BY post #根據年齡分組查看年齡大于30的員工數量和姓名select age,GROUP_CONCAT(name) from emp GROUP BY age having age > 30#基于薪資分組,將大于4000員工的平均薪資求出select avg(salary) from emp GROUP BY salary having salary >= 4000```
  • 排序:order by

    • 升序: order by 字段 asc(默認升序,可以不寫)

    • 降序: order by 字段 desc

    • 單列排序:

    • #按照薪資的高低進行員工的排序 select name,post,salary from emp ORDER BY salary desc
    • 多列排序:越前面的列優先級越高

    • #根據年齡和薪資對員工排序 select name,age,salary,post from emp ORDER BY age,salary
  • limit

    • 顯示前三條數據

    • select * from emp LIMIT 3
    - 從0開始,先查出第一條,然后包含這條再往后查5條- ```select * from emp LIMIT 0,5
    • 從第3開始,即先查出第4條,然后包含這條再往后查7條

    • select * from emp LIMIT 3,7#查詢出薪資最高的前三名員工的信息 select * from emp ORDER BY salary desc LIMIT 3
  • 使用正則:regexp

  • #找出員工名字是以z開頭的select name from emp where name REGEXP "^zha" #找出員工名字是以n結尾的 select name from emp where name REGEXP "n$"
多表查詢

根據指定條件將兩張表中的數據進行合并,然后在合并后的結果表中進行數據的查詢

  • 準備數據

  • #創建部門表:主鍵id,name #創建員工表:主鍵id,name,sex非空-枚舉類型,年齡,部門id create table emp (id int primary key,name varchar(10),sex enum("male","female"),age int,dep_id int,#foreign key(dep_id) references dep(id) )create table dep (id int primary key,name varchar(10) )# 插入數據 (200,'技術'), (201,'人力資源'), (202,'銷售'), (203,'運營');('ailsa','male',18,200), ('lala','female',48,201), ('huahua','male',38,201), ('zhangsan','female',28,202), ('zhaosi','male',18,200), ('shenteng','female',18,204) ;
  • 內連接:

    • 兩張表公共的部分,必須同時有,沒有就不顯示
  • select * from emp as e inner join dep as d on e.dep_id = d.id
  • 外連接:

    • 兩張表進行指定條件連接,能連接的就連接,連接不了的顯示null
    • 把左右兩邊的數據都顯示完整,匹配不上的則顯示為null,在mysql中沒有真正的全外連接,可以使用union來實現
    select * from emp as e right join dep as d on e.dep_id = d.id union select * from emp as e left join dep as d on e.dep_id = d.id
  • 外連接之左連接

    • 以左表為主表,根據左表數據匹配右表,左表數據是全的,而右表若匹配不上則為null
  • select * from emp as e left join dep as d on e.dep_id = d.id
  • 外連接之右連接

    • 以右表為主表,根據右表數據匹配左表,右表數據是全的,而左表若匹配不上則為null
  • select * from emp as e right join dep as d on e.dep_id = d.id
- 符合條件的多表聯查- ```#示例1:以內連接的方式查詢emp和dep表,并且emp表中的age字段值必須大于25,即找出年齡大于25歲的員工以及員工所在的部門select e.name,d.name from emp as e inner join dep as d on e.dep_id = d.id where age > 25#示例2:以內連接的方式查詢emp和dep表,并且emp表中的age字段值必須大于25,并且以age字段的升序方式顯示select e.name,d.name from emp as e inner join dep as d on e.dep_id = d.id where age > 25 ORDER BY age
  • 子查詢:子查詢是將一個查詢語句嵌套在另一個查詢語句中

    • 帶in關鍵字的子查詢

      • 查詢平均年齡在25歲以上的部門名部門id
    • select id,name from dep where id in (select dep_id from emp GROUP BY dep_id having avg(age) > 25 )
- 查看技術部員工姓名和員工id- ```select name,id from emp where dep_id in (select id from dep where name = '技術')
  • 帶比較運算符的子查詢(比較運算符: =、!=、>、>=、<、<=、<>)

    • 查詢大于所有人平均年齡的員工與年齡

    select name,age from emp where age > (select avg(age) from emp)

綜合練習

  • 準備數據

  • CREATE TABLE class (cid int(11) NOT NULL AUTO_INCREMENT,caption varchar(32) NOT NULL,PRIMARY KEY (cid) ) ENGINE=InnoDB CHARSET=utf8;INSERT INTO class VALUES (1, '三年二班'), (2, '三年三班'), (3, '一年二班'), (4, '二年九班');CREATE TABLE teacher(tid int(11) NOT NULL AUTO_INCREMENT,tname varchar(32) NOT NULL,PRIMARY KEY (tid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO teacher VALUES (1, '張磊老師'), (2, '李平老師'), (3, '劉海燕老師'), (4, '朱云海老師'), (5, '李杰老師');CREATE TABLE course(cid int(11) NOT NULL AUTO_INCREMENT,cname varchar(32) NOT NULL,teacher_id int(11) NOT NULL,PRIMARY KEY (cid),FOREIGN KEY (teacher_id) REFERENCES teacher (tid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO course VALUES (1, '生物', 1), (2, '物理', 2), (3, '體育', 3), (4, '美術', 2);CREATE TABLE student(sid int(11) NOT NULL AUTO_INCREMENT,gender char(1) NOT NULL,class_id int(11) NOT NULL,sname varchar(32) NOT NULL,PRIMARY KEY (sid),FOREIGN KEY (class_id) REFERENCES class (cid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO student VALUES (1, '男', 1, '理解'), (2, '女', 1, '鋼蛋'), (3, '男', 1, '張三'), (4, '男', 1, '張一'), (5, '女', 1, '張二'), (6, '男', 1, '張四'), (7, '女', 2, '鐵錘'), (8, '男', 2, '李三'), (9, '男', 2, '李一'), (10, '女', 2, '李二'), (11, '男', 2, '李四'), (12, '女', 3, '如花'), (13, '男', 3, '劉三'), (14, '男', 3, '劉一'), (15, '女', 3, '劉二'), (16, '男', 3, '劉四');CREATE TABLE score (sid int(11) NOT NULL AUTO_INCREMENT,student_id int(11) NOT NULL,course_id int(11) NOT NULL,num int(11) NOT NULL,PRIMARY KEY (sid),KEY fk_score_course (course_id),CONSTRAINT fk_score_course FOREIGN KEY (course_id) REFERENCES course (cid),CONSTRAINT fk_score_student FOREIGN KEY (student_id) REFERENCES student(sid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO score VALUES (1, 1, 1, 10), (2, 1, 2, 9), (5, 1, 4, 66), (6, 2, 1, 8), (8, 2, 3, 68), (9, 2, 4, 99), (10, 3, 1, 77), (11, 3, 2, 66), (12, 3, 3, 87), (13, 3, 4, 99), (14, 4, 1, 79), (15, 4, 2, 11), (16, 4, 3, 67), (17, 4, 4, 100), (18, 5, 1, 79), (19, 5, 2, 11), (20, 5, 3, 67), (21, 5, 4, 100), (22, 6, 1, 9), (23, 6, 2, 100), (24, 6, 3, 67), (25, 6, 4, 100), (26, 7, 1, 9), (27, 7, 2, 100), (28, 7, 3, 67), (29, 7, 4, 88), (30, 8, 1, 9), (31, 8, 2, 100), (32, 8, 3, 67), (33, 8, 4, 88), (34, 9, 1, 91), (35, 9, 2, 88), (36, 9, 3, 67), (37, 9, 4, 22), (38, 10, 1, 90), (39, 10, 2, 77), (40, 10, 3, 43), (41, 10, 4, 87), (42, 11, 1, 90), (43, 11, 2, 77), (44, 11, 3, 43), (45, 11, 4, 87), (46, 12, 1, 90), (47, 12, 2, 77), (48, 12, 3, 43), (49, 12, 4, 87), (52, 13, 3, 87);
  • 題目

  • 1、查詢所有的課程的名稱以及對應的任課老師姓名2、查詢學生表中男女生各有多少人3、查詢物理成績等于100的學生的姓名4、查詢平均成績大于八十分的同學的姓名和平均成績5、查詢所有學生的學號,姓名,選課數,總成績6、 查詢姓李老師的個數7、 查詢沒有報李平老師課的學生姓名8、 查詢物理課程比生物課程高的學生的學號 返回每個學生的物理分數表和每個學生生物分數表,將其連接成一張表,然后進行條件查詢9、 查詢沒有同時選修物理課程和體育課程的學生姓名10、查詢掛科超過兩門(包括兩門)的學生姓名和掛科數量11、查詢選修了所有課程的學生姓名12、查詢李平老師教的課程的所有學生(id)的成績記錄13、查詢全部學生都選修了的課程號和課程名14、查詢每門課程被選修的次數(每門課有多少學生選擇)15、查詢只選修了一門課程的學生姓名和學號16、查詢所有學生考出的成績并按從高到低排序(成績去重:在需要去重字段前面加distinct)17、查詢平均成績大于85的學生姓名和平均成績18、查詢生物成績不及格的學生姓名和對應生物分數19、查詢在所有選修了李平老師課程的學生中,這些課程(李平老師的課程,不是所有課程)平均成績最高的學生姓名
  • 答案

  • 1、查詢所有的課程的名稱以及對應的任課老師姓名 select cname,tname from course as c inner join teacher as t on c.teacher_id = t.tid2、查詢學生表中男女生各有多少人 select gender,count(1) from student GROUP BY gender3、查詢物理成績等于100的學生的姓名 select sname from student as t inner join score as s on t.sid = s.student_id inner join course as c on c.cid = s.course_id where cname = '物理' and num = 1004、查詢平均成績大于八十分的同學的姓名和平均成績 select sname,avg(num) as 平均成績 from student as t inner join score as s on t.sid = s.student_id GROUP BY t.sid having avg(num) > 805、查詢所有學生的學號,姓名,選課數,總成績(存在有學生沒有選擇任何一門課) select t.sid,t.sname,count(s.course_id) as 選課數,sum(num) as 總成績 from student as t left join score as s on t.sid = s.student_id GROUP BY t.sid 6、 查詢姓李老師的個數 select count(1) from teacher where tname like '李%' 7、 查詢沒有報李平老師課的學生姓名 select sname from student where sid not in ( select t1.sid from student as t1 inner join score as s on t1.sid = s.student_id inner join course as c on s.course_id = c.cid inner join teacher t2 on c.teacher_id = t2.tid where tname = '李平老師' )8.查詢物理課程比生物課程高的學生的學號 select sw.sid from (select t.sid,num from student as t inner join score as s on t.sid = s.student_id inner join course as c on c.cid = s.course_id where cname = '生物') as sw inner join (select t.sid,num from student as t inner join score as s on t.sid = s.student_id inner join course as c on c.cid = s.course_id where cname = '物理') as wl on sw.sid = wl.sid where wl.num > sw.num9、 查詢沒有同時選修物理課程和體育課程的學生姓名 select t.sname from student as t inner join score as s on t.sid = s.student_id inner join course as c on c.cid = s.course_id where cname = '物理' or cname = '體育' GROUP BY t.sid having count(1) = 110、查詢掛科超過兩門(包括兩門)的學生姓名和掛科數量 select t.sname,count(1) from student as t inner join score as s on t.sid = s.student_id where num < 60 GROUP BY t.sid having count(1) >= 211、查詢選修了所有課程的學生姓名 select t.sname from student as t inner join score as s on t.sid = s.student_id GROUP BY t.sid having count(1) = (select count(1) from course) 12、查詢李平老師教的課程的所有學生(id)的成績記錄 select s.student_id,s.num from score as s inner join course as c on s.course_id = c.cid inner join teacher as t on t.tid = c.teacher_id where tname = '李平老師'13、查詢全部學生都選修了的課程號和課程名 select c.cid,c.cname from score as s inner join course as c on c.cid = s.course_id GROUP BY course_id having count(1) = (select count(1) from student)14、查詢每門課程被選修的次數(每門課有多少學生選擇) select course_id,count(1) from score GROUP BY course_id15、查詢只選修了一門課程的學生姓名和學號 select t.sname,t.sid from student as t inner join score as s on t.sid = s.student_id GROUP BY t.sid having count(1) = 116、查詢所有學生考出的成績并按從高到低排序(成績去重:在需要去重字段前面加distinctselect distinct num from score ORDER BY num desc17、查詢平均成績大于85的學生姓名和平均成績select t.sname,avg(num) as 平均成績 from student as t inner join score as s on t.sid = s.student_id GROUP BY t.sid having avg(num) > 8518、查詢生物成績不及格的學生姓名和對應生物分數 select t.sname,num from student as t inner join score as s on t.sid = s.student_id inner join course as c on c.cid = s.course_id where cname = '生物' and num < 6019、查詢在所有選修了李平老師課程的學生中,這些課程(李平老師的課程,不是所有課程)平均成績最高的學生姓名 select t.sname from student as t inner join score as s on t.sid = s.student_id inner join course as c on c.cid = s.course_id inner join teacher as tt on tt.tid = c.teacher_id where tname = '李平老師' GROUP BY t.sid ORDER BY avg(num) desc LIMIT 1

視圖

  • 什么是視圖?

    • mysql中的視圖與數據表有很多相似的地方,視圖是由若干個字段以及若干條記錄構成,視圖也可以作為select語句的數據源。
    • 視圖中保存的僅僅是一條select語句,或者說保存的是視圖的定義,并沒有保存真正的數據。數據庫表稱為基本表或者基表,視圖稱為虛表(因為沒有保存真正的數據)。
  • 創建視圖

  • create view empView as select * from emp;create view empView3 (name,age) as select name,age from emp;
  • 查詢視圖

  • select * from viewName
- 修改視圖- ```alter view viewName as select xxx
  • 刪除視圖

  • drop view viewName
  • 視圖的作用

    • 安全性:

      • 視圖的安全性可以防止未授權用戶查看特定的行或列,使有權限用戶只能看到表中特定行的方法
      • 就是給具有不同用戶提供不同的視圖
    • 簡單性:

      • 可以簡化用戶的操作,那些被經常使用的查詢可以被定義為視圖,從而使得用戶不必為以后的操作每次指定全部的條件。
    • 邏輯數據獨立性:

      • 視圖可以使應用程序和數據庫表在一定程度上獨立。如果沒有視圖,程序一定是建立在表上的。有了視圖之后,程序可以建立在視圖之上,從而程序與數據庫表被視圖分割開來

        • 如果應用建立在數據庫表上,當數據庫表發生變化時,可以在表上建立視圖,通過視圖屏蔽表的變化,從而使應用程序可以不動。

總結

以上是生活随笔為你收集整理的6.数据库(讲义)的全部內容,希望文章能夠幫你解決所遇到的問題。

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