2_SQL

文章目錄

  • SQL
    • 數據完整性
      • 實體完整性
      • 域完整性
      • 參照完整性
      • default(默認值)
      • comment(注釋)
    • 多表設計
      • 一對一
      • 一對多
      • 多對多
      • 數據庫三大范式
        • 第一范式:原子性
        • 第二范式:唯一性
        • 第三范式:數據的冗余
    • 多表查詢
      • 連接查詢
        • 交叉連接
          • inner join(內連接)
          • outer join(外連接)
      • 子查詢
      • 聯合查詢
    • 數據庫的備份與恢復
      • cmd命令行操作
      • 通過Navicat操作

SQL

數據完整性

實體完整性

列約束:MySQL可以對插入的數據進行特定的驗證,只有滿足條件才可以插入到數據表中,否則認為是非法插入。

主鍵(primary key)

  • 一個表只能有一個主鍵
  • 主鍵具有唯一性,主鍵不能重復
  • 主鍵字段的值不能為null
  • 聲明字段時,用 primary key 標識
  • 主鍵可以由多個字段共同組成。此時需要在字段列表后聲明的方法

eg:

create table test_primary(id int primary key,name varchar(255),address varchar(255)
);insert into test_primary values(1,"zhangsan","beijing");insert into test_primary values(1,"lisi","liaoning");select * from test_primary;出現error:
> 1062 - Duplicate entry '1' for key 'PRIMARY'
  • auto_increment(自動增長約束)

  • 一些序號,沒有必須手動生成,想讓mysql自動生成。

    • 自動增長必須為索引(主鍵或unique)

    • 只能存在一個字段為自動增長

    • 默認為1開始自動增長

eg:

create table test_autoincrement(id int primary key auto_increment,name varchar(255),address varchar(255)
);insert into test_autoincrement(name, address) values ("zhangsan", "beijing");insert into test_autoincrement(name, address) values ("lisi", "nanjing");insert into test_autoincrement(name, address) values ("wangwu", "jilin");-->
+----+----------+---------+
| id | name     | address |
+----+----------+---------+
|  1 | zhangsan | beijing |
|  2 | lisi     | nanjing |
|  3 | wangwu   | jilin   |
+----+----------+---------+
默認從1開始自動增長

自動增長是不是一定會連續?

  • 不能
  • 比如說自己手動插入了一個id = 100的數據,則下次auto_incrementid = 101開始
  • 再比如表里有unique字段,插入了一個重復的值,導致插入失敗,會導致插入id不連續

域完整性

  • null/not null
    • not null:代表不允許為空,如果插入了null,則會報錯
  • unique
    • 不能重復
    • 允許插入null
    • null可以重復

unique與primary key的區別和聯系

  • 都不能存儲重復的值
  • primary key不能存儲null,unique能存儲null

參照完整性

  • 外鍵

default(默認值)

  • 如果不指定值,則使用默認值
  • 如果指定了值,則就用指定的值

eg:

create table tab 
( create_time timestamp default current_timestamp );-- 表示將當前時間的時間戳設為默認值。
current_date, current_time

comment(注釋)

  • 給自己看的

eg:

create table test_comment(id int primary key auto_increment,name varchar(255) comment "名字",status int comment "0表示未付款,1表示已付款,2"
);

多表設計

一對一

  • 一對一是指兩個表中的數據是一一對應的
    • 比如:人和身份證號、用戶和用戶詳情

存儲關系

  • 一對一的情況,關系可以存儲在任意一張表上,只要新增一個字段。
  • 所有的一一對應的表,在邏輯上,都可以合并為一個表,但是出于效率的考慮沒有合并

一對多

  • 存在表A和表B,表A中的一條數據,對應表B中的多條數據;而表B中的一條數據,對應表A中的一條數據
    • 比如:學生和班主任

存儲關系

  • 關系存儲在多的一方

多對多

  • 指存在表A和表B,表A中的一條數據,對應表B中的多條數據;而表B中的一條數據,對應表A中的多條數據。
    • 比如:學生和課程、訂單和商品

存儲關系

  • 需要額外一張表來存儲之間的關系

數據庫三大范式

第一范式:原子性
  • 我們存儲在數據庫的列,應該保持原子性。
    • 比如:地址
第二范式:唯一性
  • 每一張表,需要有一個主鍵
第三范式:數據的冗余
  • 數據不要冗余
  • 右邊這里即存儲了班主任id又存儲了班主任姓名,造成了冗余在這里插入圖片描述
  • 冗余的好處
    • 查詢速度快
  • 冗余的壞處
    • 耗費磁盤
    • 修改的時候,要修改多張表

反范式化設計

  • 如果你的需求頻繁的要根據學生找老師名
  • 查詢的需求遠遠大于修改的需求

多表查詢

-- 如果user這個表存在,就去刪除
drop table if exists user;create table user(id int primary key auto_increment,name varchar(255),password varchar(255)
);

連接查詢

交叉連接
  • 就是求多個表的笛卡爾積
  • 交叉連接的結果沒有實際的意義
    • 但是內連接和外連接都是基于交叉連接的結果去篩選的

eg:

select * from student_test cross join test_primary;-->
+------+----------+------+---------+--------+----+----------+---------+
| id   | name     | age  | address | remark | id | name     | address |
+------+----------+------+---------+--------+----+----------+---------+
|    1 | lihua    |   20 | china   | None   |  1 | zhangsan | beijing |
|    2 | zhangsan |   18 | Asia    | None   |  1 | zhangsan | beijing |
|    3 | mike     |   21 | china   | None   |  1 | zhangsan | beijing |
|    4 | Jack     |   18 | china   | None   |  1 | zhangsan | beijing |
+------+----------+------+---------+--------+----+----------+---------+
inner join(內連接)
  • 從結果表中刪除與其他被連接表中沒有匹配行的所有行,所以內連接可能會丟失信息

eg:

-- 內連接只返回符合連接條件的數據
select * from student_test inner join test_primary on student_test.id = test_primary.id;-->
+------+-------+------+---------+--------+----+----------+---------+
| id   | name  | age  | address | remark | id | name     | address |
+------+-------+------+---------+--------+----+----------+---------+
|    1 | lihua |   20 | china   | None   |  1 | zhangsan | beijing |
+------+-------+------+---------+--------+----+----------+---------+-- 1. 一般會先取別名,給表取名
-- 2. 先用*來占位,最后需要什么數據,再通過 別名.屬性名拿取
select st.name,tp.address
from student_test st inner join test_primary tp on st.id = tp.id;-->
+-------+---------+
| name  | address |
+-------+---------+
| lihua | beijing |
+-------+---------+
outer join(外連接)
  • 左外連接:會在內連接的結果的基礎之上,去和左表做并集會保留左表的全部數據

    • left outer join / left join
  • 右外連接:會在內連接的結果的基礎之上,去和右表做并集會保留右表的全部數據

    • right outer join / right join
  • outer是可以省略的,可以寫成left join或者right join

eg:

-- 左外連接
-- 左外連接:會保存左表的全部數據
select * from student_test st left outer join test_primary tp on st.id = tp.id;-->
+------+----------+------+---------+--------+------+----------+---------+
| id   | name     | age  | address | remark | id   | name     | address |
+------+----------+------+---------+--------+------+----------+---------+
|    1 | lihua    |   20 | china   | None   |    1 | zhangsan | beijing |
|    2 | zhangsan |   18 | Asia    | None   | NULL | NULL     | NULL    |
|    3 | mike     |   21 | china   | None   | NULL | NULL     | NULL    |
| NULL | Jack     |   18 | china   | None   | NULL | NULL     | NULL    |
+------+----------+------+---------+--------+------+----------+---------+-- 右外連接
-- 右外連接:會保存右表的全部數據
select * from student_test st right outer join test_primary tp on st.id = tp.id;-->
+------+-------+------+---------+--------+----+----------+---------+
| id   | name  | age  | address | remark | id | name     | address |
+------+-------+------+---------+--------+----+----------+---------+
|    1 | lihua |   20 | china   | None   |  1 | zhangsan | beijing |
+------+-------+------+---------+--------+----+----------+---------+

每次寫數據庫的時候,在代碼前面要加上:drop table if exists 表名;,但是修改表的時候不要運行,否則寫好的數據就會清除。

inner join,left (outer) join,right (outer) join的區別

  • inner join只會保留on后面條件符合的(也可以說交集)
  • left join除了保留交集,還會保留左表的所有數據
  • right join除了保留交集,還會保留右表的所有數據

寫關聯查詢最重要的兩件事

  1. 使用什么連接
  2. 關聯條件

子查詢

  • 又稱為嵌套查詢。

  • 一個SQL語句的結果可以作為另外一個SQL語句的條件

  • 子查詢很符合直覺,但是速度太慢了,能不用就盡量不要用

    • 子查詢會生成臨時表

eg:

-- 首先先拿到Java的id
select id from tec_cource where name='Java';
-- 然后再把這個id=1放給第二個
select * from tec_sele_cource where cource_id=1;
select * from tec_stu where id in (1,3);---->
-- 看學生信息
select * from tec_stu where id in (-- 看哪些學生選了 Javaselect student_id from tec_sele_cource where cource_id=(-- 獲取Java的idselect id from tec_cource where name='Java')
)

聯合查詢

  • SQL支持把多個SQL語句的結果拼裝起來
  • union將兩個SQL的結果,拼接起來返回
  • 兩條SQL返回的列應當一致
    eg:
select * from students where class = '一班'
union
select * from students where class = '二班';等價于
select * from students where class = ('一班', '二班');

數據庫的備份與恢復

cmd命令行操作

# 備份
# 1. 打開命令行
mysqldump -uroot -p dbName(數據庫的名稱) > c:/path/dbName.sql(就是要存儲的路徑名)
-- > 表示把這個數據庫輸出到哪里# 恢復
# 1. 打開命令行
# 2. 連接MySQL服務器
mysql -uroot -p# 3. 選中數據庫(假如沒有合適的數據庫,可以新建一個)
use dbName;
# 4. 執行文件中的SQL語句,恢復數據
source c:/path/dbName.sql

通過Navicat操作

  • 備份
    在這里插入圖片描述
  • 恢復
    在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/712196.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/712196.shtml
英文地址,請注明出處:http://en.pswp.cn/news/712196.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JQMobile Loader Widget 遮罩層改造

最近在用jqmobile 做一個混合APP項目時候用到 jqmobile1.4.3提供的Loader Widget控件,但是這個控件本身是一個loading彈出層,這個彈出層彈出之后,用戶還是可以去點擊按鈕,重復發送請求,為了防止重復提交,我想了兩種辦法, 1,在loading彈出層彈出之后,讓按鈕不可用.但是form表單…

記錄SSM項目集成Spring Security 4.X版本 之 加密驗證和記住我功能

目錄 前言 一、用戶登錄密碼加密認證 二、記住我功能 前言 本次筆記的記錄是接SSM項目集成Spring Security 4.X版本 之 加入DWZ,J-UI框架實現登錄和主頁菜單顯示-CSDN博客https://blog.csdn.net/u011529483/article/details/136255768?spm1001.2014.3001.5502 文章之后補…

Python列表的合并、重復、判斷與切片操作你學會了嗎

1.合并列表 通過 實現 list1 ["佛跳墻", "腸粉", "刀削面", "烤鴨"]list2 [32, 4, 5, 7.43, True]list3 list1 list2print(list3) # [佛跳墻, 腸粉, 刀削面, 烤鴨, 32, 4, 5, 7.43, True] 2.重復輸出列表中的元素 通過 * 實…

fastadmin 前端日期字段的添加和編輯

引言 fastadmin 項目中如果需要用到datetime字段的維護&#xff0c;可做如下處理&#xff1a; 1. add.html <div class"form-group"><label class"control-label col-xs-12 col-sm-2">{:__(開始)}:</label><div class"col-x…

vue3 中 主題定制

vue3 中 主題定制 背景 做多主題定制&#xff0c;黑/白 &#xff0c;里面還要再分各種顏色&#xff0c;每次進來都要記住上次的主題設置 效果圖 一、目錄結構 ├── generated │ ├── theme │ │ └── dark-yellow.ts │ │ └── dark-orange.ts │ │…

C++考試成績統計(類實現)

題目&#xff1a;有三名同學&#xff0c;在一次考試中三科成績分別如下表&#xff0c;請輸出三名同學的平均成績&#xff1a; 語文數學英語張三100100100李四9050100王五607080 #include <iostream> #include <string> /*考試成績統計*/ using namespace std;cla…

力扣:120. 三角形最小路徑和

動態規劃 1.先定義dp數組在下標i和下標j時的最小路徑和 &#xff0c;之后初始化dp數組值dp【0】【0】triangle.get(0).get(0)。再用for循環來遍歷數組dp【】的i&#xff0c;并賦值每行的下標為0的dp數組。之后再用for循環遍歷dp【i】【】的j&#xff0c;遞推公式來計算dp【i】…

「算法」常見位運算總結

位運算符 異或 按位異或可以實現無進位相加&#xff0c;所謂無進位相加&#xff0c;就是在不考慮進位的情況下將兩個數相加&#xff08;后面有道題需要用到這種操作&#xff09; 異或的運算律 ①a ^ 0 a ②a ^ a 0 ③a ^ b ^ c a ^ ( b ^ c ) 有符號右移>> 將一個…

IDEA切換 Springboot初始化 URL

&#x1f339;作者主頁&#xff1a;青花鎖 &#x1f339;簡介&#xff1a;Java領域優質創作者&#x1f3c6;、Java微服務架構公號作者&#x1f604; &#x1f339;簡歷模板、學習資料、面試題庫、技術互助 &#x1f339;文末獲取聯系方式 &#x1f4dd; 往期熱門專欄回顧 專欄…

Android基礎控件介紹

在Android應用程序開發中&#xff0c;使用基礎控件是非常常見的。這些控件允許您在用戶界面中顯示文本、圖像、按鈕等元素&#xff0c;以及接收用戶輸入。本文將介紹幾種常見的基礎控件&#xff0c;并給出每個控件在示例XML中使用的屬性的詳細說明。 1. TextView TextView 是…

云計算 2月20號 (認識操作系統)

1、認識操作系統 計算機系統的組成 知識點1&#xff1a;沒有軟件系統的計算機稱之為"裸機" 知識點2&#xff1a;裸機提供基本的可計算性資源 知識點3&#xff1a;操作系統是最靠近硬件的軟件層&#xff0c;負責管理和控制計算機硬件。 計算機硬件組成五大部件 運算器…

Chat GPT:智能對話的下一步

Chat GPT&#xff1a;智能對話的下一步 介紹 Chat GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一種基于Transformer架構的強大對話模型&#xff0c;可以產生自然流暢的回答&#xff0c;并實現人機對話的感覺。本文將探討Chat GPT在智能對話領域的影響和…

代碼隨想錄算法刷題訓練營day29:LeetCode(491)遞增子序列、LeetCode(46)全排列、LeetCode(47)全排列 II

代碼隨想錄算法刷題訓練營day29&#xff1a;LeetCode(491)遞增子序列、LeetCode(46)全排列、LeetCode(47)全排列 II LeetCode(491)遞增子序列 題目 代碼 import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; im…

2024年AI全景預測

歡迎來到 2024 年人工智能和技術的可能性之旅。 在這里&#xff0c;每一個預測都是一個潛在的窗口&#xff0c;通向充滿創新、變革、更重要的是類似于 1950 年代工業革命的未來。 20 世紀 50 年代見證了數字計算的興起&#xff0c;重塑了行業和社會規范。 如今&#xff0c;人工…

老衛帶你學---leetcode刷題(242. 有效的字母異位詞)

242. 有效的字母異位詞 問題 給定兩個字符串 s 和 t &#xff0c;編寫一個函數來判斷 t 是否是 s 的字母異位詞。 注意&#xff1a;若 s 和 t 中每個字符出現的次數都相同&#xff0c;則稱 s 和 t 互為字母異位詞。 示例 1: 輸入: s “anagram”, t “nagaram” 輸出: t…

力扣1143. 最長公共子序列(動態規劃)

Problem: 1143. 最長公共子序列 文章目錄 題目描述思路復雜度Code 題目描述 思路 我們統一標記&#xff1a;str1[i]代表text1表示的字符數組&#xff0c;str2[j]代表text2表示的字符數組&#xff1b;LCS代表最長的公共子序列&#xff1b;&#xff08;我們易得只有str1[i]和str…

Flutter中Widget的生命周期

Widget生命周期&#xff1a; createState-initState-didChangeDependency-build-deactive-dispose 可通過WidgetsBinding類對widget生命周期的回調進行監控。 createState&#xff1a;StatefulWidget 中用于創建 State&#xff1b; initState&#xff1a;State 的初始化操作&am…

CLion遠程調試C++

文件映射到 可以右鍵文件夾選擇重新Cmake 編譯

xsslabs第七關

源碼 <!DOCTYPE html><!--STATUS OK--><html> <head> <meta http-equiv"content-type" content"text/html;charsetutf-8"> <script> window.alert function() { confirm("完成的不錯&#xff01;"…

【刷題】Leetcode 1609.奇偶樹

Leetcode 1609.奇偶樹 題目描述廣度優先搜索&#xff08;BFS&#xff09;深度優先算法&#xff08;DFS&#xff09; 思路一&#xff08;BFS&#xff09;思路二&#xff08;DFS&#xff09;Thanks?(&#xff65;ω&#xff65;)&#xff89;謝謝閱讀&#xff01;&#xff01;&a…