mysql

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
完美解决。

数据库的备份和恢复

  1. 备份单个数据库
    在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等工具不需要设置该命令,因为这些工具底层已经设置过编码了!

多表查询练习

dept表
emp表

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.持久性:
一旦事务提交之后,事务中对数据的更新操作会持久的保持到数据库中。
在事务的提交之前,对数据的跟新只是一个临时的数据,并没有真的修改数据库。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值