Java 面试机经(初级篇-19期)_MySQL

Java 面试机经(初级篇-19期)_MySQL_02

167. MySql 

 

MySQL数据类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

数值类型:

 

类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 字节 (-128,127) (0,255) 小整数值
SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4 字节 (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度
浮点数值
DOUBLE 8 字节 (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度
浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的  

 

日期和时间类型:

类型 大小
(字节)
范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4

1970-01-01 00:00:00/2038

结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07

YYYYMMDD HHMMSS 混合日期和时间值,时间戳

 

字符串类型:

类型 大小 用途
CHAR 0-255字节 定长字符串
VARCHAR 0-65535 字节 变长字符串
TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串
TINYTEXT 0-255字节 短文本字符串
BLOB 0-65 535字节 二进制形式的长文本数据
TEXT 0-65 535字节 长文本数据
MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
LONGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295字节 极大文本数据

 

数据库基础语法:

-- 创建数据库 test
CREATE DATABASE test;

-- 如果存在 test 表就删除 test 表
DROP TABLE IF EXISTS `test`;

-- 创建 test 表
CREATE TABLE `test` (
`id`
BIGINT(64) NOT NULL AUTO_INCREMENT COMMENT 'id',-- 主键 id long 型 不可为空 自
增长
`number`
BIGINT(64) DEFAULT NULL COMMENT '编号',-- 编号 number 字符串类型 默认为空
PRIMARY KEY (`id`)-- 设置主键 id
) ENGINE=INNODB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='测试表';-- INNODB 引擎 自
增长 0 开始 默认 utf8 字符集

-- insert 数据
INSERT INTO test(number) VALUES('66666');

-- update 数据
UPDATE test SET number='99999' WHERE id=1;

-- delete 数据
DELETE FROM test WHERE id=1;

-- 清空 test 表数据
TRUNCATE test;

-- 为 test 表添加(年龄和手机号)字段列
ALTER TABLE test ADD age INT(10) NULL COMMENT '年龄';
ALTER TABLE test ADD phone VARCHAR(11) NULL COMMENT '手机号';

-- 删除编号字段
ALTER TABLE test DROP COLUMN number;

-- 修改列
ALTER TABLE test MODIFY COLUMN number VARCHAR(64) COMMENT '手机号';-- 修改字段类型为字符
串类型
ALTER TABLE test CHANGE COLUMN number phone_number VARCHAR(64);-- 修改 number 字段名为
phone_number

-- 为 phone_number 字段创建索引
CREATE INDEX phone_number_index ON test(phone_number);

-- 删除 phone_number_index 索引
DROP INDEX phone_number_index ON test;

-- 创建 phone_number 字段的唯一索引
CREATE UNIQUE INDEX phone_number_unique_index ON test(phone_number);

-- 删除编号字段
ALTER TABLE test DROP COLUMN phone_number;

###############################日期函数###############################
-- 当前年
SELECT DATE_FORMAT(NOW(), '%Y');

-- 当前年月
SELECT DATE_FORMAT(NOW(), '%Y %m');



-- 当前年月日
SELECT DATE_FORMAT(NOW(), '%Y %m %d');//SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');

-- NOW()是语句开始执行的时间,SYSDATE()是动态的实时时间。
SELECT NOW(),SYSDATE(),SLEEP(3),NOW(),SYSDATE();

-- 查询当前月份
SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 0 MONTH), '%m');

-- 查询上个月月份
SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 MONTH), '%m');

-- 查询上上个月月份
SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 2 MONTH), '%m');

-- 系统当前时间(年-月-日 时:分:秒)
SELECT CURRENT_TIMESTAMP, CURRENT_TIMESTAMP();

-- 时间格式转换为字符串
SELECT DATE_FORMAT('2019-08-30 13:30:00', '%Y%m%d%H%i%s');
SELECT DATE_FORMAT(NOW(), '%Y%m%d%H%i%s');

-- 字符串转时间格式
SELECT STR_TO_DATE('08/30/2019', '%m/%d/%Y'); -- 2019-08-30
SELECT STR_TO_DATE('08/30/19', '%m/%d/%y'); -- 2019-08-30
SELECT STR_TO_DATE('08.30.2019', '%m.%d.%Y'); -- 2019-08-30

-- 时间戳格式互相转换
SELECT UNIX_TIMESTAMP(); -- 1568172945
SELECT UNIX_TIMESTAMP('2019-08-30'); -- 1567094400
SELECT UNIX_TIMESTAMP('2019-08-30 13:30:00'); -- 1567143000
SELECT FROM_UNIXTIME(1568172945); -- '2019-09-11 11:35:45'
SELECT FROM_UNIXTIME(1567094400); -- '2019-08-30 00:00:00'
SELECT FROM_UNIXTIME(1567143000); -- '2019-08-30 13:30:00'
SELECT FROM_UNIXTIME(1567143000, '%Y %D %M %h:%i:%s %x'); -- '2019 30th August 01:30:00 2019'

-- 当前时间增加时间间隔
SELECT DATE_ADD(NOW(), INTERVAL 1 DAY); -- 一天后
SELECT DATE_ADD(NOW(), INTERVAL 1 HOUR); -- 一小时后
SELECT DATE_ADD(NOW(), INTERVAL 1 MINUTE); -- 一分钟后
SELECT DATE_ADD(NOW(), INTERVAL 1 SECOND); -- 一秒后
SELECT DATE_ADD(NOW(), INTERVAL 1 WEEK);-- 一周后
SELECT DATE_ADD(NOW(), INTERVAL 1 MONTH);-- 一月后
SELECT DATE_ADD(NOW(), INTERVAL 1 QUARTER);-- 一季后
SELECT DATE_ADD(NOW(), INTERVAL 1 YEAR);-- 一年后
SELECT DATE_ADD(NOW(), INTERVAL -1 YEAR);-- 一年前

-- 计算时间间隔
SELECT TIMESTAMPDIFF(YEAR,'2018-08-30','2019-08-30'); -- 1 年
SELECT TIMESTAMPDIFF(DAY ,'2018-08-30','2019-08-30'); -- 365 天
SELECT TIMESTAMPDIFF(HOUR,'2019-08-30 12:00:00','2019-08-30 13:00:0'); -- 1 小时
-- SECOND 秒 /MINUTE 分钟/HOUR 小时/DAY 天/MONTH 月/YEAR 年

-- 此函数只能计算相隔天数
SELECT DATEDIFF('2019-08-30 12:00:00', '2019-09-30 00:00:00'); -- -31 天(此函数只能计算
相隔天数)

###############################触发器和存储过程###############################
-- 触发器初始结构
DELIMITER $$
CREATE
TRIGGER `数据库名`.`触发器名` BEFORE/AFTER INSERT/UPDATE/DELETE
ON `数据库名`.`表名`
FOR EACH ROW BEGIN
-- 逻辑、条件语句
END$$
DELIMITER ;

-- 存储过程初始结构
DELIMITER $$
CREATE
PROCEDURE `数据库名`.`存储过程`()
/*LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'*/
BEGIN
END$$
DELIMITER ;