mysql基礎(chǔ)知識(shí)(4)

MySQL有哪些數(shù)據(jù)類型?

數(shù)值類型

整數(shù)

  • TINYINT:1字節(jié)整數(shù),范圍-128到127(無符號(hào)0到255)
  • SMALLINT:2字節(jié)整數(shù),范圍-32768到32767(無符號(hào)0到65535)
  • MEDIUMINT:3字節(jié)整數(shù),范圍-8388608到8388607(無符號(hào)0到16777215)
  • INT或INTEGER:4字節(jié)整數(shù),范圍-2147483648到2147483647(無符號(hào)0到4294967295)
  • BIGINT:8字節(jié)整數(shù),范圍-9223372036854775808到9223372036854775807(無符號(hào)0到18446744073709551615)浮點(diǎn)
  • FLOAT:?jiǎn)尉雀↑c(diǎn)數(shù)
  • DOUBLE:雙精度浮點(diǎn)數(shù)

FLOAT和DOUBLE有什么區(qū)別?
float是單精度浮點(diǎn)數(shù),占用4個(gè)字節(jié)的存儲(chǔ)空間,適用對(duì)精度要求不高,節(jié)省存儲(chǔ)空間的場(chǎng)合

double是雙精度浮點(diǎn)數(shù),占用8個(gè)字節(jié)的存儲(chǔ)空間,適用需要高精度計(jì)算的場(chǎng)合

定點(diǎn)

  • DECIMAL或NUMERIC:
    使用DECIMAL(M,D)的方式表示高精度小數(shù),M表示總位數(shù),D表示有幾位小數(shù)。
    例如:DECIMAL(10,2)表示有10位數(shù)字,2位小數(shù)。

浮點(diǎn)數(shù)與定點(diǎn)數(shù)的區(qū)別?
定點(diǎn)數(shù)意味著小數(shù)點(diǎn)位是固定的,而浮點(diǎn)數(shù)會(huì)有精度限制,四舍五入時(shí)會(huì)有相應(yīng)的誤差。 且定點(diǎn)數(shù)需要更多的存儲(chǔ)空間,更慢的計(jì)算效率,浮點(diǎn)數(shù)一般用于對(duì)精度要求不那么嚴(yán)格的領(lǐng)域,如科學(xué)計(jì)算、工程領(lǐng)域和地理信息系統(tǒng)(GIS),定點(diǎn)數(shù)則更多用于金融、測(cè)量統(tǒng)計(jì)等。

  • bit:存儲(chǔ)的是二進(jìn)制值,可指定存儲(chǔ)的位數(shù),如果不指定默認(rèn)為1。

  • CHAR:固定長(zhǎng)度的非二進(jìn)制字符串

  • VARCHAR:可變長(zhǎng)度的非二進(jìn)制字符串

  • TINYTEXT:最大長(zhǎng)度255的非二進(jìn)制字符串

  • TEXT:最大長(zhǎng)度65,535的非二進(jìn)制字符串

  • MEDIUMTEXT:最大長(zhǎng)度16,777,215的非二進(jìn)制字符串

  • LONGTEXT:最大長(zhǎng)度4,294,967,295的非二進(jìn)制字符串

  • ENUM:枚舉類型,可從列表中選擇一個(gè)值

  • SET:集合類型,可從列表中選擇多個(gè)值

CHAR、VARCHAR和varchar2有什么區(qū)別?
char是一種固定長(zhǎng)度的類型,無論存儲(chǔ)的數(shù)據(jù)多少都會(huì)固定長(zhǎng)度,如果插入的長(zhǎng)度小于定義長(zhǎng)度,則可以用空格進(jìn)行填充。所以char可能更會(huì)浪費(fèi)空間。
varchar是一種可變長(zhǎng)度的類型,當(dāng)插入的長(zhǎng)度小于定義的長(zhǎng)度是,插入多上就存多長(zhǎng)。
varchar是標(biāo)準(zhǔn)sql中定義的,而varchar2是oracle所提供的獨(dú)有的數(shù)據(jù)類型。

二進(jìn)制字符串

  • BINARY:固定長(zhǎng)度的二進(jìn)制字符串
  • VARBINARY:可變長(zhǎng)度的二進(jìn)制字符串
  • TINYBLOB:最大長(zhǎng)度255的二進(jìn)制字符串
  • BLOB:最大長(zhǎng)度65,535的二進(jìn)制字符串
  • MEDIUMBLOB:最大長(zhǎng)度16,777,215的二進(jìn)制字符串
  • LONGBLOB:最大長(zhǎng)度4,294,967,295的二進(jìn)制字符串

查找二進(jìn)制的校對(duì)規(guī)則:
select * from information_schema.collations where collation_name like '%bin';

時(shí)間類型

  • DATE:日期,格式為YYYY-MM-DD
  • TIME:時(shí)間,格式為HH:MM:SS
  • DATETIME:日期和時(shí)間,格式為YYYY-MM-DD HH:MM:SS
  • TIMESTAMP:日期和時(shí)間,與DATETIME類似,但時(shí)間戳范圍較小
  • YEAR:年份,格式為YYYY或YY

timestamp和datetime的區(qū)別?
對(duì)于timestamp來說,如果儲(chǔ)存時(shí)的時(shí)區(qū)和檢索時(shí)的時(shí)區(qū)不一樣,那么拿出來的數(shù)據(jù)也不一樣。
對(duì)于datetime來說,存什么拿到的就是什么。
如果存進(jìn)去的是NULL,timestamp會(huì)自動(dòng)儲(chǔ)存當(dāng)前時(shí)間,而 datetime會(huì)儲(chǔ)存 NULL。

什么是最左匹配原則?

在使用復(fù)合索引進(jìn)行查詢時(shí),MySQL會(huì)首先匹配索引的最左邊的列(第一個(gè)列),然后依次匹配后續(xù)的列。如果最左邊的列沒有被包含在查詢條件中,則MySQL將不會(huì)使用該復(fù)合索引
例如:有一個(gè)復(fù)合索引包含3個(gè)字段(A、B、C)
如果只包含了A列,則索引可能被使用
如果包含了A、B列,則索引可以較為高效的使用。
如果包含了A、B、C列,則索引可以完全使用。
如果只包含了B、C或A、C列,則不符合最左匹配原則,索引失效。

注意事項(xiàng):
列順序:應(yīng)該注意把使用頻率更高的字段放在最前面

覆蓋:如果符合索引完全覆蓋了查詢所需的列/字段,則查詢效率會(huì)得到提升。

SQL語法:

常見的聚合函數(shù)

  • sum(列名) 求和
  • max(列名) 最大值
  • min(列名) 最小值
  • avg(列名) 平均值
  • count(列名) 統(tǒng)計(jì)記錄數(shù)

UNION和UNION ALL有什么區(qū)別?

UNION操作符用于合并兩個(gè)或多個(gè)SELECT語句的結(jié)果集,并且會(huì)默認(rèn)去除重復(fù)的行,只返回唯一的行。
UNION ALL操作符也用于合并兩個(gè)或多個(gè)SELECT語句的結(jié)果集,但它不會(huì)去除重復(fù)的行,即如果存在重復(fù)行,UNION ALL會(huì)將它們?nèi)堪谧罱K的結(jié)果集中。

如果你需要一個(gè)不包含任何重復(fù)行的結(jié)果集,并且不介意MySQL為你去除這些重復(fù)行,那么使用UNION。
如果你需要包含所有行,包括重復(fù)行,并且希望操作更快地執(zhí)行,那么使用UNION ALL。

drop、truncate 和 delete 的區(qū)別?

drop:從數(shù)據(jù)庫(kù)中完全刪除指定的對(duì)象,如表、數(shù)據(jù)庫(kù)、索引、視圖等。一旦執(zhí)行DROP操作,被刪除的對(duì)象將無法恢復(fù),除非有備份。
truncate:快速刪除表中的所有數(shù)據(jù),但保留表的結(jié)構(gòu)。它的執(zhí)行速度通常比DELETE快,尤其是對(duì)于大型表。
delete:根據(jù)指定的條件刪除表中的行數(shù)據(jù)。如果不指定條件,將刪除表中的所有行,但表的結(jié)構(gòu)和約束仍然保留。

區(qū)別 delete truncate drop
SQL類型 DML DDL DDL
支持回滾 × ×
刪除內(nèi)容 表結(jié)構(gòu)還在,刪除所有/部分?jǐn)?shù)據(jù) 表結(jié)構(gòu)還在,刪除全部數(shù)據(jù) 刪除表結(jié)構(gòu)及數(shù)據(jù)
執(zhí)行速度 更快

關(guān)聯(lián)查詢

內(nèi)連接(inner join):取出兩張表中匹配到的數(shù)據(jù),匹配不到的不保留
外連接(outer join):取出連接表中匹配到的數(shù)據(jù),匹配不到的也會(huì)保留,其值為NULL

sql語句的執(zhí)行順序是什么?

1、FROM
FROM 子句是查詢的起點(diǎn),它指定要從中檢索數(shù)據(jù)的表或視圖。在此階段,將處理鏈接、子查詢和表引用。本質(zhì)上此子句是為數(shù)據(jù)檢索設(shè)置上下文。
2、JOIN
JOIN 子句是在FROM子句之后,根據(jù)相關(guān)列合并兩個(gè)或多個(gè)表中的行,它決定了如何匹配不同表中的行。此步驟包括各種類型的連接,如內(nèi)部連接(inner join)、外部連接(left join、right join)和交叉連接(cross join)。
3、WHERE
WHERE 子句根據(jù)指定條件篩選行。它在表聯(lián)接后但在任何分組或聚合發(fā)生之前對(duì)行應(yīng)用條件。此步驟對(duì)于將數(shù)據(jù)集縮小到僅相關(guān)行至關(guān)重要。
4、GROUP BY
GROUP BY 子句將具有相同值的行分組。這通常與聚合函數(shù)(COUNT、SUM、AVG等)一起使用,以對(duì)分組數(shù)據(jù)執(zhí)行計(jì)算。該子句是根據(jù)指定的列將數(shù)據(jù)組織到群組中。
5、HAVING
HAVING 子句與 WHERE 子句類似,根據(jù)指定的條件過濾組。但它是在分組完成后應(yīng)用的。該子句可用于過濾聚合后不符合某些條件的組。
6、SELECT
SELECT 子句指定要包含在結(jié)果集中的列或表達(dá)式。您可以在此處定義查詢的輸出,包括任何計(jì)算、表達(dá)式和別名。該子句確定將從查詢中返回哪些數(shù)據(jù)。
7、DISTINCT
DISTINCT 關(guān)鍵字從結(jié)果集中刪除重復(fù)的行。它在子句之后應(yīng)用,以確保輸出僅包含唯一行。
8、ORDER BY
ORDER BY 子句根據(jù)一個(gè)或多個(gè)列對(duì)結(jié)果集進(jìn)行排序。應(yīng)用此語句,可以將結(jié)果集按所需順序顯示。還可以根據(jù)需要指定升序或降序排序來組織數(shù)據(jù)。ORDER BY SumOrderAmount DESC
9、LIMIT 或 TOP
LIMIT(MySQL)或 TOP(SQL Server)子句限制了查詢返回的行數(shù),并選擇性地跳過指定的行數(shù)。


sql語句的執(zhí)行過程


大體來說,MySQL 可以分為 Server 層和存儲(chǔ)引擎層兩部分。

Server層包括連接器、查詢緩存、分析器、優(yōu)化器、執(zhí)行器等,涵蓋MySQL的大多數(shù)核心服務(wù)功能,以及所有的內(nèi)置函數(shù)(如日期、時(shí)間、數(shù)學(xué)和加密函數(shù)等),所有跨存儲(chǔ)引擎的功能都在這一層實(shí)現(xiàn),比如存儲(chǔ)過程、觸發(fā)器、視圖等。

而存儲(chǔ)引擎層負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)和提取。其架構(gòu)模式是插件式的,支持 InnoDB、MyISAM、Memory 等多個(gè)存儲(chǔ)引擎?,F(xiàn)在最常用的存儲(chǔ)引擎是 InnoDB,它從 MySQL 5.5.5版本開始成為了默認(rèn)存儲(chǔ)引擎。

1.連接器,這里負(fù)責(zé)跟客戶端建立連接、獲取權(quán)限、維持和管理連接,這里需要我們輸入在命令行輸入mysql -u root -p 輸入密碼或使用navicat等客戶端登錄。
2.查詢緩存,在這里,mysql拿到查詢語句,會(huì)先去緩存里找,如果之前執(zhí)行過相同的語句,那么這里就可以直接從緩存中取出結(jié)果返回,如果不在緩存中就繼續(xù)向下執(zhí)行。
3.分析器,這里對(duì)sql語句進(jìn)行解析,根據(jù)關(guān)鍵字識(shí)別是什么樣的sql,然后判斷這條sql是否有語法錯(cuò)誤,如果有則會(huì)報(bào)錯(cuò):You have an error in your SQL syntax
4.優(yōu)化器,這里要對(duì)執(zhí)行效率進(jìn)行優(yōu)化,從幾種方案中選出效率最高的一種。
5.執(zhí)行器,這里開始執(zhí)行sql語句,執(zhí)行之前會(huì)先判斷有沒有對(duì)應(yīng)權(quán)限,沒有的話會(huì)報(bào)錯(cuò),如果有權(quán)限,優(yōu)化器就會(huì)根據(jù)表的引擎定義,去使用這個(gè)引擎提供的接口。

Mysql中having和where的區(qū)別

  • having是在分組后對(duì)數(shù)據(jù)進(jìn)行過濾
  • where是在分組前對(duì)數(shù)據(jù)進(jìn)行過濾
  • having后面可以使用聚合函數(shù)
  • where后面不可以使用聚合函數(shù)
  • 如果mysql創(chuàng)建函數(shù)報(bào)錯(cuò)1418 有可能是開起來binlog日志
    SET GLOBAL log_bin_trust_function_creators = 1;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第1章 初識(shí)MySQL 1.1 數(shù)據(jù)庫(kù)基礎(chǔ) 1.1.1 什么是數(shù)據(jù)庫(kù) 1.1.2 表 1.1.3 數(shù)據(jù)類型 1.1...
    _Cappuccino_閱讀 12,743評(píng)論 0 0
  • MySQL和SQL MySQL,一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),用來持久化保存數(shù)據(jù)。SQL,結(jié)構(gòu)化查詢語言,通過SQL可...
    Wjun閱讀 883評(píng)論 0 1
  • 1. mysql 基本數(shù)據(jù)類型以及長(zhǎng)度 類型大小范圍(有符號(hào))范圍(無符號(hào))用途 TINYINT1 字節(jié)(-128...
    596_19b5閱讀 167評(píng)論 0 0
  • MySQL 一、數(shù)據(jù)庫(kù)簡(jiǎn)單介紹 按照數(shù)據(jù)庫(kù)的發(fā)展時(shí)間順序,主要出現(xiàn)了以下類型數(shù)據(jù)庫(kù)系統(tǒng): 上面4中數(shù)據(jù)庫(kù)系統(tǒng)中,關(guān)...
    不知?dú)q月惜閱讀 315評(píng)論 0 0
  • MYSQL簡(jiǎn)介 MySQL是一個(gè)開源的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),也是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)之一,使用標(biāo)準(zhǔn)化的 S...
    geekdeedy閱讀 555評(píng)論 0 0

友情鏈接更多精彩內(nèi)容