Java EE day03學習總結

今天主要學習聚合函數&表約束

思維導圖:

 

一.模糊查詢(LIKE)

1.概念:模糊查詢是指在一個字段中,進行自定義搜索匹配查詢,而不是全內容匹配。

2.模糊查詢語法

SELECT * FROM 表名 WHERE 字段名 LIKE ‘查詢語法’;

3.MYSQL模糊查詢語法:

LIKE

%

_

表示模糊查詢

表示爲任意多個字符

表示爲單個字符

示例:

-- 查詢班級當中所有姓馬的同學

SELECT * FROM stu WHERE name LIKE '馬%';

-- 查詢班級當中所有姓馬的,且名字在兩個字符的同學

SELECT * FROM stu WHERE name LIKE '馬_';

-- 查詢班級當中所有名字爲兩個字符的學生

SELECT * FROM stu WHERE name LIKE '__';

-- 查詢班級當中,所有名字當中包含化字的學生

SELECT * FROM stu WHERE name LIKE '%化%';

二.聚合查詢

1.概念:我們之前所有的查詢都是橫向查詢,都一行一行的進行判斷,比如我們要查詢所有學生的JAVA成績的平均分,因爲我們每一次的查詢結果是一行,就沒有辦法做到全表的結果查詢。這個時候我們就需要使用縱向查詢(聚合查詢),就是將表的全部數據查出來之後,在進行二次統計。

2.聚合函數的分類

(1)MAX():獲取查詢後結果的最大值

SELECT MAX(java)  FROM stu; 

(2)MIN():獲取查詢後結果的最小值

 SELECT MIN(java)  FROM stu; 

(3)AVG():獲取查詢後結果的平均值

SELECT AVG(java) AS 'JAVA平均分' FROM stu; 

(4)SUM():獲取查詢後結果的總和值

SELECT SUM(java)  FROM stu; 

(5)COUNT():獲取查詢後結果的總記錄數

方式一:不建議因爲這種查詢是泛查詢,會查詢表中的所以記錄 數據越多,性能越低

SELECT COUNT(*)  FROM stu;

方式二:建議,一般做統計查詢的時候,我們儘量選擇非業務主鍵做爲參考,因爲主鍵唯一且必須會存在,單列查詢 提高效率。

SELECT COUNT(id)  FROM stu;

        一般我們在使用統計函數的時候,要注意一個問題,使用泛查詢(*),和使用列查詢(id),是有區別的。

        使用泛查詢會記錄我們的空值列(NULL)

        使用列查詢則不會記錄我們的空值列

         如果,我想讓列查詢,也同樣去記錄我們的空值列,怎麼辦呢??

          由於單列統計不計算空值,所以如果需要統計空值 可以使用IFNULL進行空值判斷填充

    SELECT COUNT(IFNULL(id,0))  FROM stu; 

(6)聚合函數可以連串使用

    SELECT SUM(java)/COUNT(id)  FROM stu;

 

三.分頁查詢(LIMIT)

1.概念:一般我們在處理一個查詢或者搜索業務的時候,並不會一瞬間將該搜索的內容全部同時展示,因爲這種方式會極大的影響用戶的體驗度,同時會給自己的數據庫端和後端以及前端造成極大運算壓力,一般我們會將這種業務進行分頁處理。

2.分頁關鍵字:LIMIT(MYSQL方言)

    SELECT * FROM 表 LIMIT 參數1,參數2;

    參數1:從第幾條數據開始查詢(默認從0開始記錄)

    參數2:一次查詢多少條

代碼示例

-- 每次查詢2條數據 第一頁 1-2

SELECT * FROM stu LIMIT 0,2;

-- 第二頁 3-4

SELECT * FROM stu LIMIT 2,2;

-- 第二頁 5-6

SELECT * FROM stu LIMIT 4,2;

 

3.分頁的計算規則

在一般的實際開發當中,第一個參數決定了真正的頁碼的切換,所有這個值應該動態
SELECT * FROM stu LIMIT (當前頁碼-1)*每一頁的條數,2;

 

四.排序查詢(ORDER BY)

1.概念:在實際的業務開發當中,我們很多其實雜亂的,一般在顯示的時候,我們會這一系列具備排序規則的數據進行排序展示。
淘寶的價格從低到高
淘寶的銷量從高到底

2.關鍵字:排序查詢主要依賴於ORDER BY關鍵字,這個關鍵字可以對數值類型的字段進行降序和升序排列,不會影響數據值 只會影響虛擬表的顯示。
ASC:升序(默認)
DESC:降序

3.單列排序(針對一個列進行單詞排序)

-- 按照java成績從低到高進行排序

SELECT * FROM stu ORDER BY java;

-- 按照java成績從高到低進行排序

SELECT * FROM stu ORDER BY java DESC;

4.組合排序(當第一個列數值一致的時候,可以組合N個列進行第N次排序)

-- 當JAVA成績一致的時候,則按照id進行第二次排序

SELECT * FROM stu ORDER BY java DESC,id ASC;

 

五.分組查詢(GROUP BY)

1.概念:分組查詢是指查詢後將結果進行分組,分組後可以對每組的數據進行單獨的統計。

需要統計每個地區有多少人

錯誤語法: SELECT address,COUNT(*)FROM stu;

正確語法: SELECT address,COUNT(*)FROM stu GROUP BY address;

-- 分組查詢(一旦使用了分組查詢就可以配合使用聚合函數,但是這個聚合函數的字段必須是分組字段本身)111

SELECT address,COUNT(*)FROM stu GROUP BY address;

-- 需要統計男女人數的數量

SELECT sex,COUNT(id) FROM stu GROUP BY sex;

-- 需要統計男女人數的數量(不統計爲空的數據)

SELECT sex,COUNT(id) FROM stu WHERE sex IS NOT NULL AND sex <> '' GROUP BY sex;

-- 需要統計地區人數大於2個人數的地區

-- 1.查詢哪些地區有多少人

-- 2.對這些地區分組

-- 3.多分組進行限制顯示

-- 注意:HAVING只能配合GROUP BY使用,而且可以使用統計函數

SELECT address,COUNT(*) FROM stu GROUP BY address HAVING COUNT(*) >= 2;   

2.MYSQL的常用字段類型

  • char(20)
  • varchar(20)
  • int
  • date
  • datetime
  • timestamp

3.char 和 varchar的區別

(1)char是固定字符串,不管你實際存儲的數據大小是多少,佔用空間仍然char所設定的空間大小
(2)varchar是可變字符串,存儲數據的大小有實際存儲字符串的大小決定,自由縮放。

4.int 和 int(5)的區別

(1)int的默認長度爲11位,實際的存儲大小是由你存儲的數據決定
(2)int(5),是固定5個長度的容器

5.請問date、datetime、timestamp的區別是什麼

(1)date代表的是一個日期,且不包含時間
(2)datetime代表的是一個日期+時間
(3)timestamp代表的是一個當前時間的時間戳

六.表約束

1.概念:所謂的表約束其實就是對錶的數據進行限制,保證數據的準確性、有效性、完整性。如果我們給一張設定了指定約束,那麼數據在插入的時候違法了我們的約束就可以限制插入。

2.約束的種類

約束名

約束的關鍵字

默認值約束

default

非空約束

not null

唯一約束

unique

主鍵約束

primary key(pk)

外鍵約束

foreign key(fk)

檢查約束

check(mysql不支持)

3.默認值約束[DEFAULT]

當給一個字段進行默認值約束的時候,如果這個字段沒有數據的插入 則自動填充我們設置好的默認值

CREATE TABLE test(

    name VARCHAR(20),

    sex VARCHAR(20) DEFAULT '男'

);

4.非空約束[NOT NULL]

當給一個字段進行非空約束的時候,如果字段沒有數據或者是NULL則無法插入,空字符無法控制

CREATE TABLE test(

    name VARCHAR(20) NOT NULL,

    sex VARCHAR(20)

);

5.唯一值約束[UNIQUE]

當給一個字段設定唯一值約束的是,則這個字段在表中不能出現重複數據;唯一約束是允許插入多個null的,所以唯一約束不能限制null值。

CREATE TABLE test(

    id INT UNIQUE,

    name VARCHAR(20),

    sex VARCHAR(20) 

);

6.主鍵約束[PRIMARY KEY]

(1)主鍵約束的作用:其實就是用於來標識數據庫數據的每一條記錄。

(2)主鍵一般設置在哪個字段?

主鍵的設置一般不使用任何的業務字段,所以在設計表的時候,我們通常會建立一個ID的字段,這個字段沒有任何的業務意圖,主要是給我們數據庫和程序員使用的,不直接面對用戶,所以這個ID是沒有任何的實際含義,只要不唯一、非空就可以,其作用是標識每一條數據的狀態。

(3)主鍵約束語法

CREATE TABLE test(

    id INT PRIMARY KEY, -- 主鍵約束

);

(4)主鍵約束的限制

.可以限制字段不爲空

.可以限制字段唯一

.一張表只能存在一個主鍵

.我們可以在創建主鍵之後繼續刪除和添加(但是不建議)
#### 在已創建表中添加主鍵約束

ALTER TABLE 表名 ADD PRIMARY KEY(主鍵字段);

ALTER TABLE test ADD PRIMARY KEY(id);

在已創建表中刪除主鍵約束

ALTER TABLE 表名 DORP PRIMARY KEY;

ALTER TABLE test ADD PRIMARY KEY;

7.自增長約束[auto_increment]

主鍵情況下,我們手動添加很有可能造成數據重複,這個時候我們可以使用自增長約束,每一次插入數據的時候,數據庫自動在主鍵的基礎上+1,保證數據唯一值.

(1)自增長約束語法

CREATE TABLE test(

    id INT PRIMARY KEY  auto_increment, -- 自增長約束

);

(2)自增長約束注意問題:

<1>自增長約束的字段類型必須爲整數類型

<2>自增長字段一般爲主鍵字段

<3>自增長字段從0開始增長,如果需要修該增長開始位置,可以修該爲auto_increment = xxx;

8.外鍵約束

(1)外鍵約束的作用:

外鍵約束一般也只能存在兩張相關聯的表的情況下,對主表(主鍵表)和從表(外鍵表)進行關聯約束.

(2)什麼情況下才會有兩張以上的表呢?

例如下圖的表數據:

 

發現幾個問題:

  1. 員工對應的部門數據極度冗餘
  2. 會損耗查詢效率,浪費內存
  3. 不利於維護,萬一冗餘字段發生了變化,維護成本極高。

如何解決?

單獨將部門拆分出來,然後生成一個部門表,員工表和部門表產生關聯。

閱讀如下代碼

-- 創建員工表

CREATE TABLE emp(

    id INT PRIMARY KEY auto_increment,

    name VARCHAR(20),

    dept_id INT

)

-- 創建一個部門表

CREATE TABLE dept(

    id INT PRIMARY KEY auto_increment,

    name VARCHAR(20)

);

INSERT INTO dept(name) VALUES ('基礎平臺架構部'),('基礎平臺測試部');

 

INSERT INTO emp(name,dept_id) VALUES ('李彥宏',4);

 

我們現在新增數據,在部門的字段插入一個ID爲4的部門
但是,實際上公司根本就沒有這個部門(如果實際業務當中,也算非常嚴重的事故)
這個時候,我們就應該使用兩張表同時限制,主鍵限制外鍵

如何限制?

語法:

CONSTRAINT 外鍵名 FOREIGN KEY(子表外鍵字段名) REFERENCES 主表名(主表主鍵字段名)

 

CONSTRAINT emp_dept_fk FOREIGN KEY(dept_id) REFERENCES dept(id)

實例代碼:

CREATE TABLE emp(

        id INT PRIMARY KEY auto_increment,

        name VARCHAR(20),

        dept_id INT,

        CONSTRAINT emp_dept_fk FOREIGN KEY(dept_id) REFERENCES dept(id)

);

 

 

INSERT INTO emp (name,dept_id ) VALUES('toobug',1),

('王自如',2),

('馬化騰',1),

('雷軍',2),

('求伯君',2),

('馬雲',1);

 

INSERT INTO emp(name,dept_id) VALUES ('李彥宏',4); -- 增加違反了外界約束

UPDATE emp SET dept_id = 5 WHERE id = 1; -- 修改違反外鍵約束

DELETE FROM dept; -- 因爲部門表已經存在了外鍵數據,如果需要刪除則需要先情況所有管理的外鍵數據。

 

9.外鍵在什麼情況下,會進行約束

(1)插入數據:往從表插入主表不存在的數據,外鍵會進行約束

(2)修改數據:往從表修改主表不存在的數據,外鍵會進行約束

(3)修改數據:刪除主表數據,存在外鍵關聯的時候,外鍵會進行約束

 

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