mysql 從入門到放棄

1. 關(guān)于SQL區(qū)分大小寫


1.1 在Mysql數(shù)據(jù)庫中進(jìn)行查詢時,希望英文嚴(yán)格區(qū)分大小寫。默認(rèn)情況下是不區(qū)分大小寫的。


1.2?如何讓Mysql數(shù)據(jù)查詢時,嚴(yán)格區(qū)分大小寫呢?


link: https://www.imooc.com/article/14190


2. distinct 多列


只會查找id 與price 都相同的


Q: 如果只查找一列不同, 是不是要用group by?



3. 降序升序

如果想在多個列上進(jìn)行降序升序, 必須對每一列指定DESC關(guān)鍵字。


4. 在字句中 操作符的優(yōu)先順序

圓括號()

and

or



5. in操作符比or 執(zhí)行更快,在where字句中用來制定要匹配值的清單的關(guān)鍵字,功能與or相當(dāng)



6.某些情況下,<> 與not 作用一樣


7.^ 表示否定


8.在Mysql中兩個字符串相加不能用+號,加號是用來做數(shù)字相加的,在mysql中要連接字符串需要用CONCAT或者CONCAT_WS函數(shù)




?????8.1 CONCAT_WS函數(shù)()函數(shù), 表示concat with separator,即有分隔符的字符串連接



第一個參數(shù)為分隔符?


????8.2 concat_ws的參數(shù)中有null的話,并非都返回null


9.mysql 下的trim()

9.1trim函數(shù)可以過濾指定的字符串:

完整格式:TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str)

簡化格式:TRIM([remstr FROM] str)

返回字符串 str , 其中所有remstr前綴和/或后綴都已被刪除。若分類符BOTH、LEADIN或TRAILING中沒有一個是給定的,則假設(shè)為BOTH。remstr為可選項(xiàng),在未指定情況下,可刪除空格。

?returns a string after removing all prefixes or suffixes from the given string.


MySQL中trim()函數(shù)的用法 - lijinxiu123的博客 - CSDN博客


9.2MySQL LTRIM和RTRIM函數(shù)?



10.常見的文本處理函數(shù)


《sql 必知必會》

11.mysql 沒有DATEPART()


刷題遇到的:

a. timestampdiff()

TIMESTAMPDIFF(interval,time_start,time_end)

interval: day;month;year;week

mysql 計(jì)算兩個時間差函數(shù)(TIMESTAMPDIFF)的用法 - 程序媛-jjl的博客 - CSDN博客

b. datediff()

DATEDIFF(date1,date2)

MySQL DATEDIFF() 函數(shù) - 許進(jìn)進(jìn)的博客 - CSDN博客


12. 數(shù)值處理函數(shù)


《sql 必知必會》


刷題中碰見的圖上的函數(shù):

ceil(x):?該函數(shù)返回的最小整數(shù)值,但不能小于X

SELECT CEILING(3.46);

4


pow(x,y)

返回X的Y次方?

要有兩個參數(shù)


13.聚焦函數(shù) aggregate function


《sql必知必會》

13.1 AVG()只用于單個列,要是求多列的,就要每一列都avg(),忽略為NULL的值


13.2 COUNT()


COUNT(*) 對表中行的數(shù)目進(jìn)行計(jì)數(shù),不管列中是否包含空值。


13.3MAX()


文本數(shù)據(jù)中,MAX()返回該列排序后的最后一行。

? ? ? ? ? ? ? ? ? ? ? MIN()返回該列排序后最前面的行。


14. select子句順序


15.笛卡爾積

由沒有聯(lián)結(jié)條件的表關(guān)系返回的結(jié)果為笛卡爾積。?

檢測出的行的數(shù)目將是第一個表中的行數(shù)乘以第二個表中的行數(shù)。


笛卡爾積的聯(lián)結(jié),也稱叉聯(lián)結(jié) cross join.



內(nèi)連接(inner join)?

如果沒有指定連接條件的話,和笛卡爾積的交叉連接結(jié)果一樣,但是不同于笛卡爾積的地方是,沒有笛卡爾積那么復(fù)雜要先生成行數(shù)乘積的數(shù)據(jù)表,內(nèi)連接的效率要高于笛卡爾積的交叉連接。


16自然聯(lián)結(jié)的作用就是排除多次出現(xiàn),使每個列只返回一次

標(biāo)準(zhǔn)的聯(lián)結(jié)(內(nèi)聯(lián)結(jié))返回所有數(shù)據(jù),相同的列甚至多次出現(xiàn)。


17.join

RIGHT 指出的是OUTER JOIN 右邊的表,而LEFT 指出的是OUTER JOIN左邊的表)。上面的例子使用LEFT OUTER JOIN 從FROM 子句左邊的表(Customers 表)中選擇所有行

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

mysql不支持full join??

實(shí)現(xiàn)方法: right join union left join

full join:? 顯示符合條件的數(shù)據(jù)行,同時顯示左右不符合條件的數(shù)據(jù)行,相應(yīng)的左右兩邊顯示NULL,即顯示左連接、右連接和內(nèi)連接的并集

mysql中的連接 - 簡書

詳細(xì)的連接解釋

18.復(fù)合查詢 compound query

在一個查詢中從不同的表返回結(jié)構(gòu)數(shù)據(jù)

對一個表執(zhí)行多個查詢,按一個查詢返回?cái)?shù)據(jù)


19.UNION

union中的每個查詢必須包含相同的列,表達(dá)式或聚焦函數(shù)

UNION重復(fù)的行會被自動取消

如果想返回所有的匹配行,可適用UNION ALL



20.insert 必須給每一列提供一個值,如果某列沒有值,則應(yīng)該使用NULL值


21.INSERT SELECT 可以用一條select插入多行,不管SELECT語句返回多少行,都將被INSERT插入


22.mysql 不支持 select... into table

? ? ? mysql 支持insert into...select


INSERT INTO tbl_temp2 (fld_id) SELECT tbl_temp1.fld_order_id

? ? FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;

MySQL :: MySQL 8.0 Reference Manual :: 13.2.6.1 INSERT ... SELECT Syntax


INSERT INTO SELECT 語句從一個表復(fù)制數(shù)據(jù),然后把數(shù)據(jù)插入到一個已存在的表中




23. as可以作為連接語句的操作符

create table tablename as select * from tablename2;


上面語句的意思就是先獲取到tablename表中的所有記錄,之后創(chuàng)建一張tablename表,結(jié)構(gòu)和tablename2表相同,記錄為后面語句的查詢結(jié)果。

24.update 用法

UPDATE [LOW_PRIORITY] [IGNORE] table_reference?

?SET assignment_list?

?[WHERE where_condition]?

?[ORDER BY ...]?

?[LIMIT row_count]


ps:在更新多個列時,只需要使用一條SET 命令, 每個“列=值”對之間用逗號分隔(最后一列之后不用逗號)

要刪除某個列的值,可設(shè)置它為NULL(假如表定義允許設(shè)為NULL值)


25.TRUNCATE TABLE 比delete更快的刪除表中所有行

但是也有區(qū)別



可以重置自增字段的起始位置


26.NULL

null值是沒有值,不是空字符串。

如果指定''(兩個單引號,其間沒有字符),這在NOT NULL列中是允許的。

空字符串是一個有效的值,不是無值。


27. 默認(rèn)值 DEFAULT

mysql中 將系統(tǒng)日前用作默認(rèn)日期,DEFAULT CURRENT_DATE()


28. 復(fù)雜的表結(jié)構(gòu)更改


《sql必知必會》


29.view 視圖

CREATE?

?[OR REPLACE]

?[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]?

?[DEFINER = user]

?[SQL SECURITY { DEFINER | INVOKER }]?

?VIEW view_name [(column_list)]?

?AS select_statement?

?[WITH [CASCADED | LOCAL] CHECK OPTION]


29.1 create or replace view 當(dāng)有該名稱的視圖時,該命令會替代舊的視圖

The CREATE VIEW statement creates a new view, or replaces an existing view if the OR REPLACE clause is given. If the view does not exist, CREATE OR REPLACE VIEW is the same as CREATE VIEW. If the view does exist, CREATE OR REPLACE VIEW replaces it.


29.2 視圖的限制

在mysql官網(wǎng)手冊中,有寫view是有許多限制的,例如不能使用index等。

《sql必知必會》中,也有說order by在視圖中禁止使用。

具體情況:

The SELECT statement cannot contain a subquery in the FROM clause.

The SELECT statement cannot refer to system variables or user-defined variables.

Within a stored program, the SELECT statement cannot refer to program parameters or local variables.

The SELECT statement cannot refer to prepared statement parameters.

Any table or view referred to in the definition must exist. If, after the view has been created, a table or view that the definition refers to is dropped, use of the view results in an error. To check a view definition for problems of this kind, use the CHECK TABLE statement.

The definition cannot refer to a TEMPORARY table, and you cannot create a TEMPORARY view.

You cannot associate a trigger with a view.

Aliases for column names in the SELECT statement are checked against the maximum column length of 64 characters (not the maximum alias length of 256 characters).


中文參照:? mysql視圖的限制,以及實(shí)例


30.存儲

可以單獨(dú)編寫每條sql語句,并根據(jù)結(jié)果有條件地執(zhí)行其他語句。 在每次需要這個處理時,都必須做這些工作。

存儲過程就是為以后使用而保存的一條或多條sql語句,可將其視為批文件。


CREATE [DEFINER = { user | CURRENT_USER }]

 PROCEDURE sp_name ([proc_parameter[,...]])? ? [characteristic ...] routine_body proc_parameter:

? ? [ IN | OUT | INOUT ] param_name type characteristic:

? ? COMMENT 'string'? | LANGUAGE SQL? | [NOT] DETERMINISTIC? | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }

? | SQL SECURITY { DEFINER | INVOKER }

routine_body:

  Valid SQL routine statement

[begin_label:] BEGIN  [statement_list]

    ……END [end_label]


MySQL 存儲過程 | 菜鳥教程

鏈接中 有詳細(xì)的存儲資料





31.事務(wù)處理 transaction processing

在 MySQL 中只有使用了 Innodb 數(shù)據(jù)庫引擎的數(shù)據(jù)庫或表才支持事務(wù)。


事務(wù)處理是一種機(jī)制,用來管理必須成批執(zhí)行的SQL操作,保證數(shù)據(jù)不包含不完整的操作結(jié)果。

事務(wù) transaction:指一組SQL語句

回退 rollback: 指撤銷指定SQL語句的過程

提交 commit: 指將未存儲的sql語句結(jié)果寫入數(shù)據(jù)庫表

保留點(diǎn)save point: 指事務(wù)處理中設(shè)置的臨時占位符 placeholder, 可以對它發(fā)布回退 與回退整個事務(wù)處理不同


事務(wù)處理用來管理INSERT,UPDATE,DELETE語句


31.1 事務(wù)的4個條件

事務(wù)是必須滿足4個條件(ACID)::原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨(dú)立性)、持久性(Durability)。

原子性:一個事務(wù)(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結(jié)束在中間某個環(huán)節(jié)。事務(wù)在執(zhí)行過程中發(fā)生錯誤,會被回滾(Rollback)到事務(wù)開始前的狀態(tài),就像這個事務(wù)從來沒有執(zhí)行過一樣。

一致性:在事務(wù)開始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預(yù)設(shè)規(guī)則,這包含資料的精確度、串聯(lián)性以及后續(xù)數(shù)據(jù)庫可以自發(fā)性地完成預(yù)定的工作。

隔離性:數(shù)據(jù)庫允許多個并發(fā)事務(wù)同時對其數(shù)據(jù)進(jìn)行讀寫和修改的能力,隔離性可以防止多個事務(wù)并發(fā)執(zhí)行時由于交叉執(zhí)行而導(dǎo)致數(shù)據(jù)的不一致。事務(wù)隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復(fù)讀(repeatable read)和串行化(Serializable)。

持久性:事務(wù)處理結(jié)束后,對數(shù)據(jù)的修改就是永久的,即便系統(tǒng)故障也不會丟失。

MySQL 事務(wù) | 菜鳥教程


EG:




32.游標(biāo) cursor

要處理存儲過程中的結(jié)果集,請使用游標(biāo)。游標(biāo)允許您迭代查詢返回的一組行,并相應(yīng)地處理每行。

sselect整個數(shù)據(jù)集,然后創(chuàng)建游標(biāo),能用游標(biāo)處理結(jié)果中的每一行


declare創(chuàng)建游標(biāo)

open cusor 打開游標(biāo)

fetch 訪問游標(biāo)


MySQL游標(biāo) - MySQL教程?

33.唯一約束

表可包含多個唯一約束,但每個表只允許一個主鍵

唯一約束可包含NULL值

唯一約束可修改或更新

唯一約束列的值可重復(fù)使用

與主鍵不一樣,唯一約束不能用來定義外鍵


34.檢查約束

check


35.索引

索引用于數(shù)據(jù)過濾和數(shù)據(jù)排序

create index


索引必須唯一命名



36.觸發(fā)器

有以下的訪問權(quán):

INSERT操作中的所有新數(shù)據(jù)

UPDATE操作中的所有新舊數(shù)據(jù)

DELETE操作中刪除的數(shù)據(jù)


CREATE TRIGGER


37.數(shù)據(jù)庫安全


《mysql必知必會》


39.mysql架構(gòu)



40.mysql 與 innodb 筆記

『淺入淺出』MySQL 和 InnoDB


42.查看表結(jié)構(gòu)

desc 表名

43.修改數(shù)據(jù)庫引擎

alter table 表名 engine=;(PS:主要有InnoDB和MyISAM,InnoDB對經(jīng)常修改表數(shù)據(jù)友好,MyISAM對經(jīng)常查詢表友好)


44.加載外部數(shù)據(jù)到表

Load data local infile ‘?dāng)?shù)據(jù)路徑’Into table 表名 Fields terminated by ‘分隔符’Ignored 1 lines

MySQL增刪改查的常用語句匯總 - 知乎


45. Mysql的if既可以作為表達(dá)式用,也可在存儲過程中作為流程控制語句使用


IF(expr1,expr2,expr3)

如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),則 IF()的返回值為expr2; 否則返回值則為 expr3。IF() 的返回值為數(shù)字值或字符串值,具體情況視其所在語境而定。


46.ifnull

IFNULL(expr1,expr2)

假如expr1 不為 NULL,則 IFNULL() 的返回值為 expr1; 否則其返回值為 expr2。IFNULL()的返回值是數(shù)字或是字符串,具體情況取決于其所使用的語境。

IFNULL(expr1,expr2) 的默認(rèn)結(jié)果值為兩個表達(dá)式中更加“通用”的一個,順序?yàn)镾TRING、 REAL或 INTEGER。


47.IF ELSE 做為流程控制語句使用


48. end if 例子


declare是創(chuàng)建游標(biāo) 能夠相應(yīng)地處理每一行


49.mysql中的case

Case具有兩種格式。簡單Case函數(shù)和Case搜索函數(shù)。

Case函數(shù)只返回第一個符合條件的值,剩下的Case部分將會被自動忽略。

mysql操作查詢結(jié)果case when then else end用法舉例 - 常斯特啰嗦司機(jī) - 博客園

--簡單Case函數(shù)

CASE sex

? ? ? ? WHEN '1' THEN '男'

? ? ? ? WHEN '2' THEN '女'

ELSE '其他' END



--Case搜索函數(shù)

CASE WHEN sex = '1' THEN '男'

? ? ? ? WHEN sex = '2' THEN '女'

ELSE '其他' END


50. mysql 中的locate用法

LOCATE(substr,str)

返回子串 substr 在字符串 str 中第一次出現(xiàn)的位置。如果子串 substr 在 str 中不存在,返回值為 0

LOCATE(substr,str,pos)

返回子串 substr 在字符串 str 中的第 pos 位置后第一次出現(xiàn)的位置。如果 substr 不在 str 中返回 0 :

mysql> SELECT LOCATE('bar', ‘foobarbar',5);

-> 7


51.mysql 中的left 用法

LEFT(str,length)

LEFT()函數(shù)接受兩個參數(shù):

str是要提取子字符串的字符串。length是一個正整數(shù),指定將從左邊返回的字符數(shù)。

LEFT()函數(shù)返回str字符串中最左邊的長度字符。如果str或length參數(shù)為NULL,則返回NULL值。


如果length為0或?yàn)樨?fù),則LEFT函數(shù)返回一個空字符串。如果length大于str字符串的長度,則LEFT函數(shù)返回整個str字符串。

請注意,SUBSTRING(或SUBSTR)函數(shù)也提供與LEFT函數(shù)相同的功能。


ps:鏈接中有一個left函數(shù)在數(shù)據(jù)庫中截取文本的例子


52. union 與 join的區(qū)別

union : they only bind fields on top of one another in the two tables.


53.mysql里面沒有intersect()

53.1 intersect()用法


sql標(biāo)準(zhǔn)有三個集合運(yùn)算符:union,intersect,minus

53.2 在mysql中實(shí)現(xiàn)intersect()



54.mysql中不支持 except()只能用于SQLserver

語法:

EXCEPT 子句的基本語法如下所示:

SELECT column1 [, column2 ]

FROM table1 [, table2 ]

[WHERE condition]

EXCEPT

SELECT column1 [, column2 ]

FROM table1 [, table2 ]

[WHERE condition]

https://blog.csdn.net/yiguang_820/article/details/82685561


55. semi-join 和 anti-join


MySQL中的semi-join - zengkefu - 博客園

所謂的semi-join是指semi-join子查詢。 當(dāng)一張表在另一張表找到匹配的記錄之后,半連接(semi-jion)返回第一張表中的記錄。與條件連接相反,即使在右節(jié)點(diǎn)中找到幾條匹配的記錄,左節(jié)點(diǎn) 的表也只會返回一條記錄。另外,右節(jié)點(diǎn)的表一條記錄也不會返回。半連接通常使用IN? 或 EXISTS 作為連接條件。


通常出現(xiàn)在使用了exists或in的sql中,所謂semi-join即在兩表關(guān)聯(lián)時,當(dāng)?shù)诙€表中存在一個或多個匹配記錄時,返回第一個表的記錄;

與普通join的區(qū)別在于semi-join時,第一個表里的記錄最多只返回一次


A semi-join is a preparation-time transformation that enables multiple execution strategies such as table pullout, duplicate weedout, first match, loose scan, and materializtion. The optimizer uses semi-join strategies to improve subquery execution, as described in this section

MySQL :: MySQL 5.7 Reference Manual :: 8.2.2.1 Optimizing Subqueries, Derived Tables, and View References with Semi-Join Transformations


56.mysql中的semi-join

?MySQL, a subquery must satisfy these criteria to be handled as a semi-join:

It must be an?IN?(or?=ANY) subquery that appears at the top level of the?WHERE?or?ON?clause, possibly as a term in an?AND?expression.?

It must be a single?SELECT?without?UNION?constructs.

It must not contain a?GROUP BY?or?HAVING?clause.

It must not be implicitly grouped (it must contain no aggregate functions). eg:avg,min,max,count,sum

It must not have?ORDER BY?with?LIMIT.

The statement must not use the?STRAIGHT_JOIN?join type in the outer query.

The?STRAIGHT_JOIN?modifier must not be present.

The number of outer and inner tables together must be less than the maximum number of tables permitted in a join.


57.anti-join

anti-join則與semi-join相反,即當(dāng)在第二張表沒有發(fā)現(xiàn)匹配記錄時,才會返回第一張表里的記錄;

當(dāng)使用not exists/not in的時候會用到,兩者在處理null值的時候會有所區(qū)別


何時選擇anti-join

1 使用not in且相應(yīng)列有not null約束

2 not exists,不保證每次都用到anti-join

當(dāng)無法選擇anti-join時,oracle常會采用filter替代

(轉(zhuǎn))關(guān)于semi-join/anti-join的一點(diǎn)探討 - 我心依舊 - ITeye博客


58.?coalesce()函數(shù)

coalesce()解釋:返回參數(shù)中的第一個非空表達(dá)式(從左向右)

select coalesce(a,b,c); ?

如果a==null,則選擇b;如果b==null,則選擇c;如果a!=null,則選擇a;如果a b c 都為null ,則返回為null(沒意義)

eg:?select coalesce(null,"carrot","apple")?

返回結(jié)果:carrot?

https://blog.csdn.net/shixiaoguo90/article/details/50633628


59.mysql中的cast()用法

把一個字段轉(zhuǎn)成另一個字段

Cast(字段名 as 轉(zhuǎn)換的類型 )


CHAR[(N)] 字符型?

DATE ?日期型

DATETIME ?日期和時間型

DECIMAL ?float型

SIGNED ?int

TIME ?時間型


select cast(名字 as DECIMAL)

https://blog.csdn.net/u013215018/article/details/80014278


60.mysql中的正則表達(dá)式

MySQL中使用 REGEXP 操作符來進(jìn)行正則表達(dá)式匹配。


eg:

SELECT name FROM person_tbl WHERE name REGEXP '^st';

查找name字段中以'st'為開頭的所有數(shù)據(jù)

MySQL 正則表達(dá)式 | 菜鳥教程


61.mysql中的rlike()

RLIKE operator performs a pattern match of a string expression against a pattern. The pattern is supplied as an argument.

REGEXP and RLIKE are?not?case sensitive, except when used for?

with BINARY and VARBINARY data types

ps:regexp 和rlike 都可以用來做正則表達(dá)式,并且對大小寫不敏感。如果需要區(qū)分大小寫,可以用binary指定大寫

62.mysql中的正則表達(dá)式


MySQL :: MySQL 8.0 Reference Manual :: 12.5.2 Regular Expressions

MySQL - REGEXP, RLIKE - Guide, Examples and Alternatives

MySQL RLIKE operator - w3resource


63.MySQL EXTRACT() 函數(shù)

EXTRACT(unit FROM date)

EXTRACT() 函數(shù)用于返回日期/時間的單獨(dú)部分,比如年、月、日、小時、分鐘等等。

eg:

SELECT EXTRACT(YEAR FROM OrderDate) AS OrderYear,

EXTRACT(MONTH FROM OrderDate) AS OrderMonth,

EXTRACT(DAY FROM OrderDate) AS OrderDay?

FROM Orders

WHERE OrderId=1

MySQL EXTRACT() 函數(shù) | 菜鳥教程


64.mysql中的cte 用法

MySQL CTE(公共表表達(dá)式) - MySQL教程?

ps: 該用法在mysql8.0 之后才有

64.1 定義

公用表表達(dá)式是一個命名的臨時結(jié)果集,僅在單個SQL語句(例如SELECT,INSERT,UPDATE或DELETE)的執(zhí)行范圍內(nèi)存在。

與派生表類似,CTE不作為對象存儲,僅在查詢執(zhí)行期間持續(xù)。 與派生表不同,CTE可以是自引用(遞歸CTE),也可以在同一查詢中多次引用。 此外,與派生表相比,CTE提供了更好的可讀性和性能。

WITH cte_name (column_list)? AS (query)?

SELECT * FROM cte_name;

64.2 with用法

a.?在SELECT,UPDATE和DELETE語句的開頭可以使用WITH子句

WITH...SELECT...

WITH...UPDATE...

WITH...DELETE...

b.可以在子查詢或派生表子查詢的開頭使用WITH子句

SELECT...WHERE id IN(WITH...SELECT...);

SELECT * FROM (WITH...SELECT...) AS derived_table;

c.可以在SELECT語句之前立即使用WITH子句,包括SELECT子句

CREATE TABLE ... WITH ... SELECT ...

CREATE VIEW ... WITH ... SELECT ...

INSERT ... WITH ... SELECT ...

REPLACE ... WITH ... SELECT ...

DECLARE CURSOR ... WITH ... SELECT ...

EXPLAIN ... WITH ... SELECT ...


ps:在兩個cte中,只有第一句需要用with,第二句cte 直接 表格名稱 as 這種格式

65.join vs correlated subqueries vs multiple/nested subqueries vs common table expressions



join:適合用2個或2個以上的database

correlated subqueries :matching data from different columns in one or more table



66.mysql中的substring()用法

字符串的截取

SUBSTRING(str,pos)

從字符串str的起始位置pos返回一個子串

mysql> select SUBSTRING('Quadratically',5);

?-> 'ratically'

相同類似功能 : left();right()

MySQL字符串函數(shù):字符串截取 - 浪跡天涯 - ITeye博客


67.mysql中的replace()用法

replace(object,search,replace)?

把object中出現(xiàn)search的全部替換為replace?

mySQL中replace的用


68.mysql中的window function

http://www.itdecent.cn/p/70f8c2c512b0


69.mysql中的自定義變量

http://www.itdecent.cn/p/f42fd10845af


70.mysql中repeat()用法

The REPEAT() function repeats a string as many times as specified.

REPEAT(string,?number)

https://www.w3schools.com/sql/func_mysql_repeat.asp


71. mysql中的數(shù)據(jù)透視表

mysql中沒有pivot 這個function



72.mysql中的group_concat()

mysql 中 GROUP_CONCAT()函數(shù),主要用來處理一對多的查詢結(jié)果,通常會結(jié)合GROUP BY一起使用。

GROUP_CONCAT([DISTINCT]expr[,expr ...]

[ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC][,col_name ...]]

[SEPARATOR str_val])

https://blog.csdn.net/hjh15827475896/article/details/79237878


73.mysql中插入csv數(shù)據(jù)

https://dev.mysql.com/doc/refman/5.5/en/load-data.html

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name' [REPLACE | IGNORE] INTO TABLE tbl_name [CHARACTER SET charset_name] [{FIELDS | COLUMNS}

? ? ? ? [TERMINATED BY 'string']? ? ? ? [[OPTIONALLY] ENCLOSED BY 'char']? ? ? ? [ESCAPED BY 'char']? ? ]? ? [LINES? ? ? ? [STARTING BY 'string']? ? ? ? [TERMINATED BY 'string']? ? ]? ? [IGNORE number {LINES | ROWS}]? ? [(col_name_or_user_var? ? ? ? [, col_name_or_user_var] ...)]? ? [SET col_name={expr | DEFAULT},? ? ? ? [, col_name={expr | DEFAULT}] ...]


74.mysql中的exist

對外表用loop逐條查詢,每次查詢都會查看exists的條件語句。

當(dāng) exists里的條件語句能夠返回記錄行時(無論記錄行是多少,只要能返回),條件就為真 , 返回當(dāng)前l(fā)oop到的這條記錄。反之如果exists里的條件語句不能返回記錄行,條件為假,則當(dāng)前l(fā)oop到的這條記錄被丟棄。

exists的條件就像一個boolean條件,當(dāng)能返回結(jié)果集則為1,不能返回結(jié)果集則為 0。

select * from tables_name where [not] exists(select..);


75.exist和in的區(qū)別

**如果查詢的兩個表大小相當(dāng),那么用in和exists差別不大。 **

**如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in: **

MySQL - exists與in及any的用法 - 小小默:進(jìn)無止境 - CSDN博客



76.mysql中的rollup 和 cube

ROLLUP,是GROUP BY子句的一種擴(kuò)展,可以為每個分組返回小計(jì)記錄以及為所有分組返回總計(jì)記錄。

CUBE,也是GROUP BY子句的一種擴(kuò)展,可以返回每一個列組合的小計(jì)記錄,同時在末尾加上總計(jì)記錄。


如果是Group by ?ROLLUP(A, B, C)的話,首先會對(A、B、C)進(jìn)行GROUP BY,然后對(A、B)進(jìn)行GROUP BY,然后是(A)進(jìn)行GROUP BY,最后對全表進(jìn)行GROUP BY操作。

如果是GROUP BY CUBE(A, B, C),則首先會對(A、B、C)進(jìn)行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后對全表進(jìn)行GROUP BY操作。 grouping_id()可以美化效果。除了使用GROUPING函數(shù),還可以使用GROUPING_ID來標(biāo)識GROUP BY的結(jié)果。

也可以 Group by Rollup(A,(B,C)) ,Group by A Rollup(B,C),…… 這樣任意按自己想要的形式結(jié)合統(tǒng)計(jì)數(shù)據(jù),非常方便。



group by分組函數(shù)之rollup與cube用法 - blockheading的博客 - CSDN博客

77.mysql中的grouping set

group by cube,rollup, grouping set的用法 - 程序園


78.mysql中的top

mysql不支持top用法,需要用limit表示

具體的limit用法:


實(shí)現(xiàn)MySQL top n查詢的步驟


Mysql 分頁語句 Limit原理 - helloxiaozhe的博客 - CSDN博客

這個鏈接中還提到了怎么用limit做分頁,以及如何優(yōu)化limit?。。。。。。。?/p>


79.mysql中的聚集索引/非聚集索引

Mysql聚集索引和非聚集索引(堆組織表和索引組織表) - ChangWen的博客 - CSDN博客


80.mysql中的字節(jié)長度計(jì)算

80.1 length

LENGTH(str)

Returns the length of the string str, measured in bytes. A multibyte character counts as multiple bytes. This means that for a string containing five 2-byte characters, LENGTH() returns 10, whereas CHAR_LENGTH() returns 5.

返回字符串str的長度,以字節(jié)為單位。 多字節(jié)字符計(jì)為多個字節(jié)。 這意味著對于包含5個2字節(jié)字符的字符串,LENGTH()返回10,而CHAR_LENGTH()返回5。

80.2 char_length()

CHAR_LENGTH(str)

Returns the length of the string str, measured in characters. A multibyte character counts as a single character. This means that for a string containing five 2-byte characters, LENGTH() returns 10, whereas CHAR_LENGTH() returns 5.

返回字符串str的長度,以字符為單位。 多字節(jié)字符算作單個字符。 這意味著對于包含5個2字節(jié)字符的字符串,LENGTH()返回10,而CHAR_LENGTH()返回5。


mysql字符串函數(shù)之length,char_length用法 - 劉鴻亮 - CSDN博客


81.mysql中的escape用法

select * from user where username like '/_nihao' escape '/',意思就是說/之后的_不作為通配符

MYSQL escape用法 - lovely9862的專欄 - CSDN博客

82.? mysql中的執(zhí)行順序

from 表

where 條件

group by 字段

形成虛擬的表及字段,聚合及字段添加

having 篩選數(shù)據(jù)

distinct 去重

order by 字段 asc,desc

limit 限制條數(shù)

select 羅列記錄

先根據(jù)where 約束條件 將數(shù)據(jù)從表中加載到內(nèi)存,所以where的條件作用在數(shù)據(jù)之前,然后根據(jù)字段進(jìn)行分組,在內(nèi)存中形成一張?zhí)摂M的表包含字段,如果此時有聚合函數(shù)則先執(zhí)行聚合函數(shù),并將聚合函數(shù)字段也加到虛擬的表中,接著進(jìn)行having記錄篩選,篩選完成后對數(shù)據(jù)進(jìn)行去重,排序,限制等操作后進(jìn)行顯示。

83.mysql中的mid的用法

SQL MID() 函數(shù)用于得到一個字符串的一部分

SELECT MID(ColumnName, Start [, Length]) FROM TableName

字符串從1開始,而非0,Length是可選項(xiàng),如果沒有提供,MID()函數(shù)將返回余下的字符串。

84.MySql 外鍵約束 之CASCADE、SET NULL、RESTRICT、NO ACTION分析和作用

CASCADE

在父表上update/delete記錄時,同步update/delete掉子表的匹配記錄

SET NULL

在父表上update/delete記錄時,將子表上匹配記錄的列設(shè)為null (要注意子表的外鍵列不能為not null)

NO ACTION

如果子表中有匹配的記錄,則不允許對父表對應(yīng)候選鍵進(jìn)行update/delete操作

RESTRICT

同no action, 都是立即檢查外鍵約束

SET NULL

父表有變更時,子表將外鍵列設(shè)置成一個默認(rèn)的值 但I(xiàn)nnodb不能識別


NULL、RESTRICT、NO ACTION

刪除:從表記錄不存在時,主表才可以刪除。刪除從表,主表不變

更新:從表記錄不存在時,主表才可以更新。更新從表,主表不變


CASCADE

刪除:刪除主表時自動刪除從表。刪除從表,主表不變

更新:更新主表時自動更新從表。更新從表,主表不變


SET NULL

刪除:刪除主表時自動更新從表值為NULL。刪除從表,主表不變

更新:更新主表時自動更新從表值為NULL。更新從表,主表不變


MySql 外鍵約束 之CASCADE、SET NULL、RESTRICT、NO ACTION分析和作用 - yzuzhang - 博客園

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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