MySQL的學習入門五

一、實體之間的關係

1.1 一對多(1:N)

在這裏插入圖片描述

1.2 多對一(N:1)

在這裏插入圖片描述

1.3 一對一(1:1)

在這裏插入圖片描述

1.4 多對多(N:N)

在這裏插入圖片描述

1.5 小結

實現一對一:主鍵和主鍵建關係;
實現一對多:主鍵和非主鍵建關係;
實現多對多:引入第三張關係表;

二、數據庫設計

2.1 數據庫設計步驟

  1. 收集信息:與該系統有關人員進行交流、充分理解數據庫需要完成的任務
  2. 標識對象(實體 - Entity):標識數據庫要管理的關鍵對象或實體
  3. 標識每個實體的屬性(Attribute)
  4. 標識對象之間的關係(Relationship)
  5. 將模型轉換成數據庫
  6. 規範化

2.2 數據規範化

  1. 第一範式:確保每列原則性
    第一範式的目標是確保每列的原子性,一個字段表示一個含義

  2. 第二範式:非鍵字段必須依賴於鍵字段
    第二範式在滿足第一範式的前提下,要求每個表只描述一件事情

  3. 第三範式:消除傳遞依賴
    第三範式在滿足第二範式的前提下,除了主鍵以外的其他列消除傳遞依賴

  4. 反三範式
    範式越高,數據冗餘越少,表越來越多,但是效率又是就越底下爲了提高運行效率,可以適當讓數據冗餘。

2.3 例題

需求:
假設某建築公司要設計一個數據庫,公司的業務規則說明如下:

  1. 公司承擔多個工程項目,每一項工程有:工程號、工程名稱、施工人員等。
  2. 公司有多名職工,每一名職工有:職工號、姓名、性別、職務。
  3. 公司按照工時和小時工資率支付工資,小時工資率由職工的職務決定

標識實體:

  1. 工程;
  2. 職工;
  3. 工時;
  4. 小時工資率;

共有四個表:
在這裏插入圖片描述

三、查詢語句

語法: select [選項] 列名 [from 表名] [where 條件] [group by 分組] [order by 排序] [having 條件] [limit 限制]
測試代碼:

create table stutable (
  stuNo char(6) primary key,
  stuName varchar(10) not null,
  stuSex char(2) not null,
  stuAge tinyint not null,
  stuSeat tinyint not null,
  stuAddress varchar(10) not null,
  ch tinyint,
  math tinyint
) charset=gbk;

insert into stutable values ('01','康康', '男', 20,1, '廈門', 90, null);
insert into stutable values ('02','西西', '女', 20,2, '上海', 88, 99);
insert into stutable values ('03','張三', '男', 20,3, '福州', 88, 99);
insert into stutable values ('04','李四', '男', 21,4, '龍巖', 90, 90);
insert into stutable values ('05','王五', '男', 19,5, '北京', 91, 90.5);
insert into stutable values ('06','婷婷', '女', 19,6, '河南', 91.5, 90.3);
insert into stutable values ('07','芳芳', '女', 19,7, '廈門', 99.5, 99.5);
insert into stutable values ('08','趙六', '男', 21,8, '福州', 93.5, 92.5);

在這裏插入圖片描述
在這裏插入圖片描述

3.1 字段表達式

可以直接輸出內容:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
可以輸出mysql自帶的一些函數,例如隨機數rand():
在這裏插入圖片描述
可以通過as給字段去別名:
在這裏插入圖片描述
在這裏插入圖片描述

3.2 from子句

from:來自,from後面跟的是數據源。數據源可以有多個,返回笛卡爾積。
插入測試表:
在這裏插入圖片描述
測試多個數據源:在這裏插入圖片描述
多個數據源返回笛卡爾積:
在這裏插入圖片描述

3.3 dual表

dual表是一個僞表,在有些特定情況下,沒有具體的表的參與,但是爲了包裝select語句的完整又必須要一個表名,這時候就使用僞表。
在這裏插入圖片描述

3.4 where子句

where後面跟的是條件,在數據源中進行篩選。返回條件爲真記錄。where後面跟着是條件語句,如果爲真則返回,例如where 1將會把所有記錄返回,where 0 則一條都不會返回。

MySQL支持的運算符 含義
> 大於
< 小於
>= 大於等於
<= 小於等於
= 等於
!= 不等於
and
or
not
in 、not in (不在)在
between and 、 not between and (不)在什麼的什麼之間
is null 、 is not null (不)是爲空

例題:

  1. 查找語文成績高於90的學生:
    在這裏插入圖片描述
  2. 查找語文和數學都高於90的:
    在這裏插入圖片描述
  3. 查詢語文或數學低於90分的同學:
    在這裏插入圖片描述
  4. 查找廈門的學生(sql語句不區分大小寫):
    在這裏插入圖片描述
    通過in:
    在這裏插入圖片描述
  5. 查找不是廈門的學生(sql語句不區分大小寫):
    在這裏插入圖片描述
    在這裏插入圖片描述
  6. 查找年齡在19 - 20之間的學生:
    在這裏插入圖片描述
    利用between and:
    在這裏插入圖片描述
  7. 查找年齡不在19 - 20之間的學生:
    在這裏插入圖片描述
  8. 查找缺考的學生:
    在這裏插入圖片描述

3.5 聚合函數和分組查詢(group by)

將查詢的結果分組,分組查詢目的在於統計數據。

3.5.1 聚合函數

  1. sum() 求和
  2. avg() 求平均數
  3. max() 求最大值
  4. min() 求最小值
  5. count() 求記錄數

例題:
1、求語文總分:
在這裏插入圖片描述
2、求數學最大值:
在這裏插入圖片描述
3、語文平均分:
在這裏插入圖片描述

3.5.2 分組查詢

語法:select 分組字段,取值函數 as 別名 from 表名 group by 分組字段;
1、查詢男生和女生的各自語文平均分:
在這裏插入圖片描述
2、查詢男生和女生各自多少人:
在這裏插入圖片描述
3、查詢每個地區有多少人:
在這裏插入圖片描述
4、每個地區的數學平均分:
在這裏插入圖片描述
5、如果分組字段中放普通字段:
在這裏插入圖片描述
可以發現只會返回第一項查詢到的數據。
總結:

  1. 如果是分組查詢,查詢字段必須是分組字段和聚合函數。
  2. 查詢字段是普通字段,只取第一個值。

可以通過group_concat()函數將同一組的值連接起來顯示:
在這裏插入圖片描述
6、多列數組
在這裏插入圖片描述

3.6 排序(order by)

asc:升序(默認)
desc:降序
1、按照年齡排序:
在這裏插入圖片描述
降序:
在這裏插入圖片描述
2、按年齡降序,如果年齡一樣的按照語文成績進行降序:
在這裏插入圖片描述

3.7 having條件

having條件就是在結果集上繼續進行篩選。
例題:
在這裏插入圖片描述
在這裏插入圖片描述
如上圖having報錯的原因在於,第一次查詢了stuname,而having在stuname的基礎去查詢stusex,stuname肯定沒有stusex所以報錯了。

where和having的區別:
where是對原始數據進行篩選,having是對記錄集進行篩選。

3.8 limit

語法:limit 起始位置, 顯示長度
在這裏插入圖片描述
1、找出語文和數學成績總分前三名:
在這裏插入圖片描述
2、找出總分成績後三名同學數學成績加2分:
在這裏插入圖片描述

3.9 查詢語句中的選項

查詢語句中的選項有兩個:
1、all:顯示所有數據(默認)
2、distinct:去除結果集中重複的數據
例:
在這裏插入圖片描述
在這裏插入圖片描述

四、模糊查詢

4.1 通配符

1、_[下劃線] 表示任意一個字符
2、% 表示任意字符

4.2 模糊查詢(like)

在這裏插入圖片描述

4.3 聯合(union)

將多個表的數據組合到一起
語法: select 語句 from 表1名 union [選項] select 語句 from 表2名 union [選項] select 語句

union的選項也有兩個:
1、all:顯示所有數據
2、distinct: 去除重複的數據【默認】

union的注意事項:
1、union兩邊的select語句的字段個數必須是一致的。
2、union兩邊的select語句的字段名可以不一致,最終按第一個select語句的字段名。
3、union兩邊的select語句中的數據類型可以不一致。

在學習的MySQL的路上,如果你覺得本文對你有所幫助的話,那就請關注點贊評論三連吧,謝謝,你的肯定是我寫博的另一個支持。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章