mysql时间日期
date: 日期类型, 格式是: 年月日
time: 时间类型, 格式是: 时分秒
datetime: 日期+时间,格式是: 年月日 时分秒
timestamp: 时间戳, 格式和datetime相同, 也是: 年月日 时分秒, 和datetime不同的是:
1) 范围上: datetime范围是: 1000~9999(年份)
timestamp范围是: 1970到2038年
2) 实际存的数据: datetime实际存的就是一个年月日 时分秒
格式的日期+时间
而timestamp实际存储的是这个从1970年1月1日到这个日期+时间的时间毫秒值
create_time timestamp, 2018-2-3 14:45:56, 实际存储的是 1970年1月1日到2018-2-3 14:45:56时间的时间毫秒值
3) 在使用上: timestamp可以设置自动获取当前时间作为值插入到表中, 而datetime不可以.
2018-2-3 14:45:56
其他函数查询
curdate() -- 返回一个年月日格式的日期
curtime() -- 返回一个时分秒格式的时间
sysdate() -- 返回一个年月日 时分秒格式的时期加时间
now() -- 返回一个年月日 时分秒格式的时期加时间
year(),month(),day(),hour(),minute(),second()
-- 上面的函数分别用于获取年月日时分秒中的年份/月份/天数/小时/分钟/秒值
concat(s1,s2,s3...sn)
-- 将传入的多个字符串连接在一起
concat_ws(x,s1,s2,s3...sn)
-- 将传入的多个字符串连接在一起,每两个连接时会通过x作为分隔符进行连接
杂点
select distinct dept,job from emp;distinct关键字可以用来去重;
null和任何数据运算,结果都是null。
<> , != 在mysql中都是不等于的意思。
update stu set bonus = 0 where bonus is null;不能用等于符号,null跟任何值都不相等,包括null。
ifnull(列名,值)函数:判断指定的列中是否包含null,如果包含,临时替换为“值”。
例如:select name “姓名”,sal+ifnull(bonus,0) as “总薪资” from emp where sal+ifnull(bonus,0)>3500;
多行函数默认不统计null,即count,max,min ,sum,avg直接忽略 null项。
关于vue定义的ref属性的用法,可以直接获取。
mysql 数据类型,char和vachar的区别?1.定长(长度不变,不够的话用空格来占用,浪费空间,但是执行效率高)、变长(用多少算多少)。2.存储大小不一样。
-------char()是定长字符串,范围是0-255个字符。
vachar()是最大能存数据量0-65535个字节。GBk中,一个字符对应两个字节。utf8中,3个字节。Latin编码中一个字符对应一个字节。
解决mysql连表查询别名不起作用,同名的字段只能显示其中一个字段值
在navicat中这条语句可以正常执行,可以达到预期效果。
select t1.id id1,t2.id id2 from test1 t1 LEFT JOIN test1 t2 on t1.parent_id=t2.id
执行阶段 报错找不到字段,经过一番查找看到大神的解决方案如下
原文连接
解决办法:
字段为varchar类型的用 trim(字段名) 别名 ,
日期类型的DATE_FORMAT( 字段名, ‘%Y-%m-%d %H:%i:%s’ ) 别名
数字类型的 truncate(字段名,保留小数位数) 别名;
上述例子:sql如果按照上述进行修改后结果就是预期的。
select truncate(t1.id,2) id1,trim(t2.id) id2 from test1 t1 LEFT JOIN test1 t2 on t1.parent_id=t2.id
完美解决。
数据库的备份和恢复
-
备份单个数据库
在cmd窗口(未登录、未连接到mysql服务器的界面)中,可以通过如下命令对指定的数据库进行备份:
mysqldump -u用户名 -p密码 库名 > 备份文件的位置
示例1: 对db40库中的数据(表,表记录)进行备份,备份到 d:/db40.sql 文件中
mysqldump -uroot -proot db40 > d:/db40.sql注意: 1)如果输入命令回车之后没有提示错误,就说明备份成功了! 2)备份单个数据库,其实只会备份这个库中的表和表记录,并不会备份库本身!
2.备份多个数据库(比如备份两个数据库)
在cmd窗口(未登录、未连接到mysql服务器的界面)中
mysqldump -u用户名 -p密码 --databases 库名1 库名2 ... > 备份文件的位置
示例2: 对db20 和 db40 库中的数据进行备份,备份到 d:/db2040.sql 文件中
mysqldump -uroot -proot --databases db20 db40 > d:/db2040.sql
注意: 1)如果输入命令回车之后没有提示错误,就说明备份成功了!
2)备份多个数据库,不仅会备份这个库中的表和表记录,同时会备份库本身!
或者如果想备份mysql服务器中的所有的库以及库中的表和表记录,可以通过如下命令:
mysqldump -uroot -proot -A > d:/dball.sql
输入完后回车如果没有提示错误(error是错误,警告不是错误可以忽略),即表示备份成功!
恢复数据库
1.恢复数据库方式一(单个数据库):
在cmd窗口中(未登录的状态下),可以通过如下命令对指定的数据库进行恢复
mysql -u用户名 -p密码 库名 < 备份文件的位置
示例1: 将 d:/db40.sql 文件中的数据恢复到 db60 库中
1) 先在cmd窗口中(已登录的状态下), 先创建db60库
create database db60 charset utf8;
2) 再回到cmd窗口中(未登录的状态下), 执行下面恢复的命令
mysql -uroot -proot db60 < d:/db40.sql
2.恢复数据库方式二(多个数据库)
在cmd窗口中(已登录的状态下),可以通过source命令来执行指定位置的sql文件中的sql语句:
source sql文件的位置
示例2: 将 d:/db40.sql 文件中的数据恢复到 db80 库中
1) 先创建db80库, 并进入到db80库
create database db80 charset utf8;
use db80;
2) 再通过source命令执行 d:/db40.sql 文件中的sql语句
source d:/db40.sql
示例3: 将 d:/db2040.sql 文件中的数据恢复回来
1) 将db20,db40库删除(模拟数据丢失)
drop database db20;
drop database db40;
2) 再通过source命令执行 d:/db2040.sql 文件中的sql语句
source d:/db2040.sql
set names gbk;
set names gbk;(这个命令是用在cmd窗口中)用来通知数据库服务器, 当前cmd窗口发送给服务器的数据的GBK的,
那么服务器就会按照GBK编码来接收 cmd窗口发送过来的数据, 再将GBK的数据转换成utf8编码的数据存入数据库中!
这个命令只能用在cmd窗口! 而且是每次新开一个cmd窗口都需要重新设置一次!
像Navicat/SQLYog等工具不需要设置该命令,因为这些工具底层已经设置过编码了!
多表查询练习
1. 列出最低薪资大于1500的各种职位,显示职位和该职位的最低薪资.
列出最低薪资大于1500的各种职位,显示职位和该职位的最低薪资.** /*
列出职位:
1)求出各种职位的最低薪资
先按照职位进行分组,职位相同为一组,再用min(sal)求每组中的最低薪资,也就是每种职位的最低薪资
select job, min(sal) from emp group by job;
2)求出有哪些职位的最低薪资是大于1500的
select job, min(sal) from emp group by job where min(sal)>1500;-- 错误写法!
1)where应在放在from子句后, group by子句前
2)where中不能使用多行函数(列别名也不能用在where中)
3)where是在分组之前之前,先过滤掉一些记录,再基于剩余的记录进行分组,
而本地是先分组,再过滤,所以不能使用where,应该用having
*/
select job, min(sal) from emp group by job having min(sal)>1500;
----------------------------------
where和having的区别?
1)where和having都是用于对表中的记录进行筛选过滤
2)where用于在分组之前对记录进行筛选过滤,而having用于对分组之后的记录进行筛选过滤
3)where子句中不能使用多行函数 和 列别名,但可以使用表别名!
select name as 姓名, sal as 薪资 from emp e;
-- 其中上面的'姓名','薪资'都是列别名, e是表别名
4)having子句中可以使用多行函数 和 列别名 以及 表别名!
----------------------------------
2.列出在每个部门就职的员工数量、平均工资。显示部门编号、员工数量,平均薪资。
select dept_id, count(*), avg(sal) from emp group by dept_id;
select dept_id 部门编号, count(*) 员工数量, avg(sal) 平均薪资
from emp group by dept_id;
3.列出受雇日期早于直接上级的所有员工,显示员工编号、员工姓名、部门名称、上级编号、上级姓名。
/* emp e1(员工表), emp e2(上级表)
查询的列:SELECT e1.id, e1.name, d.name, e2.id, e2.name
查询的表:FROM emp e1, emp e2, dept d
连接条件:WHERE e1.topid=e2.id
AND e1.dept_id=d.id
筛选条件: AND e1.hdate < e2.hdate
*/
SELECT e1.id, e1.name, d.name, e2.id, e2.name
FROM emp e1, emp e2, dept d
WHERE e1.topid=e2.id
AND e1.dept_id=d.id
AND e1.hdate < e2.hdate;
数据库事务的四个特征
1.原子性:
要么都成功要么都失败,多条sql语句组成一个整体。
2.一致性:
不管提交还是回滚,事务执行前后的业务数据之和是保持一致的。
3.隔离性:
在事务并发时,一个事务理论上看不到另一个事务的状态,也就是说事务之间是相互隔离开的。
4.持久性:
一旦事务提交之后,事务中对数据的更新操作会持久的保持到数据库中。
在事务的提交之前,对数据的跟新只是一个临时的数据,并没有真的修改数据库。