本文目錄
一、實體之間的關係
1.1 一對多(1:N)
1.2 多對一(N:1)
1.3 一對一(1:1)
1.4 多對多(N:N)
1.5 小結
實現一對一:主鍵和主鍵建關係;
實現一對多:主鍵和非主鍵建關係;
實現多對多:引入第三張關係表;
二、數據庫設計
2.1 數據庫設計步驟
- 收集信息:與該系統有關人員進行交流、充分理解數據庫需要完成的任務
- 標識對象(實體 - Entity):標識數據庫要管理的關鍵對象或實體
- 標識每個實體的屬性(Attribute)
- 標識對象之間的關係(Relationship)
- 將模型轉換成數據庫
- 規範化
2.2 數據規範化
-
第一範式:確保每列原則性
第一範式的目標是確保每列的原子性,一個字段表示一個含義 -
第二範式:非鍵字段必須依賴於鍵字段
第二範式在滿足第一範式的前提下,要求每個表只描述一件事情 -
第三範式:消除傳遞依賴
第三範式在滿足第二範式的前提下,除了主鍵以外的其他列消除傳遞依賴 -
反三範式
範式越高,數據冗餘越少,表越來越多,但是效率又是就越底下爲了提高運行效率,可以適當讓數據冗餘。
2.3 例題
需求:
假設某建築公司要設計一個數據庫,公司的業務規則說明如下:
- 公司承擔多個工程項目,每一項工程有:工程號、工程名稱、施工人員等。
- 公司有多名職工,每一名職工有:職工號、姓名、性別、職務。
- 公司按照工時和小時工資率支付工資,小時工資率由職工的職務決定
標識實體:
- 工程;
- 職工;
- 工時;
- 小時工資率;
共有四個表:
三、查詢語句
語法: 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 | (不)是爲空 |
例題:
- 查找語文成績高於90的學生:
- 查找語文和數學都高於90的:
- 查詢語文或數學低於90分的同學:
- 查找廈門的學生(sql語句不區分大小寫):
通過in:
- 查找不是廈門的學生(sql語句不區分大小寫):
- 查找年齡在19 - 20之間的學生:
利用between and:
- 查找年齡不在19 - 20之間的學生:
- 查找缺考的學生:
3.5 聚合函數和分組查詢(group by)
將查詢的結果分組,分組查詢目的在於統計數據。
3.5.1 聚合函數
- sum() 求和
- avg() 求平均數
- max() 求最大值
- min() 求最小值
- count() 求記錄數
例題:
1、求語文總分:
2、求數學最大值:
3、語文平均分:
3.5.2 分組查詢
語法:select 分組字段,取值函數 as 別名 from 表名 group by 分組字段;
1、查詢男生和女生的各自語文平均分:
2、查詢男生和女生各自多少人:
3、查詢每個地區有多少人:
4、每個地區的數學平均分:
5、如果分組字段中放普通字段:
可以發現只會返回第一項查詢到的數據。
總結:
- 如果是分組查詢,查詢字段必須是分組字段和聚合函數。
- 查詢字段是普通字段,只取第一個值。
可以通過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的路上,如果你覺得本文對你有所幫助的話,那就請關注點贊評論三連吧,謝謝,你的肯定是我寫博的另一個支持。