mysql 从入门到放弃

1. 关于SQL区分大小写


1.1 在Mysql数据库中进行查询时,希望英文严格区分大小写。默认情况下是不区分大小写的。


1.2 如何让Mysql数据查询时,严格区分大小写呢?


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


2. distinct 多列


只会查找id 与price 都相同的


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



3. 降序升序

如果想在多个列上进行降序升序, 必须对每一列指定DESC关键字。


4. 在字句中 操作符的优先顺序

圆括号()

and

or



5. in操作符比or 执行更快,在where字句中用来制定要匹配值的清单的关键字,功能与or相当



6.某些情况下,<> 与not 作用一样


7.^ 表示否定


8.在Mysql中两个字符串相加不能用+号,加号是用来做数字相加的,在mysql中要连接字符串需要用CONCAT或者CONCAT_WS函数




     8.1 CONCAT_WS函数()函数, 表示concat with separator,即有分隔符的字符串连接



第一个参数为分隔符?


    8.2 concat_ws的参数中有null的话,并非都返回null


9.mysql 下的trim()

9.1trim函数可以过滤指定的字符串:

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

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

返回字符串 str , 其中所有remstr前缀和/或后缀都已被删除。若分类符BOTH、LEADIN或TRAILING中没有一个是给定的,则假设为BOTH。remstr为可选项,在未指定情况下,可删除空格。

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


MySQL中trim()函数的用法 - lijinxiu123的博客 - CSDN博客


9.2MySQL LTRIM和RTRIM函数 


MySQL trim()函数 - MySQL教程™


10.常见的文本处理函数


《sql 必知必会》

11.mysql 没有DATEPART()


MySQL :: MySQL 8.0 Reference Manual :: 12.7 Date and Time Functions

刷题遇到的:

a. timestampdiff()

TIMESTAMPDIFF(interval,time_start,time_end)

interval: day;month;year;week

mysql 计算两个时间差函数(TIMESTAMPDIFF)的用法 - 程序媛-jjl的博客 - CSDN博客

b. datediff()

DATEDIFF(date1,date2)

MySQL DATEDIFF() 函数 - 许进进的博客 - CSDN博客


12. 数值处理函数


《sql 必知必会》


MySQL数字函数 - Ghost Stories - CSDN博客

刷题中碰见的图上的函数:

ceil(x): 该函数返回的最小整数值,但不能小于X

SELECT CEILING(3.46);

4


pow(x,y)

返回X的Y次方 

要有两个参数


13.聚焦函数 aggregate function


《sql必知必会》

13.1 AVG()只用于单个列,要是求多列的,就要每一列都avg(),忽略为NULL的值


13.2 COUNT()


COUNT(*) 对表中行的数目进行计数,不管列中是否包含空值。


13.3MAX()


文本数据中,MAX()返回该列排序后的最后一行。

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


14. select子句顺序


15.笛卡尔积

由没有联结条件的表关系返回的结果为笛卡尔积。 

检测出的行的数目将是第一个表中的行数乘以第二个表中的行数。


笛卡尔积的联结,也称叉联结 cross join.



内连接(inner join) 

如果没有指定连接条件的话,和笛卡尔积的交叉连接结果一样,但是不同于笛卡尔积的地方是,没有笛卡尔积那么复杂要先生成行数乘积的数据表,内连接的效率要高于笛卡尔积的交叉连接。


16自然联结的作用就是排除多次出现,使每个列只返回一次

标准的联结(内联结)返回所有数据,相同的列甚至多次出现。


17.join

RIGHT 指出的是OUTER JOIN 右边的表,而LEFT 指出的是OUTER JOIN左边的表)。上面的例子使用LEFT OUTER JOIN 从FROM 子句左边的表(Customers 表)中选择所有行

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

mysql不支持full join  

实现方法: right join union left join

full join:  显示符合条件的数据行,同时显示左右不符合条件的数据行,相应的左右两边显示NULL,即显示左连接、右连接和内连接的并集

mysql中的连接 -

详细的连接解释

18.复合查询 compound query

在一个查询中从不同的表返回结构数据

对一个表执行多个查询,按一个查询返回数据


19.UNION

union中的每个查询必须包含相同的列,表达式或聚焦函数

UNION重复的行会被自动取消

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



20.insert 必须给每一列提供一个值,如果某列没有值,则应该使用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 语句从一个表复制数据,然后把数据插入到一个已存在的表中


SQL INSERT INTO SELECT 语句 | 菜鸟教程


SQL INSERT INTO SELECT 语句 | 菜鸟教程


23. as可以作为连接语句的操作符

create table tablename as select * from tablename2;


上面语句的意思就是先获取到tablename表中的所有记录,之后创建一张tablename表,结构和tablename2表相同,记录为后面语句的查询结果。

24.update 用法

UPDATE [LOW_PRIORITY] [IGNORE] table_reference 

 SET assignment_list 

 [WHERE where_condition

 [ORDER BY ...] 

 [LIMIT row_count]


ps:在更新多个列时,只需要使用一条SET 命令, 每个“列=值”对之间用逗号分隔(最后一列之后不用逗号)

要删除某个列的值,可设置它为NULL(假如表定义允许设为NULL值)


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

但是也有区别


MySQL :: MySQL 8.0 Reference Manual :: 13.1.37 TRUNCATE TABLE Syntax


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


26.NULL

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

如果指定''(两个单引号,其间没有字符),这在NOT NULL列中是允许的。

空字符串是一个有效的值,不是无值。


27. 默认值 DEFAULT

mysql中 将系统日前用作默认日期,DEFAULT CURRENT_DATE()


28. 复杂的表结构更改


《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 当有该名称的视图时,该命令会替代旧的视图

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官网手册中,有写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视图的限制,以及实例


30.存储

可以单独编写每条sql语句,并根据结果有条件地执行其他语句。 在每次需要这个处理时,都必须做这些工作。

存储过程就是为以后使用而保存的一条或多条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 存储过程 | 菜鸟教程

链接中 有详细的存储资料




MySQL Prepared语句 - MySQL教程™


31.事务处理 transaction processing

在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。


事务处理是一种机制,用来管理必须成批执行的SQL操作,保证数据不包含不完整的操作结果。

事务 transaction:指一组SQL语句

回退 rollback: 指撤销指定SQL语句的过程

提交 commit: 指将未存储的sql语句结果写入数据库表

保留点save point: 指事务处理中设置的临时占位符 placeholder, 可以对它发布回退 与回退整个事务处理不同


事务处理用来管理INSERT,UPDATE,DELETE语句


31.1 事务的4个条件

事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。

原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

MySQL 事务 | 菜鸟教程


EG:


MySQL 事务 | 菜鸟教程


MySQL 事务 | 菜鸟教程


32.游标 cursor

要处理存储过程中的结果集,请使用游标。游标允许您迭代查询返回的一组行,并相应地处理每行。

sselect整个数据集,然后创建游标,能用游标处理结果中的每一行


declare创建游标

open cusor 打开游标

fetch 访问游标


MySQL游标 - MySQL教程™

33.唯一约束

表可包含多个唯一约束,但每个表只允许一个主键

唯一约束可包含NULL值

唯一约束可修改或更新

唯一约束列的值可重复使用

与主键不一样,唯一约束不能用来定义外键


34.检查约束

check


35.索引

索引用于数据过滤和数据排序

create index


索引必须唯一命名



36.触发器

有以下的访问权:

INSERT操作中的所有新数据

UPDATE操作中的所有新旧数据

DELETE操作中删除的数据


CREATE TRIGGER


37.数据库安全


《mysql必知必会》


39.mysql架构


『浅入浅出』MySQL 和 InnoDB


40.mysql 与 innodb 笔记

『浅入浅出』MySQL 和 InnoDB


42.查看表结构

desc 表名

43.修改数据库引擎

alter table 表名 engine=;(PS:主要有InnoDB和MyISAM,InnoDB对经常修改表数据友好,MyISAM对经常查询表友好)


44.加载外部数据到表

Load data local infile ‘数据路径’Into table 表名 Fields terminated by ‘分隔符’Ignored 1 lines

MySQL增删改查的常用语句汇总 - 知乎


45. Mysql的if既可以作为表达式用,也可在存储过程中作为流程控制语句使用


IF(expr1,expr2,expr3)

如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。


46.ifnull

IFNULL(expr1,expr2)

假如expr1 不为 NULL,则 IFNULL() 的返回值为 expr1; 否则其返回值为 expr2。IFNULL()的返回值是数字或是字符串,具体情况取决于其所使用的语境。

IFNULL(expr1,expr2) 的默认结果值为两个表达式中更加“通用”的一个,顺序为STRING、 REAL或 INTEGER。


47.IF ELSE 做为流程控制语句使用


MySQL if 语句用法 - carl的修行 - CSDN博客

48. end if 例子


declare是创建游标 能够相应地处理每一行


49.mysql中的case

Case具有两种格式。简单Case函数和Case搜索函数。

Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。

mysql操作查询结果case when then else end用法举例 - 常斯特啰嗦司机 - 博客园

--简单Case函数

CASE sex

        WHEN '1' THEN '男'

        WHEN '2' THEN '女'

ELSE '其他' END



--Case搜索函数

CASE WHEN sex = '1' THEN '男'

        WHEN sex = '2' THEN '女'

ELSE '其他' END


50. mysql 中的locate用法

LOCATE(substr,str)

返回子串 substr 在字符串 str 中第一次出现的位置。如果子串 substr 在 str 中不存在,返回值为 0

LOCATE(substr,str,pos)

返回子串 substr 在字符串 str 中的第 pos 位置后第一次出现的位置。如果 substr 不在 str 中返回 0 :

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

-> 7


51.mysql 中的left 用法

LEFT(str,length)

LEFT()函数接受两个参数:

str是要提取子字符串的字符串。length是一个正整数,指定将从左边返回的字符数。

LEFT()函数返回str字符串中最左边的长度字符。如果str或length参数为NULL,则返回NULL值。


如果length为0或为负,则LEFT函数返回一个空字符串。如果length大于str字符串的长度,则LEFT函数返回整个str字符串。

请注意,SUBSTRING(或SUBSTR)函数也提供与LEFT函数相同的功能。


MySQL left()函数 - MySQL教程™

ps:链接中有一个left函数在数据库中截取文本的例子


52. union 与 join的区别

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


53.mysql里面没有intersect()

53.1 intersect()用法


MySQL交集INTERSECT运算符 - MySQL教程™

sql标准有三个集合运算符:union,intersect,minus

53.2 在mysql中实现intersect()



MySQL交集INTERSECT运算符 - MySQL教程™

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子查询。 当一张表在另一张表找到匹配的记录之后,半连接(semi-jion)返回第一张表中的记录。与条件连接相反,即使在右节点中找到几条匹配的记录,左节点 的表也只会返回一条记录。另外,右节点的表一条记录也不会返回。半连接通常使用IN  或 EXISTS 作为连接条件。


通常出现在使用了exists或in的sql中,所谓semi-join即在两表关联时,当第二个表中存在一个或多个匹配记录时,返回第一个表的记录;

与普通join的区别在于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相反,即当在第二张表没有发现匹配记录时,才会返回第一张表里的记录;

当使用not exists/not in的时候会用到,两者在处理null值的时候会有所区别


何时选择anti-join

1 使用not in且相应列有not null约束

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

当无法选择anti-join时,oracle常会采用filter替代

(转)关于semi-join/anti-join的一点探讨 - 我心依旧 - ITeye博客


58. coalesce()函数

coalesce()解释:返回参数中的第一个非空表达式(从左向右)

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") 

返回结果:carrot 

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


59.mysql中的cast()用法

把一个字段转成另一个字段

Cast(字段名 as 转换的类型 )


CHAR[(N)] 字符型 

DATE  日期型

DATETIME  日期和时间型

DECIMAL  float型

SIGNED  int

TIME  时间型


select cast(名字 as DECIMAL)

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


60.mysql中的正则表达式

MySQL中使用 REGEXP 操作符来进行正则表达式匹配。


eg:

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

查找name字段中以'st'为开头的所有数据

MySQL 正则表达式 | 菜鸟教程


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 都可以用来做正则表达式,并且对大小写不敏感。如果需要区分大小写,可以用binary指定大写

62.mysql中的正则表达式


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() 函数

EXTRACT(unit FROM date)

EXTRACT() 函数用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等等。

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() 函数 | 菜鸟教程


64.mysql中的cte 用法

MySQL CTE(公共表表达式) - MySQL教程™

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

64.1 定义

公用表表达式是一个命名的临时结果集,仅在单个SQL语句(例如SELECT,INSERT,UPDATE或DELETE)的执行范围内存在。

与派生表类似,CTE不作为对象存储,仅在查询执行期间持续。 与派生表不同,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字符串函数:字符串截取 - 浪迹天涯 - ITeye博客


67.mysql中的replace()用法

replace(object,search,replace) 

把object中出现search的全部替换为replace 

mySQL中replace的用


68.mysql中的window function

https://www.jianshu.com/p/70f8c2c512b0


69.mysql中的自定义变量

https://www.jianshu.com/p/f42fd10845af


70.mysql中repeat()用法

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

REPEAT(stringnumber)

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


71. mysql中的数据透视表

mysql中没有pivot 这个function



72.mysql中的group_concat()

mysql 中 GROUP_CONCAT()函数,主要用来处理一对多的查询结果,通常会结合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数据

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的条件语句。

当 exists里的条件语句能够返回记录行时(无论记录行是多少,只要能返回),条件就为真 , 返回当前loop到的这条记录。反之如果exists里的条件语句不能返回记录行,条件为假,则当前loop到的这条记录被丢弃。

exists的条件就像一个boolean条件,当能返回结果集则为1,不能返回结果集则为 0。

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


75.exist和in的区别

**如果查询的两个表大小相当,那么用in和exists差别不大。 **

**如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in: **

MySQL - exists与in及any的用法 - 小小默:进无止境 - CSDN博客



76.mysql中的rollup 和 cube

ROLLUP,是GROUP BY子句的一种扩展,可以为每个分组返回小计记录以及为所有分组返回总计记录。

CUBE,也是GROUP BY子句的一种扩展,可以返回每一个列组合的小计记录,同时在末尾加上总计记录。


如果是Group by  ROLLUP(A, B, C)的话,首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。

如果是GROUP BY CUBE(A, B, C),则首先会对(A、B、C)进行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行GROUP BY操作。 grouping_id()可以美化效果。除了使用GROUPING函数,还可以使用GROUPING_ID来标识GROUP BY的结果。

也可以 Group by Rollup(A,(B,C)) ,Group by A Rollup(B,C),…… 这样任意按自己想要的形式结合统计数据,非常方便。



group by分组函数之rollup与cube用法 - blockheading的博客 - CSDN博客

77.mysql中的grouping set

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


78.mysql中的top

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

具体的limit用法:


实现MySQL top n查询的步骤


Mysql 分页语句 Limit原理 - helloxiaozhe的博客 - CSDN博客

这个链接中还提到了怎么用limit做分页,以及如何优化limit!!!!!!!!


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

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


80.mysql中的字节长度计算

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的长度,以字节为单位。 多字节字符计为多个字节。 这意味着对于包含5个2字节字符的字符串,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的长度,以字符为单位。 多字节字符算作单个字符。 这意味着对于包含5个2字节字符的字符串,LENGTH()返回10,而CHAR_LENGTH()返回5。


mysql字符串函数之length,char_length用法 - 刘鸿亮 - CSDN博客


81.mysql中的escape用法

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

MYSQL escape用法 - lovely9862的专栏 - CSDN博客

82.  mysql中的执行顺序

from 表

where 条件

group by 字段

形成虚拟的表及字段,聚合及字段添加

having 筛选数据

distinct 去重

order by 字段 asc,desc

limit 限制条数

select 罗列记录

先根据where 约束条件 将数据从表中加载到内存,所以where的条件作用在数据之前,然后根据字段进行分组,在内存中形成一张虚拟的表包含字段,如果此时有聚合函数则先执行聚合函数,并将聚合函数字段也加到虚拟的表中,接着进行having记录筛选,筛选完成后对数据进行去重,排序,限制等操作后进行显示。

83.mysql中的mid的用法

SQL MID() 函数用于得到一个字符串的一部分

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

字符串从1开始,而非0,Length是可选项,如果没有提供,MID()函数将返回余下的字符串。

MySQL MID()函数用法 -- 简明现代魔法

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

CASCADE

在父表上update/delete记录时,同步update/delete掉子表的匹配记录

SET NULL

在父表上update/delete记录时,将子表上匹配记录的列设为null (要注意子表的外键列不能为not null)

NO ACTION

如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作

RESTRICT

同no action, 都是立即检查外键约束

SET NULL

父表有变更时,子表将外键列设置成一个默认的值 但Innodb不能识别


NULL、RESTRICT、NO ACTION

删除:从表记录不存在时,主表才可以删除。删除从表,主表不变

更新:从表记录不存在时,主表才可以更新。更新从表,主表不变


CASCADE

删除:删除主表时自动删除从表。删除从表,主表不变

更新:更新主表时自动更新从表。更新从表,主表不变


SET NULL

删除:删除主表时自动更新从表值为NULL。删除从表,主表不变

更新:更新主表时自动更新从表值为NULL。更新从表,主表不变


MySql 外键约束 之CASCADE、SET NULL、RESTRICT、NO ACTION分析和作用 - yzuzhang - 博客园

你可能感兴趣的:(mysql 从入门到放弃)