mysql表操作
- 模糊查旬
like
between and
in
is null | is not null
like
案例: 查询员工名中包含了"a"字符的所有员工的信息
select * from employees where last_name like '%a%'; // %:通配符,表示任意多个字符,也可表示0个字符, _:任意一个字符;
案例: 查询第三个字符为n或第五个字符为l的员工信息
select * from employees where last_name like '__n_l%';
案例: 查询员工信息表中员工名第二个字符是"_"的员工信息
select * form employees where last_name like '_\_%'; //支持java的转义字符
select * from employees where last_name like '_&_' escape '&'; // escape '&':说明&这个符号是转义字符,mysql推荐这样写;
注意:一般情况下,like都是通配符连在一起使用的.
between and
案例:查询员工工资中10000到20000之间到员工信息
select * from employees where salary>=10000 and salary<=20000;
select * from employees where salary between 10000 and 20000;
in:
案例:查询员工的工种编号是 it_prog,ad_vp,ad_pres中任意一个的员工信息
select * from employee where job_id='it_prog' or job_id='ad_vp' or job_id='ad_pres';
select * from employees where job_id in('it_prog','ad_vp','ad_pres')
in:判断某个字段的值是否属于in列表中的某一项
1.使用in比使用or后sql语句更简单
2.in的值必须是同一种数据类型或者兼容
is null | is no null:
案例:查询没有奖金率的员工信息
select * from employees commission_pct is null; 注意:commission_pct=null这个写法不能判断null值
查询奖金率的就取反:
select * from employees commission_pct is not null; 注意:当然这里is not也不能换成<>不等号.
补充一个东西:
安全等于号:<=> , 这个符号可以判断null值,也可以判断普通数值;
is null:只能判断null值,不能判断普通数值
=:只能判断普通数值,不能判断null值
事务机制
TCL:Transaction Control Language,事务控制语言
事务:在MySQL数据库中表示一条或多条Sql语句组合在一起的一个执行单元.这个执行单元要么全部执行,要么全部不执行,否则就会出现逻辑错误!
比如银行里的转账这个事情:
A账号余额:1000
B账号余额:1000
现在A转500元给B,那么要完成这个转账的事务,数据中的SQL应该是这样的执行过程:
①A账号上要减少500元
update 储蓄表 set A.余额=A.余额-500 where 账号名='A';
②B账号上要增加500元
update 储蓄表 set B.余额=B.余额+500 where 账号名='B';
如果没有事务处理这个功能,上面的情况下,很可能会发生这样的情况:
①执行成功 A的余额变为:500
刚开始执行②的时候,突然出现某系统系统错误,导致②执行失败!
①√②×:A的钱减少了,B的钱没增加!
所以在类似的场景需求中我们需要事务处理:实现将①和②的SQL语句绑定在一起,要么都执行成功,没的事! 要么不管是①执行出错还是②执行出错,数据库里的数据状态会回滚到没有执行任何①或②里的SQL语句之前!
①什么是存储引擎:
在mysql中的数据是用各种不同的技术来存储在磁盘文件(或内存)当中的,这种具体的存储技术就是我们说的存储引擎.
②我们可以通过show engines;命令来查看mysql支持的存储引擎.
③在mysql可以选择的这些存储引擎中,
innodb,myisam,memory这个三个是最常用的,但是其中只有innodb支持事务处理,而其他是不支持事务处理的.
事务的ACID特点:
①原子性(Atomicity):组成事务的SQL语句不可在分,要么都执行,要么都不执行.
②一致性(Consistency):事务必须让数据的数据状态变化到另一个一致性的状态,比如:刚刚的例子中A和B的余额总和是2000,转账后,A和B的余额总和不能变.前后具有一致性.
③隔离性(Isolation):一个事务的执行,不受其他事务的干扰,相互应该是隔离的,但是实际上是很难做到的,要通过隔离级别做选择!
④持久性(Durability):一个事务被提交,并成功执行,那么它对数据的修改就是永久性的.接下来的其他操作或出现的故障,不能影响到它执行的结果!
MySQL的事务的创建:
①隐视事务:
事务没有明显的开始和结束的标记.这时候像insert语句,update语句和delete语句,每一条SQL语句就默认是一个事务.显然,隐视事务在类似转账的逻辑业务需求的时候,就无法处理了!
②显示事务:
说白了,这个事务模式,就要我们中程序中手动的用命令来开启事务,和结束事务,并让事务里的多条SQL语句去执行.
注意:默认MySQL是开启自动提交事务的,用show variables like 'autocommit';命令可以查看到. 所以开启显示事务前,要关掉它,用set autocommit=0;只对本身会话有效,如重新登陆mysql就是打开了自动提交.
例子:银行转账:
开启事务:执行语句:结束事务
set autocommit=0;
start transaction;
编写事务中的SQL语句(主要是:select update delete insert等语句)
语句1;语句2;........
commit; #提交事务去真正执行(结束了)
ROLLBACK; #回滚事务,恢复数据库执行前的状态!(回到执行前,也是一个事务结束了。)
1.建表,插入两条数据,A,B都有1000元:
DROP TABLE IF EXISTS account;
CREATE TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20),
balance DOUBLE
);
INSERT INTO account(username,balance) VALUES('A',1000),('B',1000);
2.事务,A向B转账500,两条记录同时更改,但要同步。
SET autocommit = 0;
START TRANSACTION; #开启事务
UPDATE account SET balance=balance-500 WHERE username='A';
UPDATE account SET balance=balance+500 WHERE username='B';
commit; #提交事务
-----当有多个事务同时访问数据库中的同一个数据时,如果没有采取必要的隔离机制,就会导致各种并发错误发生,不是数据丢失:
两个事务t1,t2:
①脏读: 当t2正在更新某个字段但还没有提交数据库执行时,t1在这个时刻正好读取这个字段的数据,然后t2(java中)在发生错误,然后回滚数据,导致t1读取到数据就是t2更新时的临时数据,而且最终没有更新成功的无效数据!
②不可重复读:t1读取一个字段是数值,然后t2更新了这个字段,之后t1在读取同一个字段,值发生了变化!因为很短时间内t1只想读取初始值,但由于t2的原因,导致一不致性。
③幻读:t1读取一个字段是数值,然后t2对这个字段插入新数值,t1在读突然就多了几行数据.
数据库事务的隔离性:
数据库必须具有隔离这种并发运行的事务的能力,避免这些个错误现象!
一个事务与其他事务隔离的程度称为隔离级别:数据库规定了事务隔离级别,不同隔离级别对应不同的干扰程度,级别越高,数据一致性越好,但并发性越弱!MySQL数据库支持四个不同隔离级别,这四个由底到高的级别是:
read uncommitted; 读未提交数据
read commited; 读已提交数据
repeatable read; 可重复读(默认)
serialable; 串行化
演示隔离级别:
(在cmd命令窗口演示,要模拟并发情况,需要不同客户端,linux中直接可以打开多个窗口)
1.停目,重新启动mysql服务。
Windos:
>net stop mysql
>net start mysql
Linux:
#systemctl stop/start mysqld
2.查看当前隔离级别:默认:repeatable read;
登陆mysql后:
select @@tx_isolation; #mysql8.x已弃用
select @@transaction_isolation;
3.设置隔离级别:有会话,全局级别。
全局级的:设置全局的事务隔离级别,该设置不会影响当前已经连接的会话,设置完毕后,新打开的会话,将使用新设置的事务隔离级别。
会话级的:设置本次会话的事务隔离级别,只在本会话有效,不会影响到其它会话。
本例t1,t2:会话级的测试,不同会话之间不影响彼此。
首先t1事务:打开一个命令窗口,登入mysql服务。
select @@transaction_isolation; #查看隔离级别
set session transaction isolation level read uncommitted; #设置最低级别的,读未提交的数据,出脏读现象。
set autocommit =0; #因为每次退出mysql后,session重新建立,又是默认打开了提交事务,所以要关
START TRANSACTION;
use test;
update account set username='C' where id=1; #修改表第一条记录username='C;
注意:此处不写提交语句(commit;),命令窗口不关闭
查看一下表,可以看到表数据修改了。马上进入t2打开另一个命令窗口,进入mysql
其次t2:
use test;
select *from account;
可以发现该表的数据没有修改,仍是'A',出现了脏读。
设置与t1同一隔离级别:
set session transaction isolation level read uncommitted;
再查询:
select *from account; #数据修改了
再次t1回滚:
rollback;
又到t2中
select *from account;
其它级别自行测试:
第二级别: 脏读没有了,但不可重复读和幻读仍然有!
第三级别:没有脏读,没有不可重复读,仍然有幻读!
第四个级别:可以解决所有问题! 会使性能十分低下!
事务回滚点。
主要是关键字:savepoint
SET autocommit = 0;#开启事务
START TRANSACTION;
编写sql语句
DELETE FROM account WHERE id=1;
SAVEPOINT a; #设置保存点
DELETE FROM account WHERE id=2;
结束事务
ROLLBACK TO a; #回滚到保存点
java开启事务,提交事务,回滚事务。
上面是mysql中的硬编码测试,这里我们用到java代码开启事务。
首先有一个数据库连接: conn
其次:conn.setAutoCommit(false);相当于:
mysql>set autocommit =0;
mysql>start transcation ;
再次,提交,回滚结束事务:当然了要写异常处理。
conn.commit();
conn.rollback();
例 junit 测试:
/*
* 支持事务的查询测试。
*/
@Test
void testGetIntTranscation() throws SQLException {
Connection conn = JdbcUtils.getConnection();
User user = null;
conn.setAutoCommit(false); //开启事务
try {
user = userDao.get(conn, 5); //可以有很多语句,这里只一条
conn.commit();//提交事务
} catch (Exception e) {
e.printStackTrace();
try {
conn.rollback(); //有异常,回滚
}catch(SQLException e1) {
e1.printStackTrace();
}
} finally {
JdbcUtils.closeConn(conn);
}
System.out.println(user);
}
问题
-
java.sql.SQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"
报错很明显,数据库太多链接,应该是关闭项目后资源没有及时释放。
image.png
解决方法如下:
首先,重启MySQL服务。
进入MySQL,输入命令:
show variables like 'max_connections'; 查看当前最大连接数。
最大连接数修改大一点:
set global max_connections=1000;
注意事项:使用上面的可以进行临时解决问题,想要一直开启就需要去MySQL下面的my.ini文件里修改max_connections即可。
MySQL安装路径查询命令:
进入mysql命令行输入:show variables like "%char%"; Access denied for user 'root'@'localhost' (using password: Yes)
到安装的MySQL的目录下,找my.ini文件;
在[mysqld]后添加skip-grant-tables(使用 set password for设置密码无效,且此后登录无需键入密码)
skip-grant-tables #在my.ini,[mysqld]下添加一行,使其登录时跳过权限检查
-
windows 配置mysql允许远程登陆。
1.----连接Mysql (连接方式:mysql -u 你设置的用户名 -p你设置的密码 )
2.----查看数据库:show databases;我们会看到有一个叫做"mysql"的数据库,这里我们输入: use mysql 进入'mysql'数据库中
3.----执行 GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY '你设置的密码' WITH GRANT OPTION;
若出现ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
解决方案:
执行一次:mysql> flush privileges;
然后再执行:GRANT ALL Privileges....语句。
重启一下mysql服务
注意:如果是云主机,远程不能连接,那么可能是,防火墙规则没有放行3306端口。我们要添加允许3306端口放行数据。
image.png -
IDEA中mysql8.x注意时区设置问题,不设置容易出错。
11 查看时区
show VARIABLES like '%time_zone%'
image.png
time_zone: 表示 MySQL 采用的是系统的时区。也就是说,如果在连接时没有设置时区信息,就会采用这个时区配置。
12仅修改当前会话的时区,停止会话失效(CET)
set time_zone = '+8:00';
13 修改全局的时区配置
set globaltime_zone = '+8:00';
flush privileges;
大多数时候用到13.
- com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Every derived table must have its own alias.别名
---做EduSystem项目时,在ScoreDao.java中遇到的问题,它在连接oralce 12c不会出错,这里是mysql出的问题。
String sql = "select courseno,coursename,case when score between 0 and 60 then '0-60' "+
" when score between 60 and 70 then '60-70'"+
" when score between 70 and 80 then '70-80'"+
" when score between 80 and 90 then '80-90'"+
" else '90-100' end as 分数段,count(*)人数 "+
" from (select A.courseno courseno,B.coursename coursename,A.score score from" +
" t_score A join t_course B on A.courseno=B.courseno where A.courseno='"+courseno+"')"+
" group by courseno,coursename,case when score between 0 and 60 then '0-60'"+
" when score between 60 and 70 then '60-70'"+
" when score between 70 and 80 then '70-80'"+
" when score between 80 and 90 then '80-90'"+
" else '90-100' end order by count(*)";
这句话的意思是说每个派生出来的表都必须有一个自己的别名。
一般在多表查询时,会出现此错误。
因为,进行嵌套查询的时候子查询出来的的结果是作为一个派生表来进行上一级的查询的,所以子查询的结果必须要有一个别名
把MySQL语句改成:select * from (select * from ……) as 别名;
改:注意,看下面代码了最未尾的as xiong。
String sql = "select courseno,coursename,case when score between 0 and 60 then '0-60' "+
" when score between 60 and 70 then '60-70'"+
" when score between 70 and 80 then '70-80'"+
" when score between 80 and 90 then '80-90'"+
" else '90-100' end as 分数段,count(*)人数 "+
" from (select A.courseno courseno,B.coursename coursename,A.score score from" +
" t_score A join t_course B on A.courseno=B.courseno where A.courseno='"+courseno+"') as xiong".....
- windows的cmd编码问题,cmd默认为gpk编码,所以在cmd登入mysql后,插入中文数据,不允许插入,查询的中文也是乱码。处理:登入数据库后,写下如下代码,临时有用。
>set names gpk;
几个sql语句举例。
----首选见以下几个表
《1》t_student
《2》t_teahcer
《3》t_course
《4》t_score
- 查询001号课程的每个分数段有几个人。
SELECT courseno,coursename,CASE WHEN score BETWEEN 0 AND 60 THEN '0-60'
WHEN score BETWEEN 60 AND 70 THEN '60-70'
WHEN score BETWEEN 70 AND 80 THEN '70-80'
WHEN score BETWEEN 80 AND 90 THEN '80-90'
ELSE '90-100' END AS 分数段,COUNT(*) 人数
FROM (SELECT A.courseno courseno,B.coursename coursename,A.score score FROM
t_score A JOIN t_course B ON A.courseno=B.courseno WHERE A.courseno=001) AS xiong
GROUP BY courseno,coursename,cas`t_student`e WHEN score BETWEEN 0 AND 60 THEN '0-60'
WHEN score BETWEEN 60 AND 70 THEN '60-70'
WHEN score BETWEEN 70 AND 80 THEN '70-80'
WHEN score BETWEEN 80 AND 90 THEN '80-90'
ELSE '90-100' END ORDER BY COUNT(*)
结果:
- 查询0001号学生所选的课程号课程名,及所授课老师,课程成现。涉及三个表。
SELECT * FROM t_score A JOIN t_student B ON A.stuno=B.stuno JOIN t_course C ON
A.courseno=C.`courseno` WHERE A.`stuno`=0001;
结果:
- 查询所有课程名,结果集中不含重复的值。
SELECT DISTINCT(coursename) FROM t_course;
结果:
mysql数据的安装配置
windows环境下
- mysql 8.x
https://dev.mysql.com/downloads/mysql/#downloads
[mysql安装与远程登陆配置](//www.greatytc.com/p/a6801ba4b4d6)
- mysql 5.x
数据库与表操作
本示例是远程登陆数据,首先本地要安装了mysql,并配置了环境变量。
mysql -h 124.222.48.147 -u root -p //回车
xiong //密码
- 创建/删除数据库
//创建数据库
create database test_db;
SHOW create database test_db\G; //查看数据库定义
show databases; //查看已有的数据库
//删除数据库
DROP DATABASE database_name;
//显示数据库引擎类型
show engines \G //Support列的值表示某种引擎是否能使用,YES表示可以,NO表示不能,DEFAULT表示默认为该引擎
show variables like 'storage_engine';
----InnoDB是事务型数据库的首选引擎,支持事务的安全表(ACID),支持行锁定和外键,MYSQL 5.5.5之后,InnoDB作为默认存储引擎 。如果数据表主要用来插入和查询记录,则 MyISAM引擎更好点。如果只是存放临时数据,数据量不大,并且不要求较高的安全性可用选用保存在内存中的Memory引擎,只是存放一些中间结果。
- 创建数据表与相关配置
创建表
create table <table_name>
(字段名1 数据类型 [列级别约束条件] [默认值],
字段名2 数据类型 [列级别约束条件] [默认值],
……
[表级别约束条件]
);
//创建表tb_emp1
mysql> create table tb_emp1
-> (
-> id INT(11),
-> name VARCHAR(25),
-> deptId INT(11),
-> salary FLOAT
-> );
//创建表 tb_emp2 设了id为主键
create table tb_emp2
(
id INT(11) PRIMARY KEY,
name varchar(25),
deptId INT(11),
salary FLOAT
);
//或(也可用逗号隔开多字段联合主键)
create table tb_emp2
(
id INT(11) PRIMARY KEY,
name varchar(25),
deptId INT(11),
salary FLOAT,
primary key(id)
);
//外键约束,主要作用是保持数据的一致性,完整性。
//外键约束用来在两个表之间建立链接,它可以是一列或者多列。一个表可以有一个
//或多个外键,一个表的外键值可以为空,若不为空,则每一个外键值必须等于另一个表中的主键值。
//语法规则如下:
[constraint <外键名>] foreign key 字段名1[,字段名2,……] references <主表名> 主键列1[,主键列2.……]
//例:创建表tb_dept1关联到tb_emp3,主键id关联到外键dpetId.
create table tb_emp3
(
id INT(11) PRIMARY KEY,
name varchar(22),
deptId INT(11),
salary FLOAT,
constraint fk_emp3_dept1 foreign key(deptId) references tb_dept1(id)
);
create table tb_dept1
(
id INT(11) primary key,
name varchar(22) not null,
location varchar(50)
);
//非空约束
name varchar(25) not null,
//唯一性约束
[constraint <约束名>] UNIQUE(<字段名>)
........
location varchar(50),
CONSTRAINT sth UNIQUE(name)
)
//默认性约束,如某一表中性别‘男’较多时,可设默认值为‘男’
sex varchar(2) DEFAULT '男',
//设置表的字段值自动增加
id INT(11) PRIMARY KEY AUTO_INCREMENT,
查看表结构
describe 表名; 或 desc 表名;
show create table <表名\G>
修改表
一,表删除操作须谨慎,因为删除表时没有任提示信息,应先备份再做删除操作
二,并不是每个表都要一个主键,只有关联时用到,有时因不须要有主键
三,并不是每个表都可以任意的选择存储引擎,如外键约束不可跨引擎。
//修改表名
ALTER TABLE <旧表名> RENAME [TO] <新表名>;
//修改数据类型
ALTER TABLE <表名> MODIFY <字段名> <数据类型>
例 :alter table tb_dept1 modify name varchar(30);
//添加字段
ALTER TABLE ,<表名> ADD <新字段名> <数据类型> [约束条件] [FIRST | AFTER 已存在字段名]; //默认插入到最后列
//删除字段
ALTER TABLE <tablename> DROP <字段名>;
//修改字段的排列位置
ALTER TABLE <表名> MODIFY <字段1> <数据类型> FIRST|AFTER <字段名2>;
//修改字段名
ALTER TABLE <表名> change <旧字段名> <新字段名> <数据类型>
//更改表的存储引擎 ,可以为每张表设定不同的引擎
//常用的引擎名:MyISAM,InnoDB,MEMORY(HEAP),BDB,CSV,ARCHIVE
ALTER TABLE <表名> ENGINE=<更改后的存储引擎名>;
//删除表的外键约束
ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;
//删除表
//1,删除没有被关联的表
DROP TABLE [IF EXISTS] 表1,表2,表3.....n;
//2,删除关联表,首先,删除父表,再删除子表。而删除父表之前,要册除子表的外键约束。
//删除表中所有的数据
delete from tablename;
数据类型
-
整数类型
image.png
分别点用1,2,3,4,8个字节存储
- 浮点数类型
MySQL中使用浮点数和定点数来表示小数。
浮点类型:FLOAT、DOUBLE。
定点类型:DECIMAL。占用m+2个字节
例:create table temp(x FLOAT(5,1),y DOUBLE(5,1),z DECIMAL(5,1));
都是保留一位小数。 - 字符串类型
字符串类型用来存储字符串数据,除了可以存储字符串数据之外,还可以存储其它数据,比如图片和声音的二进制数据。
CHAR、VARCHAR、BINARY、VARBINARY BLOB、TEXT、ENUM和SET。
31。char与varchar固定长度,非固定长都为非二进制字符串
char(M)为固定长度字符串同,在定义时指定字符串列长。当保存时在右侧填充空格以达到指定的度.M表示长度,M的范围是0-255个字符,其检索时尾部空格被删除,varchar(M),实际长度0~65535,实现存储为M+1长度,一个结束符。
insert into tmp4 values ('ab ','ab ');
mysql> select concat('(',ch,')'),concat('(',vch,')') from tmp4;
+--------------------+---------------------+
| concat('(',ch,')') | concat('(',vch,')') |
+--------------------+---------------------+
| (ab) | (ab ) |
+--------------------+---------------------+
insert into tmp4 values ('ab ','ab ');
select concat('(',ch,')'),concat('(',vch,')') from tmp4;
+--------------------+---------------------+
| concat('(',ch,')') | concat('(',vch,')') |
+--------------------+---------------------+
| (ab) | (ab ) |
+--------------------+---------------------+
32。ENUM是一个字符串对象,其值为表创建时在列规定中枚举的一列值。
create table tmp5(enm ENUM('first','second','third');
mysql> insert into tmp5 values('first'),('second'),('df');
ERROR 1265 (01000): Data truncated for column 'enm' at row 3 //没有‘df’这个枚举值
insert into tmp5 values('first'),('second');
+--------+
| enm |
+--------+
| first |
| second |
+--------+
- 二进制
前面讲解了存储文本的字符串类型,这一节将讲解MySQL中存储二进制数据的数据类型
BIT、BINARY、VARBINARY、TINYBLOB、
BLOB、MEDIUMBLOB、LONGBLOB,
41。BIT(M)类型
BIT类型是位字段类型,M表示每个值的位数,范围为1~64.如果M被省略,默认为1,如果为BIT(M)列分配的值的长度小于M位,在值的左边用0填充。例如,为BIT(6)列分配一个值b'101',其效果与分配b‘000101‘相同。大于二进制1111的数据是不能插入到BIT(4)中
insert into tmp6 values(2),(6),(9);
mysql> select BIN(b+0) from tmp6;
+----------+
| BIN(b+0) |
+----------+
| 10 |
| 110 |
| 1001 |
| 1101 |
+----------+
- 日期与时间类型
51。YEAR
日期格式---YYYY,日期范围:1901~2155 存储需求:1字节,(1)以4位字符串或数字格式表示YEAR年,例:输入 ‘2020‘或2020,插入到数据库的值均为2020.(2)以2位数字符串或数字格式表示的YEAR,范围为‘00‘到‘99‘。‘00‘~‘69‘和‘70‘~’99’,范围的值分别被转换为2000~2069和1970~1999,数字1~69和70~99范围的值分别被转换为2000~2069和1970~1999,
例:
create table tmp3(y YEAR);
INSERT INTO tmp3 values(2010),('2010');
+------+
| y |
+------+
| 2010 |
| 2010 |
+------+
insert into tmp3 values('0'),('00'),('77'),('10');
+------+
| y |
+------+
| 2000 |
| 2000 |
| 1977 |
| 2010 |
+------+
insert into tmp3 values(77),(10);
| 1977 |
| 2010 |
52。TIME
时间类类里,在存储时需要3个字节。格式为‘HH:MM:SS’.TIME类型的取值范围为-838:59:59~838:59:59。(1)‘D HH:MM:SS'格式的字符串,可以使用下面任何一种语法,‘HH:MM:SS','D HH:MM','HH:MM','D HH'或‘SS’,为里D表示日,可以取值0~34之间的值,在插入数据库时,D被转成小时保存,格式为“D*24+HH" (2)。‘HHMMSS'格式的,没有间隔符的字符串或HHMMSS数字格式的值,例如‘101112‘被理解为‘10:11:12’,但‘109712’是不合法的,因为分没有大于59的。(3)CURRENT_TIME,NOW(),会自动识别当前时间TIME.
例:
insert into tmp4 values('10:05:05'),('23:23'),('2 10:10'),('3 02'),('10');
+----------+
| t |
+----------+
| 10:05:05 |
| 23:23:00 |
| 58:10:00 |
| 74:00:00 |
| 00:00:10 |
+----------+
insert into tmp4 values('101112'),('111213'),('0');
+----------+
| t |
+----------+
| 10:11:12 |
| 11:12:13 |
| 00:00:00 |
+----------+
insert into tmp4 values(CURRENT_TIME),(now());
53。DATE
该类型用在仅需要日期值时,没有时间部分,存储需要3个字节(1),以‘YYYY-MM-DD’或‘YYYYMMDD’字符串表示的日期,取值范围'1000-01-01'~'9999-12-3'(2)'YY-MM-DD'或'YYMMDD',二位年份参考前面的YEAR类型讲解(3),使用CURRENT_DATE或NOW(),插入当前系统的日期
----Mysql允许“不严格”语法:任何标点符号都可以用作日期部分之间的间隔符。例:‘99-11-31' '99.11.31','99/11/31','99@11@31"都是等价的。
insert into tmp1 values (990909),(000101),(111111);
+------------+
| d |
+------------+
| 1999-09-09 |
| 2000-01-01 |
| 2011-11-11 |
+------------+
54。DATETIME
DATATIME类型用在需要同时包含日期和时间信息的值,在存储时需要8个字节。日期格式'YYYY-MM-DD HH:MM:SS'(1).''YYYY-MM-DD HH:MM:SS'或者‘YYYYMMDDHHMMSS’取值范围是'1000-01-01 00:00:00'到‘9999-12-3 23L59:59‘(2)。‘YY-MM-DD HH:MM:SS'或者‘YYMMDDHHMMSS'(3)。YYYYMMDDHHMMSS或者YYMMDDHHMMSS
insert into tmp2 values('1998-01-17 08:08:08'),('19980117080808');
+---------------------+
| d |
+---------------------+
| 1998-01-17 08:08:08 |
| 1998-01-17 08:08:08 |
insert into tmp2 values('99-09-09 09:09:09'),('990909090909');
| 1999-09-09 09:09:09 |
| 1999-09-09 09:09:09 |
+---------------------+
insert into tmp2 values (NOW()); //插入当前日期
55。TIMESTAMP
显示格式与DATETIME相同,显示宽度固定在19个字符,存储需要4个字节,但它的取值范围为'1970-01-01 00:00:01' UTC~ '2038-01-19 03:14:07` UTC.UTC世间标准时间。TIMESTAMP值的存储是以UTC格式保存的,存储时对前时区进行转换,检索时再转换回回当前时区。即查询时,根据当前时区的不同,显示的时间值是不同的
insert into tmp3(NOW());
+---------------------+
| ti |
+---------------------+
| 2022-12-08 20:00:37 |
+---------------------+
//我们中国所在的时区为东8区,下面我们修改一下时区为东10区,再看看结果
set time_zone='+10:00';
+---------------------+
| 2022-12-08 22:00:37 |
+---------------------+
常见运算符介绍
运算符,下面是按高到低的优先级写的。
!
-负号,~位反转
*,/,%(求余)
+,-
<<.>>
&
|
=,<=>,>=,>,<=,<,<>,!=,IS,LIKE,REGEXP,IN,LEAST(返回最小值)
BETWEEN,CASE,WHEN,THEN,ELSE
NOT
&& ,AND
XOR
||,OR
=(赋值),:=,逗号
- 算术运算符
例:创建表tmp7,定义数据类型为INT的字段num,插入值64,对num值进行算术运算。
create table tmp7(num int);
insert into tmp7 values(64);
select num,num+10,num-3+5,num+5-3,num+36.5 from tmp7;
+------+--------+---------+---------+----------+
| num | num+10 | num-3+5 | num+5-3 | num+36.5 |
+------+--------+---------+---------+----------+
| 64 | 74 | 66 | 66 | 100.5 |
+------+--------+---------+---------+----------+