Python學習日記(三十四) Mysql資料庫篇 二

来源:https://www.cnblogs.com/Fantac/archive/2019/10/04/11608450.html
-Advertisement-
Play Games

外鍵(Foreign Key) 如果今天有一張表上面有很多職務的信息 我們可以通過使用外鍵的方式去將兩張表產生關聯 這樣的好處能夠節省空間,比方說你今天的職務名稱很長,在一張表中就要重覆的去寫這個職務的名字,很浪費空間;除此之外也能起到一個約束的作用。 像department就是外鍵。 執行代碼: ...


外鍵(Foreign Key)

如果今天有一張表上面有很多職務的信息

我們可以通過使用外鍵的方式去將兩張表產生關聯

這樣的好處能夠節省空間,比方說你今天的職務名稱很長,在一張表中就要重覆的去寫這個職務的名字,很浪費空間;除此之外也能起到一個約束的作用。

像department就是外鍵。

執行代碼:

create table t1(        
    uid bigint auto_increment primary key,
    name varchar(32),
    department_id int,
    gender int,
    constraint fk_user_depar foreign key ("department_id",) references department("id")
    )engine=innodb default charset=utf8;

create table t2(
    id bigint auto_increment primary key,
    job char(15),
)engine=innodb default charset=utf8;

什麼時候用主鍵?主鍵的作用?

保存數據的完整性,一個表只能有一個主鍵,一個主鍵可以由多列合成一個主鍵且主鍵不可為空

create table t1(
    uid bigint auto_increment,
    name varchar(32),
    department_id int,
    gender int,
    primary key(uid,gender)                #將兩列合成為一個主鍵
    constraint fk_user_depar foreign key ("department_id",) references department("id")
    )engine=innodb default charset=utf8;

ps:外鍵的名字不能重覆。

多列和成的主鍵值對應另外一張表的多個列:

create table t1(
    uid bigint auto_increment,
    name varchar(32),
    department_id int,
    gender int,
    primary key(department_id,gender)                    #將兩列合成為一個主鍵
    constraint fk_user_depar foreign key ("department_id","gender") references department("id","num_gender")
    )engine=innodb default charset=utf8;

create table t2(
    id bigint auto_increment primary key,
    job char(15),
    num_gender bigint,
)engine=innodb default charset=utf8;

 

自增列的起始值

desc 表名;

show create table 表名:

假設原表:

執行語句命令

附加上命令\G

可以看出這就是我們寫的SQL語句,但是沒有‘AUTO_INCREMENT=4’,因為原表中有三個數據,這裡表示下一次的自增值是4。

我們再去加上兩筆數據看一看這裡的自增值是怎麼變得。

 

如果要去修改這個自增值,要使用alter table 表名 AUTO_CREMENT=值;

 

自增列的步長

Mysql的自增步長不好,因為它是基於會話級別,一次登錄就是一次會話

<1>基於會話級別:

語句:show session variables like 'auto_inc%' 查看全局變數

設置步長:set session auto_increment_increment=值;

註意每一個會話的步長的都是獨立的,除非用全局去把每一個會話的全局變數去統一

修改當前會話的起始值:

set session auto_increment_offset=值;

<2>基於全局級別的:

它能夠讓所有人登錄時的步長都被修改成為一個統一的值

set global auto_increment_increment=200;

查看全局變數:

show global variables like 'auto_inc%';

修改全局的起始值:

set global auto_increment_offset=值;

 

唯一索引

唯一索引的作用就是能夠加速查找和起到一個約束的作用

 

外鍵的變種

<1>一對多

例如:用戶和部門的關係

<2>一對一

例如:用戶表和博客表

需要用Foreign key和唯一索引去約束

如果想要製作一張員工表對應他們的許可權關係,但只有高管才能去擁有許可權去查看員工資料

這裡的Usertype是外鍵它所對應的是另外一張員工的職位表,但其實只有Usertype中的4是有許可權去查看員工的資料的,所以其他員工的密碼這一欄會造成資源的浪費,那這裡我們可以用另外一種方式去優化:

<3>多對多

一張表表示:

例如:百合網的相親記錄表

這裡一共有兩個外鍵Uid1、Uid2共同指向ID

兩張表表示:

例如主機和用戶的關係表,一個用戶能夠掌控什麼類型的主機

主要去表示的好處能夠讓我們很清楚的看到一個用戶掌握了幾台主機且這台主機被什麼用戶給掌管的,User和HostID它要具有唯一性。

 

SQL語句數據行的一些補充

<1>.增

假設有一張表

通過語法:insert into 表名(第一列數據名,第二列數據名...) values(對應的第一列值一,對應的第二列值一...),(對應的第一列值二,對應的第二列值二...),...;用這種方式可以插入多次的值。

查看一下新增的數據:

同樣的我們也可從一個表中提取數據到另外一張表中

原表就是上面新增完數據的表,然後我們再去創建一個新的表:

<2>.刪

分為無條件的情況和有條件的情況

無條件:

delete from 表名;

有條件:

1.delete from 表名 where ID != 2;
2.delete from 表名 where ID = 2;
3.delete from 表名 where ID > 2;                  #也可以是小於、大於等於、小於等於
4.delete from 表名 where ID < 2 and name = 'name1';
5.delete from 表名 where ID >= 2 or name = 'name1;

<3>.改

1.改一條

update 表名 set name = 'name1' where id > 2 and name = 'AAA';

2.改多條

update 表名 set name = 'name1',age = 20 where id > 2 or name = 'AAA';

<4>.查

1.select * from 表名;
2.select id,name from 表名;
3.select id,name from 表名 where id > 10 or name = 'name1';
4.select id,name as 新名稱 from 表名 where id > 10 or name ='nam1';

原表格:

執行後:

5.select name,age,'數據' from 表名;

原表格:

執行後: 

 

其他:

原表:

1.select * from t1 where id != 1;

執行結果:

2.select * from t2 where id in (1,3,4);

執行結果:

3.select * from t1 where id not in (1,4);    

執行結果:

4.select * from t1 where id between 1 and 4;                  --->[1,4]

執行結果:

5. select * from t1 where id in (select score from t2);

t2表:

執行結果:

通配符:

'%':例如a%,a的後面可以去取任意個數的字元

'_':例如a_,a的後面只能取一個任意字元

1.select * from t1 where name like 'ro%';

執行結果:

2.select * from t1 where name like 'root_';

執行結果:

 

限制:

比如說你去通過百度、谷歌查資料,它後面會給你分頁,一次看十條二十條,這樣不會讓電腦資源不夠導致崩潰。

原表格:

1.select * from t1 limit 6;

執行結果:

2.select * from t1 limit 2,5;

這裡的2代表起始位址,5代表一共查幾筆資料

執行結果:

3.select * from t1 limit 10 offset 20;

這裡表示從20開始,往後查10條數據

執行結果:

如果要查找後面10筆數據就要先把整筆數據進行翻轉再去查這10筆即可

排序:

從大到小查:

1.select * from t1 order by id desc;

利用id去進行從大到小排列數據,執行結果:

從大到小查:

2.select * from t1 order by id asc;

利用id去進行從小到大排列數據,執行結果:

查後5筆數據:

多列排序:

按排列優先順序去排,先把score按從大到小的方式排列,如果有score相同再去按它的id從小到大的方式排列

 組合:

以員工和部門作為例子,先創建部門表:

再創建一個員工表:

添加員工信息和部門信息:

 

查看添加好的員工信息表和部門信息表:

1.select part_id from userinfo group by part_id;

執行結果:

2.select max(id),part_id from userinfo group by part_id;

執行結果:

3.select min(id),part_id from userinfo group by part_id;

執行結果:

 

4.select count(id),part_id from userinfo group by part_id;

執行結果:

5.select sum(id),part_id from userinfo group by part_id;

執行結果:

6.select avg(id),part_id from userinfo group by part_id;

執行結果:

7.select count(id),part_id from userinfo group by part_id having count(id) > 1;

如果對於聚合函數結果進行二次篩選時就必須要用到having關鍵字,執行結果:

8.select count(id),part_id from userinfo where id = 1 or id < 4 group by part_id having count(id) > 1;

執行結果:

連表操作:

1.select * from userinfo,department where userinfo,part_id = department_id;

把兩張表進行一個連接操作,如果後面不加條件就會出現混亂。執行結果:

2.select * from userinfo left join department on userinfo.part_id = department.id;

這種方法按以前SQL版本效能上會有差異,但現在其實沒有太大的相差,但推薦使用這一個去進行表的連接。特點:左邊的表userinfo會全部顯示。執行結果:

3.select * from userinfo right join department on userinfo.part_id =department.id;

特點:右邊表department的數據會全部顯示

4.select * from userinfo inner join department where userinfo.part_id = department.id;

如果一個表連另外一張表的數據時,出現NULL時,就會把整行數據給隱藏掉


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

-Advertisement-
Play Games
更多相關文章
  • 前陣子一直期待.net core3.0正式版本的出來,以為這個版本出來,Winform程式又迎來一次新生了,不過9.23日出來的馬上下載更新VS,創建新的.net core Winform項目,發現並沒有Winform窗體設計器。而微軟目前則是通過插件的方式,讓我們單獨下載Winform設計器,這個... ...
  • 1.Autofac基礎使用 參考: https://www.cnblogs.com/li150dan/p/10071079.html 2.ASP.NETCore 3.0 Autofac 容器替換 需要引用:Autofac, Autofac.Extensions.DependencyInjection ...
  • 更改Ubuntu下預設Python版本 首先查看系統內有哪些版本的Python ls /usr/bin/python 查看當前python版本 python --version 基於用戶修改預設版本 想要為某個特定用戶修改 Python 版本,只需要在其 home 目錄下創建一個 alias(別名) ...
  • vim 功能 : 一個強大的文本編輯器 語法格式 :vim [ 選項 ] / 路徑 / 文本文件名 命令格式: vi [ 選項 ] [ 文件名 ] +num 打開某個文件直接跳轉到 num 行 -b 以 binary 方式打開文件 , 用於編輯二進位文件 -R 以只讀方式打開文件 一.VIM 基礎使 ...
  • Vsftp 實驗案例一:(本地用戶) 試驗版本:Linux7.X版本 公司內部現在有一臺FTP 和WEB 伺服器,FTP 的功能主要用於維護公司的網站內容,包括上傳文 件、創建目錄、更新網頁等等。公司現有兩個部門負責維護任務,他們分別適用team1 和team2 帳號進行管理。先要求僅允許team1 ...
  • 1、檢查環境 2、配置yum源 mkdir /iso #創建掛載點 mount /dev/cdrom /iso #掛載光碟到掛載點 ls /iso #查看掛載是否成功 cd /etc/yum.repos.d/ #進入yum源目錄 rm -fr *.repo #刪除官方源 vim iso.repo # ...
  • RAID是將把好幾塊硬碟通過一定組合方式把它組合起來,成為一個新的硬碟陣列組,從而使它能夠達到高性能硬碟的要求. ...
  • MySQL複習值代碼知識點 一. 創建資料庫 create database 資料庫名; 二. 刪除資料庫 drop database 資料庫名; 三. 選擇相應的資料庫 use 資料庫名; 四. 創建表 create table table_name( id integer primary key ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...