1.MySQL 提供了大量的内置函数,用于在查询中执行各种操作,如字符串处理、日期和时间处理、数学计算等。以下是一些常见的 MySQL 函数及其使用示例:
1. 字符串函数
-
CONCAT():连接两个或多个字符串。
SELECT CONCAT('Hello', ' ', 'World'); -- 输出 'Hello World'
-
LENGTH() 或 CHAR_LENGTH():返回字符串的长度。
SELECT LENGTH('Hello'); -- 输出 5
-
UPPER() 和 LOWER():将字符串转换为大写或小写。
SELECT UPPER('hello'); -- 输出 'HELLO'
SELECT LOWER('HELLO'); -- 输出 'hello'
-
TRIM():去除字符串的前导和尾随空格。
SELECT TRIM(' Hello '); -- 输出 'Hello'
-
SUBSTRING():从字符串中提取子串。
SELECT SUBSTRING('Hello World', 1, 5); -- 输出 'Hello'
2. 日期和时间函数
-
NOW():返回当前的日期和时间。
SELECT NOW(); -- 返回当前的日期和时间,如 '2023-10-23 10:00:00'
-
CURDATE():返回当前日期。
SELECT CURDATE(); -- 返回当前日期,如 '2023-10-23'
-
CURTIME():返回当前时间。
SELECT CURTIME(); -- 返回当前时间,如 '10:00:00'
-
DATE_FORMAT():按指定格式显示日期/时间。
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); -- 按指定格式显示当前日期和时间
-
DATEDIFF():返回两个日期之间的天数差。
SELECT DATEDIFF('2023-10-25', '2023-10-23'); -- 输出 2
3. 数学函数
-
ABS():返回数的绝对值。
SELECT ABS(-10); -- 输出 10
-
ROUND():对数进行四舍五入。
SELECT ROUND(10.75); -- 输出 11
-
CEIL() 或 CEILING():返回大于或等于一个数的最小整数。
SELECT CEIL(10.75); -- 输出 11
-
FLOOR():返回小于或等于一个数的最大整数。
SELECT FLOOR(10.75); -- 输出 10
-
MOD():返回两数相除的余数。
SELECT MOD(10, 3); -- 输出 1
4. 聚合函数
-
COUNT():计算表中的记录数。
SELECT COUNT(*) FROM your_table;
-
SUM():计算某列的总和。
SELECT SUM(column_name) FROM your_table;
-
AVG():计算某列的平均值。
SELECT AVG(column_name) FROM your_table;
-
MAX() 和 MIN():返回某列的最大值和最小值。
SELECT MAX(column_name), MIN(column_name) FROM your_table;
这只是 MySQL 中可用函数的一小部分。MySQL 提供了丰富的函数库,可以根据具体需求选择适合的函数。在使用这些函数时,请确保查阅 MySQL 的官方文档以获取最准确和详细的信息。
2.MySQL的执行顺序
执行顺序
FROM -> JOIN -> ON -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> ORDER BY -> LIMIT
执行顺序解释
1.from 要做数据分析,得先有个表
2.join 一个表可能还不够,两个表甚至多个表都可以,关联条件啥也先不用,可以都来个笛卡儿积先
3.on 在诸多表左右连接后,设定两个表之间的关联键,把不符合条件的全部筛掉
4.where 上三步整合各表,形成一个统一大表;在此大表上,设置筛选条件
5.group by 把指定字段相同的行组合在一起,其余没有加入group by的字段,可以用聚合函数如max/min等合并
6.having 在group by了之后,再度指定筛选条件;注意where和having是不同的,主要在于中间多了group by
7.select 在行层面的处理暂告一段落,在列层面再来一波
8.distinct 指定字段去重
9.order by 指定字段排序,升降序
10.limit 指定哪些行
3.varchar与char的区别?
char:
- char表示定长字符串,长度是固定的;
- 如果插入数据的长度小于char的固定长度时,则用空格填充;
- 因为长度固定,所以存取速度要比varchar快很多,甚至能快50%,但正因为其长度固定,所以会占据多余的空间,是空间换时间的做法;
- 对于char来说,最多能存放的字符个数为255,和编码无关
varchar:
- varchar表示可变长字符串,长度是可变的;
- 插入的数据是多长,就按照多长来存储;
- varchar在存取方面与char相反,它存取慢,因为长度不固定,但正因如此,不占据多余的空间,是时间换空间的做法;
- 对于varchar来说,最多能存放的字符个数为65532
日常的设计,对于长度相对固定的字符串,可以使用char,对于长度不确定的,使用varchar更合适一些。
4.MySQL中 in 和 exists 的区别?
MySQL中的in语句是把外表和内表做hash连接,而exists语句是对外表做loop循环在对内表进行查询,我们可能认为exists比in语句的查询效率要高,这种说法其实是不准确的,要区分表的使用场景:
1.如果查询的两个表大小相当,那么用in和exists差别不大。
2.如果两个表一个较小,一个是大表,则子查询表达的用exists,子查询表小的用in。
3.not in 和not exists:如果查询语句使用not in ,那么内外表都要进行全表扫描,没有用到索引;而not exists 的子查询依然能用到表上的索引。所以无论哪个表大,用not exists 都比not in 要快。
5.drop、delete与truncate的区别?
三者都表示删除,但是三者有一些差别:
delete | truncate | drop | |
---|---|---|---|
类型 | 属于DML | 属于DDL | 属于DDL |
回滚 | 可回滚 | 不可回滚 | 不可回滚 |
删除内容 | 表结构还在,删除表的全部或者一部分数据行 | 表结构还在,删除表中的所有数据 | 从数据库中删除表,所有数据行,索引和权限也会被删除 |
删除速度 | 删除速度慢,需要逐行删除 | 删除速度快 | 删除速度最快 |
因此,在不再需要一张表的时候,用drop;在想删除部分数据行时候,用delete;在保留表而删除所有数据的时候用truncate。
6.UNION与UNION ALL的区别?
- 如果使用UNION ALL,不会合并重复的记录行,UNION会合并重复的行
- 效率 UNION 高于 UNION ALL
7.count(1)、count(*) 与 count(列名) 的区别?
三种计数方式
执行效果:
- count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL
- count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL
- count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计。
执行速度:
- 列名为主键,count(列名)会比count(1)快
- 列名不为主键,count(1)会比count(列名)快
- 如果表多个列并且没有主键,则 count(1) 的执行效率优于 count(*)
- 如果有主键,则 select count(主键)的执行效率是最优的
- 如果表只有一个字段,则 select count(*)最优。