mysql知识存储-1

权限管理

MySQL 的账户信息保存在 mysql 这个数据库中。

USE mysql;
SELECT user FROM user;

创建账户


CREATE USER myuser IDENTIFIED BY 'mypassword';

新创建的账户没有任何权限。

mysql约束

如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。这里以MySQL为例,总结一下3种外键约束方式的区别和联系。

  • 主键约束
    • PRIMARY KEY
    • 每张数据表只能存在一个主键
    • 主键保证记录的唯一性,主键的值不重复
    • 主键自动为 NOT NULL
    • SHWO COLUMNS FROM student查看表结构
  • 唯一约束
    • UNIQUE KEY
    • 唯一约束可以保证记录的唯一性
    • 唯一约束的字段可以为空值(NULL)
    • 每张数据表可以存在多个唯一约束
  • 默认约束
    • DEFAULT
    • 当插入记录时,如果没有明确为字段赋值,则自动赋予默认值
CREATE TABLE course(
id int AUTO_INCREMENT PRIMARY KEY,
cou_name varchar(20) NOT NULL UNIQUE KEY,
time int DEFAULT 40
);
  • 外键约束
    • FOREIGN KEY
    • 保持数据的一致性,完整性
    • 实现1对1或1对n关系
    • 父表与子表必须使用相同的存储引擎,而且禁止使用临时表。
    • 外键列和参照列必须具有相似的数据类型。其中数字的长度或是否有符号位必须相同;而字符的长度则可以不同。
    • 外键列和参照列必须创建索引。如果外键列不存在索引的话,MySQL将自动创建索引
CREATE TABLE school(
id int AUTO_INCREMENT PRIMARY KEY,
sname varchar(20) NOT NULL
);
CREATE TABLE student2(
id int AUTO_INCREMENT PRIMARY KEY,
sid int,
FOREIGN KEY (sid) REFERENCES school(id) ON DELETE CASCADE  on update set null
);
  • 外键约束的参照操作
    • CASCADE : 从父表删除或更新且自动删除或更新子表中匹配的行 父表中被引用的列删除了某个数据,子表中删除对应数据的行.
CREATE TABLE student3(
id int AUTO_INCREMENT PRIMARY KEY,
sid int,
FOREIGN KEY (sid) REFERENCES school(id) ON DELETE CASCADE on update set null
); 

插入数据

#插入一行数据
INSERT INTO table(column1,column2...)
VALUES (value1,value2,....);
#插入多行数据 
INSERT INTO table(column1,column2...)
VALUES (value1,value2,...),
       (value1,value2,...),
...;
# 使用SELECT语句返回的列和值来填充INSERT语句的值
INSERT INTO table_1
SELECT c1, c2, FROM table_2;

复制表

#不会复制外键
CREATE TABLE tasks_bak LIKE tasks;

INSERT INTO tasks_bak
SELECT * FROM tasks;


修改表

  • 在表中添加列
ALTER TABLE table_name 
add column_name datatype;
#给学生表增加学号这一列
ALTER TABLE student1
add stu_id int;
  • 删除表中的列
alter table table_name
drop column column_name

  • 修改表中的列
--MySQL
alter table table_name
modify column column_name datatype;
--sql server
alter table table_name
alter column column_name datatype;
  • 定义外键 将student1表的stu_id绑定外键为sutdent2的sid,并取名为fk_student_id
ALTER TABLE student1
ADD CONSTRAINT fk_student_id FOREIGN KEY(stu_id)
REFERENCES student2 (sid);

sql语法

  • 查询

SELECT 
    column_1, column_2, ...
FROM
    table_1
[INNER | LEFT |RIGHT] JOIN table_2 ON conditions
WHERE
    conditions
GROUP BY column_1
HAVING group_conditions
ORDER BY column_1
LIMIT offset, length;
  • SELECT之后是逗号分隔列或星号(*)的列表,表示要返回所有列。

  • FROM指定要查询数据的表或视图。

  • JOIN根据某些连接条件从其他表中获取数据。(不理解连接的自行查询)

  • WHERE过滤结果集中的行。

  • GROUP BY将一组行组合成小分组,并对每个小分组应用聚合函数。

  • HAVING过滤器基于GROUP BY子句定义的小分组。

  • ORDER BY指定用于排序的列的列表。

  • LIMIT限制返回行的数量。

    扫描二维码关注公众号,回复: 127721 查看本文章
  • 过滤 不进行过滤的数据非常大,导致通过网络传输了很多多余的数据,从而浪费了网络带宽。因此尽量使用 SQL 语句来过滤不必要的数据,而不是传输所有的数据到客户端中然后由客户端进行过滤。 IS NULL 为NULL值 其他语法自行尝试,比较简单

SELECT * FROM `school`
WHERE sname IS NOT NULL;
SELECT * FROM `school`
WHERE sname IS  NULL;

应该注意到,NULL 与 0 、空字符串都不同。

AND OR 用于连接多个过滤条件。优先处理 AND,因此当一个过滤表达式涉及到多个 AND 和 OR 时,应当使用 () 来决定优先级。

IN 操作符用于匹配一组值,其后也可以接一个 SELECT 子句,从而匹配子查询得到的一组值。

NOT 操作符用于否定一个条件。

  • 通配符 通配符也是用在过滤语句中,但它只能用于文本字段。

% 匹配 >=0 个任意字符,类似于 *;

_ 匹配 ==1 个任意字符,类似于 .;(只匹配一个字符)

[ ] 可以匹配集合内的字符,例如 [ab] 将匹配字符 a 或者 b。用脱字符 ^ 可以对其进行否定,也就是不匹配集合内的字符。使用 Like 来进行通配符匹配。

SELECT *
FROM mytable
WHERE col LIKE '[^AB]%'; -- 不以 A 和 B 开头的任意文本

SELECT *
FROM mytable
WHERE col LIKE '%AB%'; --匹配任何位置包含文本 AB的值
  • 正则表达式
  1. 基本字符匹配

检索lastname中含有D的全部记录,默认不区分大小写,为了区分大小写可以用 BINARY

SELECT firstname,lastname,officeCode
FROM employees
WHERE lastname REGEXP BINARY 'D';
  1. 任意字符匹配(.匹配除\n之外的任意单个字符)
SELECT firstname,lastname,employeeNumber
fROM employees
WHERE employeeNumber REGEXP '.02';
  1. 进行or配置
SELECT firstname,lastname,officeCode
FROM employees
WHERE officeCode REGEXP '1|2|3';--检索officecode为1或者2或者3的记录

另一种写法

SELECT firstname,lastname,officeCode
FROM employees
WHERE officeCode REGEXP '[123]';--等价于[1|2|3]
  1. 除去某些元素()
SELECT firstname,lastname,officeCode
FROM employees
WHERE officeCode REGEXP '[^123]';--不包含1或2或3的记录


  1. 匹配范围 []匹配几个字符 这样将要匹配[0123456789]可以匹配0到9,[1-4][4-9]也是合法的范围。 此外,范围不一定只是数值的,[a-z]匹配任意字母字符
SELECT firstname,lastname,officeCode
FROM employees
WHERE officeCode REGEXP '[1-4]'; --等同于[1234]
  1. ^匹配字符串开始位置
select name from 表名 where name REGEXP '^hello';
  1. $匹配字符串结束位置
select name from 表名 where name REGEXP 'hello$';
  1. [^……],匹配不包含在[]的字符 匹配不包含在[]的字符,如查询出除hello之外的人名
 SELECT prod_name FROM products WHERE prod_name REGEXP '[^hello]';
  1. 匹配特殊字符使用\进行转义
表达式 匹配内容
\\. 能够匹配.
\\f 换页
\\n 换行
\\r 回车
\\t 制表符
  1. 匹配字符类
表达式 配置内容
[:alnum:] 任意字母和数字(通[a-zA-Z0-9])
[:alpha:] 任意字符(同[a-zA-Z])
[:blank:] 空格和制表符(同[\\t])
[:digit:] 任意数字(同[0-9])
[:lower:] 任意小写字母
[:upper:] 任意大写字母
[:space:] 包括空格在内的任意空白字符
  1. 匹配多个实例,关于重复元字符
表达式 配置内容
* 0个或者多个匹配
+ 1个或者多个匹配(等于{1,})
1个或者多个匹配(等于{0,1})
{n} 指定数目的匹配
{n,} 不少于指定数目的匹配
{n,m} 匹配数目的范围(m不超过255)
  1. 实际列子
  • 应用示例,查找用户表中Email格式错误的用户记录:

SELECT * 
FROM users
WHERE email NOT REGEXP '^[A-Z0-9._%-]+@[A-Z0-9.-]+.[A-Z]{2,4}$'

MySQL数据库中正则表达式的语法,主要包括各种符号的含义。

  • (^)字符

匹配字符串的开始位置,如“^a”表示以字母a开头的字符串。


mysql> select 'xxxyyy' regexp '^xx';

+-----------------------+
| 'xxxyyy' regexp '^xx' |
+-----------------------+
|           1 |
+-----------------------+
1 row in set (0.00 sec)

查询xxxyyy字符串中是否以xx开头,结果值为1,表示值为true,满足条件。

  • ($)字符

匹配字符串的结束位置,如“X^”表示以字母X结尾的字符串。

  • (.)字符

这个字符就是英文下的点,它匹配任何一个字符,包括回车、换行等。

  • (*)字符

星号匹配0个或多个字符,在它之前必须有内容。如:

mysql> select 'xxxyyy' regexp 'x*';

这个SQL语句,正则匹配为true。

  • (+)字符

加号匹配1个或多个字符,在它之前也必须有内容。加号跟星号的用法类似,只是星号允许出现0次,加号则必须至少出现一次。

  • (?)字符

问号匹配0次或1次。

实例:

现在根据上面的表,可以装置各种不同类型的SQL查询以满足要求。在这里列出一些理解。考虑我们有一个表为person_tbl和有一个字段名为名称:

查询找到所有的名字以'st'开头

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

查询找到所有的名字以'ok'结尾

mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';

查询找到所有的名字包函'mar'的字符串

mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';

查询找到所有名称以元音开始和'ok'结束 的

mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';

一个正则表达式中的可以使用以下保留字 ^ 所匹配的字符串以后面的字符串开头

mysql> select "fonfo" REGEXP "^fo$"; -> 0(表示不匹配) 
mysql> select "fofo" REGEXP "^fo"; -> 1(表示匹配)

$ 所匹配的字符串以前面的字符串结尾

mysql> select "fono" REGEXP "^fono$"; -> 1(表示匹配) 
mysql> select "fono" REGEXP "^fo$"; -> 0(表示不匹配) 

. 匹配任何字符(包括新行)

mysql> select "fofo" REGEXP "^f.*"; -> 1(表示匹配) 
mysql> select "fonfo" REGEXP "^f.*"; -> 1(表示匹配)

a* 匹配任意多个a(包括空串)

mysql> select "Ban" REGEXP "^Ba*n"; -> 1(表示匹配) 
mysql> select "Baaan" REGEXP "^Ba*n"; -> 1(表示匹配) 
mysql> select "Bn" REGEXP "^Ba*n"; -> 1(表示匹配)

a+ 匹配任意多个a(不包括空串)


mysql> select "Ban" REGEXP "^Ba+n"; -> 1(表示匹配) 
mysql> select "Bn" REGEXP "^Ba+n"; -> 0(表示不匹配) 

a? 匹配一个或零个a

mysql> select "Bn" REGEXP "^Ba?n"; -> 1(表示匹配) 
mysql> select "Ban" REGEXP "^Ba?n"; -> 1(表示匹配) 
mysql> select "Baan" REGEXP "^Ba?n"; -> 0(表示不匹配)

de|abc 匹配de或abc


mysql> select "pi" REGEXP "pi|apa"; -> 1(表示匹配) 
mysql> select "axe" REGEXP "pi|apa"; -> 0(表示不匹配) 
mysql> select "apa" REGEXP "pi|apa"; -> 1(表示匹配) 
mysql> select "apa" REGEXP "^(pi|apa)$"; -> 1(表示匹配) 
mysql> select "pi" REGEXP "^(pi|apa)$"; -> 1(表示匹配) 
mysql> select "pix" REGEXP "^(pi|apa)$"; -> 0(表示不匹配)

(abc)* 匹配任意多个abc(包括空串)

mysql> select "pi" REGEXP "^(pi)*$"; -> 1(表示匹配) 
mysql> select "pip" REGEXP "^(pi)*$"; -> 0(表示不匹配) 
mysql> select "pipi" REGEXP "^(pi)*$"; -> 1(表示匹配) 

{1} {2,3}

这是一个更全面的方法,它可以实现前面好几种保留字的功能

a*

可以写成a{0,}

a+

可以写成a{1,}

a?

可以写成a{0,1}

在{}内只有一个整型参数i,表示字符只能出现i次;在{}内有一个整型参数i,后面跟一个“,”,表示字符可以出现i次或i次以上;在{}内只有一个整型参数i,后面跟一个“,”,再跟一个整型参数j,表示字符只能出现i次以上,j次以下(包括i次和j次)。其中的整型参数必须大于等于0,小于等于 RE_DUP_MAX(默认是255)。 如果有两个参数,第二个必须大于等于第一个

[a-dX]

匹配“a”、“b”、“c”、“d”或“X”

[^a-dX]

匹配除“a”、“b”、“c”、“d”、“X”以外的任何字符。

“[”、“]”必须成对使用


mysql> select "aXbc" REGEXP "[a-dXYZ]"; -> 1(表示匹配) 
mysql> select "aXbc" REGEXP "^[a-dXYZ]$"; -> 0(表示不匹配) 
mysql> select "aXbc" REGEXP "^[a-dXYZ]+$"; -> 1(表示匹配) 
mysql> select "aXbc" REGEXP "^[^a-dXYZ]+$"; -> 0(表示不匹配) 
mysql> select "gheis" REGEXP "^[^a-dXYZ]+$"; -> 1(表示匹配) 
mysql> select "gheisa" REGEXP "^[^a-dXYZ]+$"; -> 0(表示不匹配)

子查询

子查询中只能返回一个字段的数据。

可以将子查询的结果作为 WHRER 语句的过滤条件:


SELECT *
FROM mytable1
WHERE col1 IN (SELECT col2
                 FROM mytable2);
                 
SELECT cust_name, (SELECT COUNT(*)
                   FROM Orders
                   WHERE Orders.cust_id = Customers.cust_id)
                   AS orders_num
FROM Customers
ORDER BY cust_name;                 

组合查询

  • 两种基本情况需要使用组合查询:(1)在单个查询中从不同的表返回类似结构的数据(2)- 对单个表执行多个查询,按单个查询返回数据
  • 使用 UNION 来组合两个查询,如果第一个查询返回 M 行,第二个查询返回 N 行,那么组合查询的结果为 M+N 行。
  • 每个查询必须包含相同的列、表达式或者聚集函数。
  • 默认会去除相同行,如果需要保留相同行,使用 UNION ALL。默认情况相当于求并集
  • 只能包含一个 ORDER BY 子句,并且必须位于语句的最后。 列数据类型需要兼容
SELECT col
FROM mytable
WHERE col > 1
UNION
SELECT col
FROM mytable
WHERE col <5;
ORDER BY col;

等同于
SELECT col
FROM mytable
WHERE col >1 and col<5;
ORDER BY col;

字段计算连接处理

  • concat() Concat() 用于连接两个字段。许多数据库会使用空格把一个值填充为列宽,因此连接的结果会出现一些不必要的空格,使用Trim() 可以去除首尾空格。另外还支持Rtrim()(去掉右侧的空格)LTrim()去掉左侧的空格
# 查询员工表,返回结果合并lastname和firstname,设置别名为AS
SELECT Concat(Trim(lastname),Trim(firstname)) AS ename
FROM employees;

#  - + - * /来对查询的字段进行计算
SELECT id,
      quantity,
      item_price,
      quantity*item_price AS expanded_price --数量与单价乘积
FROM products
WHERE id = 100;

文本处理函数

  • LEFT()
    用于返回字符串左侧的字符。 该函数有两个参数,第一个参数为字符串,第二个参数为字符串长度。字符串长度为2,就从字符串的左侧截取两个字符串返回。
SELECT id,LEFT(content,3) AS left_content FROM fun_text WHERE id='1'
  • LOCATE() 返回一个字符串在另一个字符串中第一次出现的位置,如果没有发现就返回0.
SELECT id,LOCATE('234', content) AS locate_content FROM fun_text WHERE id='1';
#content 为表中的一列
  • LOWER() 将字符串全部转换为小写字母。

  • TRIM() 去除字符串两边的空格。

  • SUBSTRING() 字符串截取函数。该函数与LEFT()和RIGHT()函数有点儿类似,都可以截取字符串,只不过功能更加强大。

1、从第N个字符串开始截取

SELECT id,SUBSTRING(content,5) AS sub_content FROM fun_text WHERE id='1';

2、从第N个字符串开始截取,截取M个字符(包含n)

SELECT id,SUBSTRING(content,5,2) AS sub_content FROM fun_text WHERE id='1';
  • SOUNDEX() 最后说一个不同于之前的字符处理函数SOUNDEX(),这个函数可以将一个单词的读音转换成与它相似的读音的单词。简单的来说,就是将方言转换为普通话的意思。这个在搜索中十分的好使。
SELECT * FROM fun_text WHERE SOUNDEX(content) = SOUNDEX('lie');

lie是不等于lee的,但是SOUNDEX(content) = SOUNDEX('lie'),因为lie和lee的读音十分相似。

日期和时间处理

  • 日期格式:YYYY-MM-DD
  • 时间格式:HH:MM:SS
函 数 说 明
AddDate() 增加一个日期(天、周等)
AddTime() 增加一个时间(时、分等)
CurDate() 返回当前日期
CurTime() 返回当前时间
Date() 返回日期时间的日期部分
DateDiff() 计算两个日期之差
Date_Add() 高度灵活的日期运算函数
Date_Format() 返回一个格式化的日期或时间串
Day() 返回一个日期的天数部分
DayOfWeek() 对于一个日期,返回对应的星期几
Hour() 返回一个时间的小时部分
Minute() 返回一个时间的分钟部分
Month() 返回一个日期的月份部分
Now() 返回当前日期和时间
Second() 返回一个时间的秒部分
Time() 返回一个日期时间的时间部分
Year() 返回一个日期的年份部分

实例应用


SELECT DATE_ADD('2017-05-15 08:12:25', INTERVAL 1 DAY);#(DAY,MOUTH,YEAR)
#2017-05-16 08:12:25
SELECT FROM_UNIXTIME(1494815834, '%Y年%m月%d日 %h时%分:%s秒');
# 2017年05月15日 10时分:14秒
SELECT FROM_UNIXTIME(1494815834);-- 2017-05-15 10:37:14 
-- MySQL 拼凑日期、时间函数:makdedate(year,dayofyear), maketime(hour,minute,second)  
SELECT MAKEDATE(2017,31);   -- '2017-01-31'   
SELECT MAKEDATE(2017,32);   -- '2017-02-01'  
SELECT MAKETIME(19,52,35);  -- '19:52:35'  
-- 日期时间格式化  
SELECT DATE_FORMAT('2017-05-12 17:03:51', '%Y年%m月%d日 %H时%i分%s秒');-- 2017年05月12日 17时03分51秒(具体需要什么格式的数据根据实际情况来;小写h为12小时制;)  
SELECT TIME_FORMAT('2017-05-12 17:03:51', '%Y年%m月%d日 %H时%i分%s秒');-- 0000年00月00日 17时03分51秒(time_format()只能用于时间的格式化)  
-- STR_TO_DATE()和DATE_FORMATE()为互逆操作  

-- MySQL Str to Date (字符串转换为日期)函数:str_to_date(str, format)  
  
SELECT STR_TO_DATE('06.05.2017 19:40:30', '%m.%d.%Y %H:%i:%s');-- 2017-06-05 19:40:30  
SELECT STR_TO_DATE('06/05/2017', '%m/%d/%Y');                  -- 2017-06-05  
SELECT STR_TO_DATE('2017/12/3','%Y/%m/%d')             -- 2017-12-03  
SELECT STR_TO_DATE('20:09:30', '%h:%i:%s')             -- NULL(超过12时的小时用小写h,得到的结果为NULL) 

-- 经特殊日期测试,DATE_SUB(date,INTERVAL expr type)可放心使用  
SELECT DATE_SUB(CURDATE(),INTERVAL 1 DAY);-- 前一天:2017-05-11  
SELECT DATE_SUB(CURDATE(),INTERVAL -1 DAY);-- 后一天:2017-05-13  
SELECT DATE_SUB(CURDATE(),INTERVAL 1 MONTH);-- 一个月前日期:2017-04-12  
SELECT DATE_SUB(CURDATE(),INTERVAL -1 MONTH);-- 一个月后日期:2017-06-12  
SELECT DATE_SUB(CURDATE(),INTERVAL 1 YEAR);-- 一年前日期:2016-05-12  
SELECT DATE_SUB(CURDATE(),INTERVAL -1 YEAR);-- 一年后日期:20178-06-12  
-- MySQL date_sub() 日期时间函数 和 date_add() 用法一致,并且可以用INTERNAL -1 xxx的形式互换使用;  
-- 另外,MySQL 中还有两个函数 subdate(), subtime(),建议,用 date_sub() 来替代。  

-- DATE_ADD(date,INTERVAL expr type) 从日期加上指定的时间间隔  
-- type参数可参考:http://www.w3school.com.cn/sql/func_date_sub.asp  
SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 YEAR);-- 表示:2018-05-15 10:37:14.123456  
SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 QUARTER);-- 表示:2017-08-15 10:37:14.123456  
SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 MONTH);-- 表示:2017-06-15 10:37:14.123456  
SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 WEEK);-- 表示:2017-05-22 10:37:14.123456  
SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 DAY);-- 表示:2017-05-16 10:37:14.123456  
SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 HOUR);-- 表示:2017-05-15 11:37:14.123456  
SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 MINUTE);-- 表示:2017-05-15 10:38:14.123456  
SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 SECOND);-- 表示:2017-05-15 10:37:15.123456  
SELECT DATE_ADD('2017-05-15 10:37:14.123456',INTERVAL 1 MICROSECOND);-- 表示:2017-05-15 10:37:14.123457

SELECT DAYNAME('2017-05-15 10:37:14.123456');-- Monday(返回英文星期)  
SELECT MONTHNAME('2017-05-15 10:37:14.123456');-- May(返回英文月份)  
SELECT LAST_DAY('2016-02-01');-- 2016-02-29 (返回月份中最后一天)  
SELECT LAST_DAY('2016-05-01');-- 2016-05-31  


-- MySQL 日期时间 Extract(选取) 函数  
SET @dt = '2017-05-15 10:37:14.123456';  
SELECT DATE(@dt);-- 获取日期:2017-05-15  
SELECT TIME('2017-05-15 10:37:14.123456');-- 获取时间:10:37:14.123456  
SELECT YEAR('2017-05-15 10:37:14.123456');-- 获取年份  
SELECT MONTH('2017-05-15 10:37:14.123456');-- 获取月份  
SELECT DAY('2017-05-15 10:37:14.123456');-- 获取日  
SELECT HOUR('2017-05-15 10:37:14.123456');-- 获取时  
SELECT MINUTE('2017-05-15 10:37:14.123456');-- 获取分  
SELECT SECOND('2017-05-15 10:37:14.123456');-- 获取秒  
SELECT MICROSECOND('2017-05-15 10:37:14.123456');-- 获取毫秒  
SELECT QUARTER('2017-05-15 10:37:14.123456');-- 获取季度  
SELECT WEEK('2017-05-15 10:37:14.123456');-- 20 (获取周)  
SELECT WEEK('2017-05-15 10:37:14.123456', 7);-- ****** 测试此函数在MySQL5.6下无效  
SELECT WEEKOFYEAR('2017-05-15 10:37:14.123456');-- 同week()  
SELECT DAYOFYEAR('2017-05-15 10:37:14.123456');-- 135 (日期在年度中第几天)  
SELECT DAYOFMONTH('2017-05-15 10:37:14.123456');-- 5 (日期在月度中第几天)  
SELECT DAYOFWEEK('2017-05-15 10:37:14.123456');-- 2 (日期在周中第几天;周日为第一天)  
SELECT WEEKDAY('2017-05-15 10:37:14.123456');-- 0  
SELECT WEEKDAY('2017-05-21 10:37:14.123456');-- 6(与dayofweek()都表示日期在周的第几天,只是参考标准不同,weekday()周一为第0天,周日为第6天)  
SELECT YEARWEEK('2017-05-15 10:37:14.123456');-- 201720(年和周)  

SELECT CURDATE();-- 当前日期:2017-05-12  
SELECT CURRENT_DATE();-- 当前日期:等同于 CURDATE()  
SELECT CURRENT_DATE;-- 当前日期:等同于 CURDATE()  
  
SELECT CURTIME();-- 当前时间:11:42:47  
SELECT CURRENT_TIME();-- 当前时间:等同于 CURTIME()  
SELECT CURRENT_TIME;-- 当前时间:等同于 CURTIME()  
-- 那么MySQL中就不用DUAL了吧。  
SELECT NOW();-- 当前日期时间:2017-05-12 11:41:55  
-- 除了 now() 函数能获得当前的日期时间外,MySQL 中还有下面的函数:  
SELECT CURRENT_TIMESTAMP();-- 2017-05-15 10:19:31  
SELECT CURRENT_TIMESTAMP;-- 2017-05-15 10:19:51  

猜你喜欢

转载自my.oschina.net/u/3798913/blog/1789983
今日推荐