Myql中的时间函数

UNIX_TIMESTAMP() 返回当前时间戳

mysql> select UNIX_TIMESTAMP();
+------------------+
| UNIX_TIMESTAMP() |
+------------------+
|       1593576560 |
+------------------+
1 row in set (0.00 sec)

UNIX_TIMESTAMP(datetime) 返回指定日期的时间戳

这个函数和上一个函数一样,只是增加了参数

mysql> select UNIX_TIMESTAMP('2020-07-01 12:11:00');
+---------------------------------------+
| UNIX_TIMESTAMP('2020-07-01 12:11:00') |
+---------------------------------------+
|                            1593576660 |
+---------------------------------------+
1 row in set (0.01 sec)

FROM_UNIXTIME 将时间戳转换成datetime格式

mysql> select FROM_UNIXTIME(UNIX_TIMESTAMP());
+---------------------------------+
| FROM_UNIXTIME(UNIX_TIMESTAMP()) |
+---------------------------------+
| 2020-07-01 12:11:00             |
+---------------------------------+
1 row in set (0.00 sec)

mysql> select FROM_UNIXTIME(1593576660);
+---------------------------+
| FROM_UNIXTIME(1593576660) |
+---------------------------+
| 2020-07-01 12:11:00       |
+---------------------------+
1 row in set (0.01 sec)

mysql> select FROM_UNIXTIME(createtime), FROM_UNIXTIME(starttime) from project limit 1 \G
*************************** 1. row ***************************
FROM_UNIXTIME(createtime): 2016-01-20 16:59:25
 FROM_UNIXTIME(starttime): 2016-01-20 00:30:00
1 row in set (0.00 sec)

DATE_FORMAT格式化一个datetime时间

mysql> select DATE_FORMAT(FROM_UNIXTIME(1593576444), '%Y/%m/%d %H/%i/%s %M %p');
+-------------------------------------------------------------------+
| DATE_FORMAT(FROM_UNIXTIME(1593576444), '%Y/%m/%d %H/%i/%s %M %p') |
+-------------------------------------------------------------------+
| 2020/07/01 12/07/24 July PM                                       |
+-------------------------------------------------------------------+
1 row in set (0.00 sec)

MySQL连接查询on和where的区别和顺序

原文连接:https://www.cnblogs.com/jessy/p/3525419.html

left join: 左连接,返回左表中所有的记录以及右表中连接字段相等的记录。
right join: 右连接,返回右表中所有的记录以及左表中连接字段相等的记录。
inner join: 内连接,又叫等值连接,只返回两个表中连接字段相等的行。
full join: 外连接,返回两个表中的行:left join + right join。
cross join: 结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。

关键字: on

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

在使用left jion时,on和where条件的区别如下:

1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

假设有两张表:

表1:tab1

id size
1 10
2 20
3 30

表2:tab2

size name
10 AAA
20 BBB
20 CCC

两条SQL:

1、select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name='AAA'
2、select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name='AAA')
第一条SQL的过程:

1、中间表
on条件:
tab1.size = tab2.size
tab1.id tab1.size tab2.size tab2.name
1 10 10 AAA
2 20 20 BBB
2 20 20 CCC
3 30 (null) (null)
2、再对中间表过滤
where 条件:
tab2.name=’AAA’
tab1.id tab1.size tab2.size tab2.name
1 10 10 AAA
第二条SQL的过程:

1、中间表
on条件:
tab1.size = tab2.size and tab2.name=’AAA’
(条件不为真也会返回左表中的记录)
tab1.id tab1.size tab2.size tab2.name
1 10 10 AAA
2 20 (null) (null)
3 30 (null) (null)

其实以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。 而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。

Mysql不常见的插入/更新SQL语句

本文章主要讲解INSERT ... SELECTINSERT ... ON DUPLICATE KEY UPDATE这种比较特殊的数据操作(data manipulation)的SQL。

INSERT … SELECT语句
使用该语句可以通过将select语句得到的结果快速插入到一个表中,该select语句可以查询一个或者多个表,比如:

INSERT INTO tbl_temp2 (fld_id)
  SELECT tbl_temp1.fld_order_id
  FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;

Continue reading "Mysql不常见的插入/更新SQL语句"

MySQL索引和主键

索引的两种

索引的类型:索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。

索引的类型

创建索引时字段的length是指索引的长度,可以不指定,length只对字符串类型的字段有效。

Continue reading "MySQL索引和主键"

brew安装的mysql忘记密码

cp /usr/local/Cellar/mysql/5.7.17/homebrew.mxcl.mysql.plist /usr/local/Cellar/mysql/5.7.17/homebrew.mxcl.mysql.plist.bak
vi /usr/local/Cellar/mysql/5.7.17/homebrew.mxcl.mysql.plist

添加下面这个参数

<string>--defaults-file=/etc/my.cnf</string>
echo 'skip-grant-tables' >> /etc/my.cnf

结果如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>KeepAlive</key>
  <true/>
  <key>Label</key>
  <string>homebrew.mxcl.mysql</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/opt/mysql/bin/mysqld_safe</string>
    <string>--defaults-file=/etc/my.cnf</string>
    <string>--bind-address=127.0.0.1</string>
    <string>--datadir=/usr/local/var/mysql</string>
    <string>--general_log=1</string>
    <string>--general_log_file=/usr/local/var/mysql/query.log</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>WorkingDirectory</key>
  <string>/usr/local/var/mysql</string>
</dict>
</plist>

重启:

brew services restart mysql

无密码进入:

mysql -u -h localhost -p

不输入任何密码,直接回车。

执行如下命令,重新给root赋值权限:

grant all on *.* to root@'localhost' identified by '';

可能会有如下错误:

ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement

解决办法:

flush privileges;

再次执行:

grant all on *.* to root@'localhost' identified by '';
flush privileges;

最后,去除 /etc/my.cnf里的skip-grant-tables后,重启:

brew services restart mysql

OK.

安装MysQL并修改默认密码

1、官方安装文档

http://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/

2、下载 Mysql yum包

http://dev.mysql.com/downloads/repo/yum/

下载到本地再上传到服务器,或者使用wget 直接下载

wget http://repo.mysql.com/mysql57-community-release-el7-10.noarch.rpm

3、安转软件源

platform-and-version-specific-package-name 替换为你下载的rpm名

sudo rpm -Uvh platform-and-version-specific-package-name.rpm

例如:

rpm -Uvh mysql57-community-release-el7-10.noarch.rpm

4、安装mysql服务端

 yum install -y mysql-community-server

如果网络环境不是很好,执行完命令就可以去泡杯茶或者荣耀杀一局

5、启动mysql

service mysqld start
systemctl start mysqld.service

6、检查mysql 的运行状态

service mysqld status
systemctl status mysqld.service

7、修改临时密码

Mysql5.7默认安装之后root是有密码的。

7.1 获取MySQL的临时密码

为了加强安全性,MySQL5.7为root用户随机生成了一个密码,在error log中,关于error log的位置,如果安装的是RPM包,则默认是/var/log/mysqld.log。
只有启动过一次mysql才可以查看临时密码

grep 'temporary password' /var/log/mysqld.log

这里的密码是YdsGaxOq>2n!

7.2 登陆并修改密码

使用默认的密码登陆

mysql -uroot -p

用该密码登录到服务端后,必须马上修改密码,不然会报如下错误:

mysql> select @@log_error;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql>

修改密码

ALTER USER 'root'@'localhost' IDENTIFIED BY 'root123';

如果密码设置太简单出现以下的提示

如何解决ERROR 1819 (HY000): Your password does not satisfy the current policy requirements呢? 这里直接提供解决方案文末有详细的说明

必须修改两个全局参数:
首先,修改validate_password_policy参数的值

mysql> set global validate_password_policy=0; 

再修改密码的长度

set global validate_password_length=1;

再次执行修改密码就可以了

ALTER USER 'root'@'localhost' IDENTIFIED BY 'root123';

8、授权其他机器登陆

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;

FLUSH  PRIVILEGES;

9、关于密码设置的详细说明

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

参考:https://blog.csdn.net/zyw_java/article/details/70949596