作为程序员一定要保持良好的睡眠,才能好编程

Mysql总结

发布时间:2017-11-14

    




整形的类型:

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索引创建

          


    这是一个复合索引: 有前缀性  有连续性    如果这两项缺一,那就是不能使用到索引。


1.png


        切记:  

        符合索引遵循前缀原则

        like 前边不要使用 % 这样就不使用索引了。

        column is null 可以使用索引

        如果mysql估计使用索引会比全表扫描更慢,会放弃索引

        如果or前的条件中列有索引,后面的没有,索引都不会用到

        列类型是字符串,查询时一定要给值加引号,否则索引失效。



        



        

           

    Elasticsearch实战——全文检索架构设计

        http://blog.csdn.net/laoyang360/article/details/74090398

        





        数据库分区?

        

            


     SQL的编写特点:


        mysql关联查询

        mysql关联更新

        2.png



    六种关联查询


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



3.png

    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语句花费在哪里

                          z2.jpg


                        z3.jpg

                        z4.jpg

        

                     3、show status 会返回一些计数器,show global status 查看服务器级别的所有计数

                            有时间可猜测出哪些花费的时间较高,可以针对这些进行一些优化。

                            可以查看到 show status 也可以看到一些  select 执行的次数。                     

                     

                      4、show processlist;  记录一些大量线程出于不正常的状态

                            


                       5、explain  sql语句  \G  <====> desc sql语句  \G

                            z5.jpg




   这就是以上分析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


        z6.jpg

        

        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 中是否包含","这个字符。


e13.png


select id,htbianhao,czproduct from web_htorder where locate(",",czproduct)>0 and id >=526 order by id desc limit 10;

e12.png



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 语句是怎么写的。





    存储过程、以及触发器怎么使用?