整形的类型:
tinyint -128 到127 取值 占用1个字符
smallint -32768到65535 占用2个字符
mediumint 占用3个字符
int 占用4个字符
bigint 占用8个字符
int 这个类型最常见 ,也是推荐使用的一个类型
int(3) 3代表的是宽度,
那么 1234是否可以存入数据库? 答案:是可以的
默认是0填充
不影响数值的取值范围
1234
012
zerofill
实数类型:
float double decimal
decimal可存储比bigint还大的的整数,可以用户存储精确的小数
float和double类型支持使用标准的浮点进行近似计算。而decimal存储的则是一个字符串,更加精确
延伸考点:
mysql基础操作
mysql存储引擎
mysql锁机制
mysql事务处理、存储过程、触发器
sum avg min max count 这些都是聚合函数 联合 group by 使用 如果想要在 联合的函数上使用排序 可以使用 order by 。
如果需要查询到 sum 值大于 300 的,那么可以在 group by 的后面 加入 having 条件 例如下面语句:
select atype.id,position_name,count(ads.id) as total,sum(sort) as sumtotal from web_adstype as atype left join web_ads as ads on ads.adstype=atype.id group by ads.adstype HAVING sumtotal>300;
select atype.id,position_name,count(ads.id) as total,sum(sort) as sumtotal from web_adstype as atype left join web_ads as ads on ads.adstype=atype.id group by ads.adstype;
select atype.id,position_name,count(ads.id) as total,sum(sort) as sumtotal from web_adstype as atype left join web_ads as ads on ads.adstype=atype.id group by atype.id;
以上两个 group by atype.id 和 group by ads.adstype 这两个分组显示的效果是一样的。
select atype.id,position_name,count(ads.id) as total,sum(sort) as sumtotal from web_adstype as atype left join web_ads as ads on ads.adstype=atype.id where atype.id=11 group by ads.adstype;
拿到sort总和大于300的数据
select atype.id,position_name,count(ads.id) as total,sum(sort) as sumtotal from web_adstype as atype left join web_ads as ads on ads.adstype=atype.id group by ads.adstype HAVING sumtotal>300;
按照sort总和进行排序如何写代码?按照总和数据 倒叙排序。
select atype.id,position_name,count(ads.id) as total,sum(sort) as sumtotal from web_adstype as atype left join web_ads as ads on ads.adstype=atype.id group by atype.id order by sumtotal desc;
实数类型:
float double decimal
decimal 可以存储比bigint还大的整数;可以用户存储精确的小数,
float和double类型支持使用标准的浮点进行近似的计算
字符串类型:
varchar char text blob
对于varchar长度,如果存储内容超出指定的长度,会被截取.
char 定长的,根据定义的字符串长度分配足够的空间
char会根据需要采用空格进行填充以方便比较
char适合存储很短的字符串,或者所有制都接近同一个长度的字符串
比如说 md5 32位的字符串
char的长度,超出设定的长度会被截取。
对于经常变更的数据,char比varchar更好,char不容易产生碎片
对于非常短的列,char比varchar存储空间更有效率。
只分配真正需要的空间,更长的列会消耗更多的内存(根据需求去定义)
尽量避免使用blob/text类型,查询会使用临时表,导致严重的性能开销。
枚举:
枚举存储在数据库中的就是 1 或 0
日期和时间:
尽量使用 timestamp() 比 datetime 空间效率高
now() 返回当前服务器的时间
year(now()) 返回年份
month(now()) 返回月份
time(now()) 返回时分秒
使用整数保存时间戳的格式通常不方便处理 。
如果需要存储微妙 ,可以使用bigint来存储(微秒是小数,如何存储呢,可以乘以 10000 来定义成一个整形,拿出来的时候,再除以10000 这样的效率要比使用float 和double 类型 的效率高)
列属性:
auto_increment
default
not null
常见操作: mysql -u root -p -h
\G 打印结果 垂直显示
\c 取消当前sql命令
\q 退出
数据表引擎:
InnoDB表引擎
默认事务性引擎,最重要最广泛的存储引擎,性能非常优秀
数据存储在共享表空间,可以通过配置分开。
对主键查询的性能高于其他类型存储引擎
支持行级锁
支持崩溃恢复
支持外键
不支持全文索引
比MyISAM占用空间多
MyISAM表区别
5.1版本前 myISAM默认的存储引擎
拥有全文索引,压缩、
不支持事务和行级锁,不支持崩溃后的安全恢复
表存储在两个文件 MYD和MYI 分别代表 数据和表索引
设计简单,某些场景下性能很好。
其他 csv memory 三种表引擎
建议使用 InnoDB
表锁是日常开发中常见的问题,因此也是面试中最常见的考察点,当多个查询统一时刻进行数据修改时,就会产生并发控制的问题。
共享锁、排它锁
表锁:系统性能开销最小,会锁定整张表,myISAM使用表锁
行锁:最大长度支持并发处理,但是也带来了最大的锁开销。InnoDB使用行锁
mysql事务处理:
事务处理,两张表都是InnoDB
在非事务表上执行事务的操作,不会提醒也不会报错
存储过程:
为以后使用而保存的一条或多条sql语句的一个集合
存储过程就是业务逻辑和流程的集合
可以存储过程中 创建表,更新数据 删除等
使用场景:
通过吧处理封装在容易使用单元里,方便使用
触发器:
特殊的一个存储过程
可以通过数据库中相关表实现级联的更改
实时监控某张表的某个字段的更改,从而做出相应的更改。
不能滥用,否则不容易管理。
请说明 表引擎InnoDB(共享表空间)和myISAM的区别
真题回顾:
描述mysql中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响?
思考:
mysql索引的基础和类型
mysql索引的创建原则
mysql
什么是索引?
索引:类似于书的目录,定位到对应的页码
存储引擎使用类似的方式进行数据库的查询,先去索引当中找到对应的值,然后根据匹配索引找到对应的数据行。
索引对性能的影响:
大大减少服务器需要扫描的数据量
帮助服务器避免排序和临时表
将随机IO转换成顺序的IO
大大提高查询速度,减低写的速度 占用磁盘
索引使用场景:
对于非常小的表,大部分情况下全表扫描效率更高。
中到大型表 索引非常有效。
特大型的表,建立和索引的代价随之增长,使用分区技术来解决
索引的类型:
索引有很多类型,都是实现在存储引擎层的。
普通索引:最基本的索引,没有任何约束限制。
唯一索引:和普通索引类似,但是具有唯一性的约束。
主键索引:特殊的唯一索引,不允许有空值
唯一索引和主键索引的区别:
一个表只能有一个主键索引,可以有多个唯一索引
主键索引一定是唯一索引,唯一索引不是主键索引
主键索引可以与外键构成参照完整性约束,防止数据不一致。
组合索引:将多个列组合在一起创建索引。
外键索引:只有InnoDB类型才可以使用
全文索引:只有myISAM才可以使用
外键索引,我们一般情况下不去使用,我们采用业务逻辑关联在一起的。
mysql索引的创建原则:
1、最实业索引的列是出现在where字句中的列,或链接子句中的列而不是出现在select关键字后的列
2、索引列的基数越大,索引的效果越好
3、对字符串进行索引,应该制定一个前缀长度,可以大大节省索引空间。
4、根据情况,创建复合作引,复合索引可以提高查询数量。
5、避免创建过多的索引,索引会额外占用磁盘空间,降低写操作效率。
6、主键尽可能选择较短的数据类型,可以有效减少索引磁盘占用空间,提高查询效率。
mysql索引创建
这是一个复合索引: 有前缀性 有连续性 如果这两项缺一,那就是不能使用到索引。
切记:
符合索引遵循前缀原则
like 前边不要使用 % 这样就不使用索引了。
column is null 可以使用索引
如果mysql估计使用索引会比全表扫描更慢,会放弃索引
如果or前的条件中列有索引,后面的没有,索引都不会用到
列类型是字符串,查询时一定要给值加引号,否则索引失效。
Elasticsearch实战——全文检索架构设计
http://blog.csdn.net/laoyang360/article/details/74090398
数据库分区?
SQL的编写特点:
mysql关联查询
mysql关联更新
六种关联查询
cross join B
没有任何关联条件,结果是笛卡尔积 结果集会很大,没有意义。
inner join 可以缩写成 join
select * from A inner join B on A.id=B.id
自连接: A表连接A表 比如: select * from A T1 inner join A T2 on T1.id=T2.pid
内连接,不以任何表为主,只找on后面条件的数据,找到后就显示。
left join
显示匹配左表,按照on后面的条件匹配右表,如果右表没有匹配到数据以null填充
right join
先去匹配右表,按照on后面的条件匹配左表,如果左表没有匹配到数据以null填充
就是多个结果集 集中在一起
UNION
UNION ALL 不会合并重复的数据。
嵌套查询:
用一条sql语句的查询结果作为另一条的sql语句的条件
Mysql查询优化考点:
请简述项目中优化SQL语句执行效率的方法,从哪些方面,SQL语句性能如何分析?
查找 分析查询速度慢的原因
分析SQL查询慢的方法:
1、记录慢查询日志 慢查询语句 (如何开启?如何分析)
打开配置文件 window my.ini 如果是 linux my.cnf
log_slow_queries=path\filename //如果这里没有设置,默认保存在数据库的同目录
long_query_time=n 执行超过n秒的sql语句就记录下来。 如果没有设置默认是10秒
通过上述的方法设置成功后,此时需要重新启动mysql服务器才可以生效。这在某些业务场景是不允许的。
这时可以通过另外一种动态的控制慢查询日志的开启与停止,通过设置mysql变量 slow_query_log 为关闭状态可以停止改日志
set global slow_query_log=on; //不重启启动mysql服务器的情况下,启动慢查询日志 slow_query_log=on;
set global long_query_time=3; //超过3秒的sql语句就记录下来
如何关闭慢查询日志? set global slow_query_log=off; 就关闭了。
删除慢查询日志: mysqladmin -u root -p flush-logs
这样就会重新生成一个慢查询日志,如果你需要备份以前旧的日志文件,必须先备份出来,然后再执行 flush-logs 这个命令。
如果在linux下,可以直接 rm -rf log日志文件 删除
分析查询日志,不要直接打开慢查询日志进行分析,这样比较浪费时间和经理,可以使用
pt-query-digest工具进行分析
2、使用 show profile 来查看
set profiling=1;
show profiles; 存储在临时表中
show profile for query 2; 时间花费在哪里? 查看sql语句花费在哪里
3、show status 会返回一些计数器,show global status 查看服务器级别的所有计数
有时间可猜测出哪些花费的时间较高,可以针对这些进行一些优化。
可以查看到 show status 也可以看到一些 select 执行的次数。
4、show processlist; 记录一些大量线程出于不正常的状态
5、explain sql语句 \G <====> desc sql语句 \G
这就是以上分析sql执行慢的原因。。
explain 可以分析单条sql语句的执行。
优化查询过程中的数据访问:
访问数据太多导致查询性能下降
确定应用程序是否在检索大量超过需求的数据,可能太多行 或太多列
确认mysql是否在分析所有行
查询不需要的列,使用limit分离
多表关联返回全部列,指定 需要的列
尽量不适用 * 查找返回所有列。
重复查询相同的数据,可以缓存数据,下次直接读取缓存
是否在扫描额外的记录:
使用个索引覆盖扫描,把所有的列放在索引中
改变数据库和表的结构,修改数据表范式
重写SQL语句,让优化器可以以更优的方式去查询。
一个复杂查询还是多个简单查询?
MySQL内部每秒能扫描内存中上百万行数据,相比之下,相应数据给客户端就要慢的多。
使用尽可能少的查询是好的,但是有时将一个大的查询分解为多个小的查询是很有必要的。
切分查询:
分解关联查询:
可以将一条关联语句分解成多条sql来执行
让缓存效率更高
执行单个查询可以减少锁的竞争
在应用层做关联可以更容易对数据库进行拆分
优化特定类型的查询语句:
确定ON或者 USING自居的列上有索引
确保group by 和 order by 中只有一个表中的列,这样mysql才有可能使用索引
尽量少使用子查询 ,尽可能的使用关联查询来查询。
优化group by 和distinct
这两种查询均可使用索引来优化,是最有效的优化方法。
关联查询中,使用个标识列进行分组的效率会更高
如果不需要order by 进行group by时使用order by null ,这样mysql就不会在进行文件排序了。
导致性能的消耗。
优化UNION
可以使用 UNION ALL 来优化 UNION
SQL语句优化的一些方法:
mysql分区发表的使用场景和区别
分区表的原理:
分区对于PHP来说,无区别
对于mysql是分区操作: 分配到这4个区
对于创建表使用partition by 自居定义每个分区存放的数据,执行查询时,有呼气会根据分区定义过滤那些没有我们需要数据的分区,
这样查询只需要查询所需数据在的分区即可。
分区原理:将数据按照一个较粗力度放在一个区里。
分区适用场景:
1、表非常大,无法全存在内存,或者表最后有热点数据,其他都是历史数据
2、分区表的数据更容易维护,可以对独立分区进行独立操作
3、分区表的数据可以分布在不同的机器上,从而高效使用资源。
4、可以独立复制和备份
限制:
一个表最多有1024个分区
5.1版本中分区表达式必须是整数、5.5可以使用列分区
分区表无法使用外键索引
需要对现有表结构进行修改
所有分区必须使用相同的存储引擎
不是所有的存储引擎都支持分区
分库分表的原理:
通过一些hash算法或者工具实现将一张数据表垂直或水平进行物理切分,并存储
使用场景:
分表方式:
水平分割
把一张表分割成多张表 ,特别是有些数据常用有些数据不常用。
把需要数据存放在多个介质上
弊端:
1、给应用增加复杂度,通常查询时需要多个表名,查询所有数据都需要UNION操作
2、在许多数据库应用中,这种复杂性会超过它带来的有点,查询是会增加一个索引层的磁盘次数
有时候也会降低水平分表的使用。
垂直分割:
1、一个表某些列常用,其他列不常用
需要进行left join 进行关联
mysql的复制原理及负责均衡
mysql主从复制解决的问题:
数据分布:随意停止或开始复制,并在不同地理位置分布数据备份
负载均衡:降低单个服务器的压力
高可用和故障切换:帮助应用程序避免单点失败
升级测试:可以使用个更高版本的mysql作为从库
真题:
设定网站用户熟练挂载千万级,但是活跃用户的数量只有1%,如何通过优化数据库提高活用用户的访问速度?
我们把常用的数据分出来:
我看使用分区 分库分表水平切分 比较好
mysql分区可以帮助我们将活跃用户与非活跃用户进行划分。
SQL语句应该考虑哪些安全?
1、使用预处理防止sql 注入 可以使用 prepare 也可以提高mysql的执行效率。
2、写入数据库的数据要进行特殊字符转义
3、查询错误信息不要返回给用户,将错误记录到日志
定期做数据备份
不给查询用户root权限,合理分配权限
关闭远程访问数据库权限
修改root口令,不用默认口令
改变root用户名称
限制一般用户浏览其他数据库
限制用户对数据文件的访问权限
为什么PDO和mysqli连接数据库会比mysql函数库更加安全?
最好结合自己的建立,建立当中提高的框架,要着重准备,可以说说在开发过程中,你是用改框架最让你印象深刻的功能和特性
yii2框架如何实现数据的自助验证?
在model中添加 rule 验证规则
考察多个框架之间的区别。
mysql其他安全设置:
mysql常用函数:
trim(" asdfkf ") 去掉两边的空格
substring(str,x,y) 截取 str中的x到y的字符串 并包含 x和y的距离,y可以省略,那么就是获取到最后
mysql> select substring("xiaosong",2);
+-------------------------+
| substring("xiaosong",2) |
+-------------------------+
| iaosong |
+-------------------------+
1 row in set (0.00 sec)
mysql> select substring("xiaosong",2,4);
+---------------------------+
| substring("xiaosong",2,4) |
+---------------------------+
| iaos |
+---------------------------+
1 row in set (0.00 sec)
strcmp(str1,str2); 比较两个字符串是否相等,如果相等返回0 如果不能返回-1 传递到这里的都是字符串 strcmp("1",1) 是相等 0, 如果 传入abc 和abb 那么返回1
replace(str,a,b) ; 使用b字符串替换str中的a字符串
rtrim()
ltrim()
left(str,x) //返回str左边的x个字符串
right(str,x) //返回str中右边x字符串
lower()
upper()
合并字符串函数 concat()
concat("my","sql") // mysql
concat("my","sql","null")// null 只要是有null的就返回 null
与此同时concat 能够合并字符串但是没有分隔符号 那么如何添加一个呢
concat_ws("-","my","sql","data")//my-sql-data
那么说 我用concat不可以实现吗?当然可以,但是需要 concat("my","-","sql","-","data"); 这样写。比较麻烦
比较函数 strcmp()
获取字符串长度的 length()
mysql> select 'mysql' 英文字符串,
-> length('mysql') mysql字符串的长度;
+------------+-------------------+
| 英文字符串 | mysql字符串的长度 |
+------------+-------------------+
| mysql | 5 |
+------------+-------------------+
实现字符串大写转换的函数 Upper() 小写函数 lower()
查找字符串
find_in_set(str1,str2) 返回str1 在 str2 中第几个位置 如果没有找到返回0
PS:str2中必须包含多个逗号 隔开的字符串
mysql> select find_in_set("33","1,3,33,4,55,44");
+------------------------------------+
| find_in_set("33","1,3,33,4,55,44") |
+------------------------------------+
| 3 |
+------------------------------------+
1 row in set (0.00 sec)
mysql> select find_in_set("55","1,3,33,4,55,44");
+------------------------------------+
| find_in_set("55","1,3,33,4,55,44") |
+------------------------------------+
| 5 |
+------------------------------------+
1 row in set (0.00 sec)
field(str,str1,str2,str3) //用str 依次和str1 str2 str3 作比较,存在就返回位置,不存在返回0
mysql> select field("song","xiao","zhan","song","yong");
+-------------------------------------------+
| field("song","xiao","zhan","song","yong") |
+-------------------------------------------+
| 3 |
+-------------------------------------------+
1 row in set (0.00 sec)
mysql> select field("song","xiao","zhan","yong");
+------------------------------------+
| field("song","xiao","zhan","yong") |
+------------------------------------+
| 0 |
+------------------------------------+
1 row in set (0.00 sec)
position(str1 in str2) //看看 str1 在str2中的位置
locate("str1",str2) //看看str1在str2中出现的位置
instr(str1,str2) //看看str2 在str1中出现的位置
mysql> select position("song" in "xiaosong") 位置,
-> locate("song","xiaosong") 位置,
-> instr("xiaosong","song") 位置;
+------+------+------+
| 位置 | 位置 | 位置 |
+------+------+------+
| 5 | 5 | 5 |
+------+------+------+
1 row in set (0.00 sec)
截取字符串
substring(str,x,y)
left()
right()
去除字符串首尾空格
trim(str)
ltrim(str)
rtrim(str)
替换字符串
replace(str1,findStr,targetStr)
mysql> select replace("这是我的mysql服务器","mysql","php");
+----------------------------------------------+
| replace("这是我的mysql服务器","mysql","php") |
+----------------------------------------------+
| 这是我的php服务器 |
+----------------------------------------------+
1 row in set (0.00 sec)
获取随机数
rand() 返回0-1之间的随机数
select ceil(rand()*10000); 返回 一个随机的4位数
获取整数的函数
获取数值函数
abs() //绝对值
ceil(num) //返回一个大于num的整数
floor(num) //返回一个 小于num的整数
mod(7,3) //1 7除以3 的余数是几 求余数
truncate(3.1415926,2) 得到 3.14 后边两位小数
mysql> select truncate(22.333,2);
+--------------------+
| truncate(22.333,2) |
+--------------------+
| 22.33 |
+--------------------+
1 row in set (0.00 sec)
mysql> select truncate(22.339,2);
+--------------------+
| truncate(22.339,2) |
+--------------------+
| 22.33 |
+--------------------+
1 row in set (0.00 sec)
四舍五入的函数
round(num1,num2) //四舍五入 num1的值,num2 是保留几位小数
mysql> select round(4.33333);
+----------------+
| round(4.33333) |
+----------------+
| 4 |
+----------------+
1 row in set (0.00 sec)
mysql> select round(4.33333,1);
+------------------+
| round(4.33333,1) |
+------------------+
| 4.3 |
+------------------+
1 row in set (0.00 sec)
mysql> select round(4.33333,3);
+------------------+
| round(4.33333,3) |
+------------------+
| 4.333 |
+------------------+
1 row in set (0.00 sec)
mysql> select round(4.33933,2);
+------------------+
| round(4.33933,2) |
+------------------+
| 4.34 |
+------------------+
1 row in set (0.00 sec)
获取当前日期和时间的函数
select curdate();
select curtime();
通过各种方式显示日期和时间
select now()
select date(now());
select time(now());
获取日期和时间各部分的值
mysql> select week("2017-12-16"); +--------------------+ | week("2017-12-16") | +--------------------+ | 50 | +--------------------+ 1 row in set (0.00 sec) mysql> select year("2017-12-16"); +--------------------+ | year("2017-12-16") | +--------------------+ | 2017 | +--------------------+ 1 row in set (0.00 sec) mysql> select unix_timestamp(now()); +-----------------------+ | unix_timestamp(now()) | +-----------------------+ | 1513690980 | +-----------------------+ 1 row in set (0.00 sec) mysql> select from_unixtime(1513690980); +---------------------------+ | from_unixtime(1513690980) | +---------------------------+ | 2017-12-19 21:43:00 | +---------------------------+ 1 row in set (0.00 sec) mysql> select from_unixtime(1513690989); +---------------------------+ | from_unixtime(1513690989) | +---------------------------+ | 2017-12-19 21:43:09 | +---------------------------+ 1 row in set (0.00 sec) mysql> select now() 当前时间, -> select year(now()) 年份, -> select quarter(now()) 季度, -> select month(now()) 月, -> \c mysql> select now() 当前时间, -> year(now()) 年份, -> quarter(now()) 季度, -> month(now()) 月, -> week(now()) 星期周期, -> dayofmonth(now()) 天, -> hour(now()) 时, -> minute(now()) 分, -> second(now()) 秒; +---------------------+------+------+------+----------+------+------+------+------+ | 当前时间 | 年份 | 季度 | 月 | 星期周期 | 天 | 时 | 分 | 秒 | +---------------------+------+------+------+----------+------+------+------+------+ | 2017-12-19 21:49:51 | 2017 | 4 | 12 | 51 | 19 | 21 | 49 | 51 | +---------------------+------+------+------+----------+------+------+------+------+ 1 row in set (0.00 sec) mysql> select day(now()); +------------+ | day(now()) | +------------+ | 19 | +------------+ 1 row in set (0.00 sec) mysql> select now() 当前时间, -> week(now()) 年中的第几个星期, -> dayname(now()) 星期, -> dayofweek(now()) xingqi, -> weekday(now()) 星期; +---------------------+------------------+---------+--------+------+ | 当前时间 | 年中的第几个星期 | 星期 | xingqi | 星期 | +---------------------+------------------+---------+--------+------+ | 2017-12-19 21:52:48 | 51 | Tuesday | 3 | 1 | +---------------------+------------------+---------+--------+------+ 1 row in set (0.00 sec) mysql> select dayofyear(now()); +------------------+ | dayofyear(now()) | +------------------+ | 353 | +------------------+ 1 row in set (0.00 sec) mysql> select dayofmonth(now()); +-------------------+ | dayofmonth(now()) | +-------------------+ | 19 | +-------------------+ 1 row in set (0.00 sec)
计算日期和时间的函数
to_days(now())
to_days("2017-06-18 12:22:55"); //得到这个时间与0000-1-1 距离的天数
//736863
to_days("2017-06-11 18:11:35"); 得到这个时间与0000-1-1距离的天数
//736856
好了,那么我们运行一下程序,看看这两个时间距离有几天:
我们推算一下应该是7天
mysql> select to_days("2017-06-18 12:22:55"); +--------------------------------+ | to_days("2017-06-18 12:22:55") | +--------------------------------+ | 736863 | +--------------------------------+ 1 row in set (0.00 sec) mysql> select to_days("2017-06-11 18:11:35"); +--------------------------------+ | to_days("2017-06-11 18:11:35") | +--------------------------------+ | 736856 | +--------------------------------+ 1 row in set (0.00 sec) mysql> select to_days("2017-06-18 12:22:55")-to_days("2017-06-11 18:11:35"); +---------------------------------------------------------------+ | to_days("2017-06-18 12:22:55")-to_days("2017-06-11 18:11:35") | +---------------------------------------------------------------+ | 7 | +---------------------------------------------------------------+ 1 row in set (0.00 sec)
那好,我们来推算一下,如何距离大于30天的呢? 使用month() 这个函数可以吗?
显然是不可以的啊 ,比如:2017-05-30 今天的日期是 2017-06-03
使用month() 这个函数 做减法 正好等于 1 那么就是距离30天了吗? 显然是不正确的
因此我们还是要使用 to_days() 这个函数来进行 减法 计算 如果大于30 就是就是 大于了30天。对不?
呵呵
显然是这样的。
还有一个函数 datediff(date1,date2) 返回date1与date2 两个时间的相隔天数
如果date1小于date2 那么就会返回一个负数 。如果确实要是用 两个时间相隔几天 可以 使用 abs() 绝对值来计算。
mysql> select datediff("2016-12-31","2017-01-05"); +-------------------------------------+ | datediff("2016-12-31","2017-01-05") | +-------------------------------------+ | -5 | +-------------------------------------+ 1 row in set (0.00 sec) mysql> select datediff("2017-12-31","2017-01-05"); +-------------------------------------+ | datediff("2017-12-31","2017-01-05") | +-------------------------------------+ | 360 | +-------------------------------------+ 1 row in set (0.00 sec)
mysql函数汇总:
mysql中判断是否包含某个字符串
locate(",",czproduct) 判断czproduct 中是否包含","这个字符。
select id,htbianhao,czproduct from web_htorder where locate(",",czproduct)>0 and id >=526 order by id desc limit 10;
left(str,2)
right(str,3)
substr(str,3); 截取字符字符串从str的第三位开始截取,到最后
substr(str,3,2)从str这个字符的第三位开始截取,截取2位
获取mysql系统信息
获取auto_increment
其他函数
执行mysql函数的文本文件:a.txt
好的,这里配置,其实还少一个数据维护的一个使用说明,
那么我们稍候会做一个数据导入导出到sql文件或txt文本中。
另外还有一种就是 使用 select 插入的sql 语句是怎么写的。
存储过程、以及触发器怎么使用?