MySQL系列一之基础使用

MySQL是平常使用较多的数据,因项目需要发现自身对MySQL有所欠缺。所以复习了一下MySQL知识,做个总结归纳。本文介绍为基础知识,从数据库链接开始,包括一些常用SQL语句,和MySQL的一些数据类型。建议使用docker 的MySQL 进行SQL练习。同时推荐个人比较喜欢使用的数据库可视化软件Table Plus。

链接MySQL服务

通过命令行建立链接

# -u 参数指定用户名,-p指定密码,-P指定端口默认是3306,-h 是指定主机地址,-e 指定链接之后操作
mysql -uroot -proot -P3306 -h 127.0.0.1
mysql -uroot -proot -e"show databases" 
# 建立链接的同时,执行提前写好的sql文件
mysql -uroot -proot < test.sql

数据库管理

数据库管理包括,数据库创建,数据库删除,数据库使用等操作

-- 创建数据库并指定字符集
create database test charset utf8;
-- 数据库查看
show databases;
-- 删除数据库
drop database test;
-- 一般为了删除不存在的数据库报错,可以通过if exits
drop database if exits test;
-- 使用数据库
use test;

数据表管理

数据表管理包括,数据表创建,数据表删除,数据表记录增删改,数据表字段名修改

-- 创建class 表id 自增,同时指定表字符集
create table class (id int primary key AUTO_INCREMENT,cname varchar(30) NOT NULL,description varchar(100) default NULL) charset utf8;
-- 数据表插入单条数据,和多条数据
INSERT INTO class set cname ='golang',description='开发语言';
INSERT INTO class (cname,description) VALUES('PHP','开发语言'),('Mysql','数据库');
-- 数据表删除单条记录
delete from class where cname='golang';
-- 数据表修改单条记录
update class set cname = "PHP2" where id=2;
-- 删除表
drop table if exits class;

创建数据模板表,后续可以根据模板表创建新的数据表

-- 复制表结构
create table tcopy like class;
-- 复制表同时复制数据
create table tcopy select * from class;

数据表字段名称修改以及字段增删

-- 数据表重命名
alter table class rename classes;
rename table classes to class;
-- 数据表增加字段
alter table class add school varchar(50);
-- 数据表删除字段
alter table class drop school;
-- 修改字段名
alter table class CHANGE description descriptions varchar(30);

数据表相关主键操作,主键的增删

-- 主键为自增字段,需要删除自增属性后才可以删除主键
alter table class MODIFY id int not null;-- 删除自增
alter table class DROP PRIMARY key;-- 删除主键

-- 添加表主键
alter table class add PRIMARY KEY(id);-- 添加表主键
alter table class MODIFY id int not null AUTO_INCREMENT;-- 添加自增列
alter table class modify id int not null AUTO_INCREMENT ,add PRIMARY key(id);

数据类型

MySQL数据类型包括字符串,数值类型,枚举类型

字符串数据类型

类型 大小 用途
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字节 极大文本数据

CHAR类型是定长的数据类型,比如定义20长度的char类型即使只存一个字符,也占20个长度,好处是处理速度快,缺点是占用空间大。

VARCHAR类型是变长数据类型,空间受内容长度影响。

字符串常用函数

函数名 作用 示例
UPPER()/LOWER() 将内容全部改成大写/小写 select UPPER(cname) from class;
CONCAT() 字符拼接 select concat(cname,description) from class;
Left()/Right() 用于取左或右指定数量的字符 select left(cname,3) from class;
mid 从中间取字符串 select * from class where mid(cname,2,2) = ‘hp’;
substring 从指定位置开始向右截取字符串 select * from class where SUBSTRING(cname,2) = ‘hp’;
char_length 获取字符串数量 select char_length(cname) from class;

正则表达式和like的使用

-- 正则匹配php 或者MySQL
SELECT * FROM class WHERE cname REGEXP 'php|mysql';
-- _用于匹配一个字符,%用于匹配任意多个字符
SELECT *  FROM class WHERE cname LIKE '_h%';

数值整型类型

MySQL数据类型 含义(有符号)
tinyint(m) 1个字节 范围(-128~127)
smallint(m) 2个字节 范围(-32768~32767)
mediumint(m) 3个字节 范围(-8388608~8388607)
int(m) 4个字节 范围(-2147483648~2147483647)
bigint(m) 8个字节 范围(+-9.22*10的18次方)

取值范围如果加了unsigned,则最大值翻倍,如tinyint unsigned的取值范围为(0~256)。

数值浮点型

类型 大小 范围(有符号) 范围(无符号)
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<65 是总个数,d<30 依赖于M和D的值 依赖于M和D的值

ENUM/SET

ENUM 类型因为只允许在集合中取得一个值,有点类似于单选项。

SET 类型与 ENUM 类型相似但不相同。SET 类型可以从预定义的集合中取得任意数量的值。 一个 SET 类型最多可以包含 64 项元素。

日期时间

日期时间类型 占用空间 日期格式 最小值 最大值 零值表示
DATETIME 8 bytes YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 9999-12-31 23:59:59 0000-00-00 00:00:00
TIMESTAMP 4 bytes YYYY-MM-DD HH:MM:SS 1970-01-01 08:00:01 2038-01-19 03:14:07 00000000000000
DATE 4 bytes YYYY-MM-DD 1000-01-01 9999-12-31 0000-00-00
TIME 3 bytes HH:MM:SS -838:59:59 838:59:59 00:00:00
YEAR 1 bytes YYYY 1901 2155 0000

Mysql保存日期格式使用 YYYY-MM-DD HH:MM:SS的ISO 8601标准,

创建字段

ALTER TABLE class ADD create_at datetime default null;

对于时间有一些数据格式化表示,通常有一些格式化参数,常用的格式化参数如下:更多的查询官方文档

参数 描述
%Y 年,4 位
%y 年,2位
%M 月名
%m 月,数值(00-12)
%H 小时 (00-23)
%h 小时 (01-12)
%i 分钟,数值(00-59)
%s 秒(00-59)
%r 时间,12-小时(hh:mm:ss AM 或 PM)

使用示例

select cname,DATE_FORMAT(create_at,'%Y年%m月%d %H时%i分%s秒') as create_at from class;
select cname,TIME_FORMAT(create_at,'%r') as create_at from class;

添加数据时自动更新时间

alter table class add updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

只要该条记录有任何一个字段被修改,则自动更新update_at字段的值

常用函数

函数 说明
HOUR 小时
MINUTE
SECOND
YEAR
MONTH
DAY
TIME 获取时间
WEEK
QUARTER
CURRENT_DATE(CURDATE) 当前日期
CURRENT_TIME 当前时间
NOW 当前时间
DAYOFYEAR 一年中的日数
DAYOFMONTH 月份中日数
DAYOFWEEK 星期天(1)到星期六(7)
WEEKDAY 星期一(0)到星期天(6)
TO_DAYS 从元年到现在的天数(忽略时间部分)
FROM_DAYS 根据天数得到日期(忽略时间部分)
TIME_TO_SEC 时间转为秒数(忽略日期部分)
SEC_TO_TIME 根据秒数转为时间(忽略日期部分)
UNIX_TIMESTAMP 根据日期返回秒数(包括日期与时间)
FROM_UNIXTIME 根据秒数返回日期与时间(包括日期与时间)
DATEDIFF 两个日期相差的天数(忽略时间部分)
TIMEDIFF 计算两个时间的间隔(忽略日期部分)
TIMESTAMPDIFF 根据指定单位计算两个日期时间的间隔(包括日期与时间)
LAST_DAY 该月的最后一天

使用示例

-- 使用函数分割时间
select cname,YEAR(create_at),MONTH(create_at),DAY(create_at),HOUR(create_at),MINUTE(create_at),SECOND(create_at) from class;
-- 当前时间
SELECT now(),CURDATE(),CURRENT_DATE(),CURRENT_TIME(),NOW();
-- 时间计算
SELECT DAYOFYEAR(now()),DAYOFMONTH(now()),DAYOFWEEK(now()),WEEKDAY(now());

**时间计算 常用函数 **

函数 说明
ADDTIME 添加时间(负数为减少),只对时间有效
TIMESTAMP 添加时间(负数为减少),只对时间有效
DATE_ADD 根据单位添加时间,支持单位有YEAR/MONTH/DAY/HOUR/MINUTE/SECOND/HOUR_MINUTE(负数时等于DATE_SUB)
DATE_SUB DATE_ADD的反函数
LAST_DAY 指定月最后一天日期

使用示例

-- 获取七小时之前的时间
select ADDTIME(now(),'-7:00:00')
-- 获取七天之后的时间,interval表示间隔
SELECT DATE_ADD(now(),INTERVAL 7 DAY);
-- 获取本月第一天的日期
SELECT DATE_SUB(now(),INTERVAL DAYOFMONTH(now())-1 DAY);

本文参考链接[后盾人MySQL教程]([http://houdunren.gitee.io/note/mysql/2%20%E5%9F%BA%E6%9C%AC%E6%93%8D%E4%BD%9C.html](http://houdunren.gitee.io/note/mysql/2 基本操作.html))


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!