1. 程式人生 > >MySql-2019-4-21-復習

MySql-2019-4-21-復習

內存溢出 計算 模糊查詢 bool 二進制文件 開發 ring 除法 tno

數據庫對象:存儲,管理和使用數據的不同結構形式,如:表、視圖、存儲過程、函數、觸發器、事件、索引等。

數據庫:存儲數據庫對象的容器。

數據庫分兩種:

    1. 系統數據庫(系統自帶的數據庫):不能修改
      information_schema:存儲數據庫對象信息,如:用戶表信息,列信息,權限,字符,分區等信息。
      performance_schema:存儲數據庫服務器性能參數信息。
      mysql:存儲數據庫用戶權限信息。
      test:任何用戶都可以使用的測試數據庫。
    1. 用戶數據庫(用戶自定義的數據庫):一般的,一個項目一個用戶數據庫。

常用的操作命令:

  • 查看數據庫服務器存在哪些數據庫:

SHOW DATABASE;

  • 使用指定的數據庫:

USE database_name;

  • 查看指定的數據庫中有哪些數據表:

SHOW TABLES;

  • 創建指定名稱的數據庫:

CREATE DATABASE database_name;

  • 刪除數據庫:
  • DROP DATABASE database_name;

MySQL的存儲引擎:

MySQL中的數據用各種不同的技術存儲在文件(或者內存)中。這些技術中的每一種技術都使用不同的存儲機制、索引技巧、鎖定水平並且最終提供不同的功能和能力。
通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善你的應用的整體功能。

  • MyISAM:擁有較高的插入,查詢速度,但不支持事務,不支持外鍵。

  • InnoDB:支持事務,支持外鍵,支持行級鎖定,性能較低。

InnoDB 存儲引擎提供了具有提交、回滾和崩潰恢復能力的事務安全。但對比MyISAM,處理效率差,且會占用更多的磁盤空間以保留數據和索引。

技術分享圖片

最常用的整數類型:

MySQL列類型(Java數據類型)

  • INT/INTEGER(int/Integer)

  • BIGINT(long/Long)

MySQL 以一個可選的顯示寬度指示器的形式對 SQL 標準進行擴展,這樣當從數據庫檢索一個值時,可以把這個值加長到指定的長度。

例如,指定一個字段的類型為 INT(6),就可以保證所包含數字少於 6 個的值從數據庫中檢索出來時能夠自動地用空格填充。

需要註意的是,使用一個寬度指示器不會影響字段的大小和它可以存儲的值的範圍。一般不用指定位寬。

age int(2),並不是代表age最多存儲99,查詢age值得時候使用兩個0來占位.

技術分享圖片

技術分享圖片

  • FLOAT[(s,p)]

  • DOUBLE[(s,p)]

    小數類型,可存放實型和整型 ,精度(p)和範圍(s)。

    money double(5,2): 整數和小數一共占5位.其中小數占2位,最大值:999.99,最小-999.99.
    都不夠精確。

定點數據類型: DECIMAL,高精度類型,金額貨幣優先選擇。

MySQL列類型(Java數據類型)

  • FLOAT(float/Float)

  • DOUBLE(double/Double)

  • DECIMAL(BigDecimal)

技術分享圖片

char(size) 定長字符,0 - 255字節,size指N個字符數,若插入字符數超過設定長度,會被截取並警告。

varchar(size) 變長字符,0 - 255字節,從MySQL5開始支持65535個字節,若插入字符數超過設定長度,會被截取並警告。

一般存儲大量的字符串,比如文章的純文本,可以選用TEXT系列類型。

註意:在MySQL中,字符使用單引號引起來。 相當於Java中字符串(String,StringBuilder/StringBuffer);

技術分享圖片

技術分享圖片

日期和時間類型為DATETIME、DATE、TIMESTAMP、TIME和YEAR。

註意:在MySQL中,日期時間值使用單引號引起來。 相當於Java中Date,Calender。

技術分享圖片

BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB:
存放圖形、聲音和影像,二進制對象,0-4GB。
但是,在開發中,我們一般存儲二進制文件保存路徑的路徑存儲在數據庫中。

BIT:我們一般存儲0或1,存儲是Java中的boolean/Boolean類型的值。

表操作

  1. 先進入某一個數據庫.

  2. 輸入建表的命令:

CREATE TABLE 表名(
   列名1    列的類型   [約束],
   列名2    列的類型   [約束],
   ....
   列名N    列的類型   約束
);

註意:最後一行沒有逗號

若在建表中使用到了數據庫的關鍵字.
比如新建一張訂單表:(order),但是order是數據庫中的關鍵字(排序使用).

表名:t_order,若費用使用order這個單詞.此時使用反引號()括起來,order`.

一般,起表名為:t_名字。

創建一張學生信息表,記錄學生的id,name,age.

CREATE  TABLE   `t_student`
(
         `id `         bigint,
         `name `  varchar(20),
         ` age `     int
);

查看表結構:

  • DESC table_name;

查看表的詳細定義(顯示表的定義SQL語句):

  • SHOW CREATE TABLE table_name;

刪除表:

  • DROP TABLE table_name;

表的約束(針對於某一列):

  1. 非空約束:NOT NULL,不允許某列的內容為空。

  2. 設置列的默認值:DEFAULT

  3. 唯一約束:UNIQUE,在該表中,該列的內容必須唯一。

  4. 主鍵約束:PRIMARY KEY, 非空且唯一。

  5. 主鍵自增長:AUTO_INCREMENT,從1開始,步長為1。

  6. 外鍵約束:FOREIGN KEY,A表中的外鍵列. A表中的外鍵列的值必須參照於B表中的某一列(B表主鍵)-明天講解。

主鍵設計,唯一標識某一行數據的:

  1. 單字段主鍵,單列作為主鍵,建議使用。
    復合主鍵,使用多列充當主鍵,不建議。

  2. 主鍵分為兩種:

    • 自然主鍵:使用有業務含義的列作為主鍵(不推薦使用),比如身份證號碼;
    • 代理主鍵:使用沒有業務含義的列作為主鍵(推薦使用);

簡單查詢

語法:

SELECT  {*, column [alias],...}
FROM    table_name;

SELECT  <select_list>
FROM    table_name;

說明:
SELECT 選擇查詢列表
FROM 提供數據源(表、視圖或其他的數據源)

表示表中所有的列,但是 和創建表時的順序一致。
可以自己調整順序,在select後邊加上要查詢的列名。

  • 避免重復數據-DISTINCT:

語法:

SELECT  DISTINCK 列名,...

實現數學運算查詢:

對NUMBER型數據(整數和小數)可以使用算數操作符創建表達式(+ - * /)

對DATE型數據可以使用部分算數操作符創建表達式 (+ -)

運算符優先級:

  1. 乘法和除法的優先級高於加法和減法
  2. 同級運算的順序是從左到右
  3. 表達式中使用"括號"可強行改變優先級的運算順序

設置列名的別名。

  1. 改變列的標題頭;

  2. 用於表示計算結果的含義;

  3. 作為列的別名;

  4. 如果別名中使用特殊字符,或者是強制大小寫敏感,或有空格時,都需加單引號;
    `
    不建議列的別名使用單引號,因為一旦使用,該列就不能再排序了.

設置顯示格式查詢:

  • 為方便用戶瀏覽查詢的結果數據,有時需要設置顯示格式,可以使用CONCAT函數來連接字符串。
SELECT CONCAT(name,'前後拼接',age) AS person FROM t_person;

過濾查詢

使用WHERE子句限定返回的記錄:

語法:

SELECT  <selectList> 
FROM    table_name
WHERE   條件1   AND/OR  條件2;

註意:WHERE子句在 FROM 子句後

SQL的各個子句執行先後順序:

  1. FROM 子句: 確定了從哪一張表中去做查詢.

  2. WHERE子句:從表中直接篩選出符合條件數據.

  3. SELECT子句:從篩選之後的結果集中顯示出某些列.

  4. ORDER BY子句:對查詢結果做排序操作

比較運算符:

運算符            含義
=                  等於
>                  大於
>=                 大於或等於
<                  小於
<=                 小於或等於
!=(<>)                 不等於

邏輯運算符:

運算符             含義
AND(&&)          如果組合的條件都是TRUE,返回TRUE
OR(||)           如果組合的條件之一是TRUE,返回TRUE
NOT(!)           如果下面的條件是FALSE,返回TRUE`

優先級              運算符
1               所有比較運算符
2               NOT
3               AND
4               OR

如果有多個查詢條件,盡量把過濾最多的條件放在 WHERE之後,提高性能.

範圍查詢-BETWEEN AND:

使用BETWEEN運算符顯示某一值域範圍的記錄,這個操作符最常見的使用在數字類型/日期類型數據的範圍上,但對於字符類型數據和日期類型數據同樣可用。

  • 格式:SELECT * FROM table_name WHERE 列名 BETWEEN 最小值 AND 最大值:閉區間。

使用IN運算符,判斷列的值是否在指定的集合中。

  • 格式:SELECT * FROM table_name WHERE 列名 IN (值1,值2....);

空值查詢-IS NULL:

NULL表示某一列沒有數據,也不是空字符串.
IS NULL:判斷列的值是否為空。

  • 格式:WHERE 列名 IS NULL;

模糊查詢:

使用LIKE運算符執行通配查詢,查詢條件可包含文字字符或數字:

通配符表示匹配模式:

  • %通配符:可表示零或多個字符任意。
  • _通配符:可表示一個字符。

通配符:用來實現匹配部分值得特殊字符。‘_木%‘

使用ORDER BY子句將查詢記錄進行排序:

  • ASC : 升序,缺省。
  • DESC : 降序。

ORDER BY 子句出現在SELECT語句的最後。

格式:

SELECT <selectList> 
FROM table_name
WHERE 條件
ORDER BY 列名1 [ASC/DESC],列名2 [ASC/DESC]...;

註意:不能使用中文的別名排序。

SELECT語句執行順序:

  • 先執行FROM--->接著執行WHERE--->再執行SELECT--->最後執行ORDER BY

假分頁/邏輯分頁/內存分頁:

  • 一次性查詢出所有的數據,存放在內存中(List集合),每次翻頁的時候,都從內存中取出指定的條數.

特點:翻頁比較快,如果數據量過大,可能造成內存溢出.

真分頁/物理分頁/數據庫分頁(推薦):

  • 每次翻頁都從數據庫中截取指定的條數,假設每頁10條數據,第一頁:查詢0~9條數據,第二頁:查詢10~19條數據.

特點:翻頁比較慢,不會造成內存溢出.

MySQL的分頁設計:

int pageSize = 3;//表示每頁最多顯示3條數據.

分頁查詢結果集的SQL:

       SELECT * FROM  表名    LIMIT  ?,?;
       第一個?:(currentPage - 1) * pageSize;
       第二個?:pageSize

第一頁:SELECT * FROM product LIMIT 0, 3

第二頁:SELECT * FROM product LIMIT 3, 3

第三頁:SELECT * FROM product LIMIT 6, 3

什麽是聚集函數:

  • 聚集函數作用於一組數據,並對一組數據返回一個值。
COUNT:統計結果記錄數  
MAX:  統計計算最大值
MIN:  統計計算最小值
SUM:  統計計算求和
AVG:  統計計算平均值

多表查詢

  • 單表查詢:從一張表中查詢數據

  • 多表查詢:從多張表中聯合查詢出數據

單表查詢:

SELECT <selectList>
FROM  表名

多表查詢(最簡單的):

SELECT <selectList>
FROM  表名A , 表名B

多表查詢,如果沒有連接條件,則會產生笛卡爾積:

數學中定義:假設集合A={a,b},集合B={0,1,2},則兩個集合的笛卡爾積為{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。

實際運行環境下,應避免使用全笛卡爾集。

解決方案: 在WHERE加入有效的連接條件---->等值連接

註意: 連接 n張表,至少需要 n-1個連接條件。

外鍵約束

主鍵約束(PRIMARY KEY): 約束在當前表中,指定列的值非空且唯一.

外鍵約束(FOREIGN KEY): A表中的外鍵列的值必須引用於於B表中的某主鍵列.

為了保證數據的合理性,我們需要建立外鍵約束關系.

規定: employee表中的deptno列的值,應該來源於department表中的主鍵列deptno, 我們就把employee表中的deptno列稱之為外鍵列.

註意:在MySQL中,InnoDB支持事務和外鍵.修改表的存儲引擎為InnDB:

ALTER TABLE 表名 ENGINE=‘InnoDB‘;

InnoDB存儲引擎,支持外鍵又支持事務.

技術分享圖片

多表查詢

  • 內連接查詢:是相對於外連接。

  • 內連接分為:隱式內連接、顯示內連接,其查詢效果相同。

隱式內連接:

SELECT  <selectList>
FROM    A ,B  WHERE A.列 = B.列

顯示內連接(推薦寫法):.

SELECT  <selectList>
FROM    A [INNER] JOIN B ON A.列 = B.列

使用表名前綴在多個表中區分相同的列。

在不同表中具有相同列名的列可以用表的別名加以區分。

使用別名可以簡化查詢。

使用表名前綴可以提高執行效率。

如果使用了表的別名,則不能再使用表的真名。

MySql-2019-4-21-復習