MySql 基本操作
一、MySql的数据类型
整数类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
TINGINT | 1 | 有符号-128,无符号0 | 有符号127,无符号255 |
SMALLINT | 2 | 有符号032768,无符号0 | 有符号32767,无符号65525 |
INT、INTEGER | 4 | 有符号-2147483648,无符号0 | 有符号2147483647,无符号4294967295 |
BIGINT | 8 | 有符号-9223372036854775808,无符号0 | 有符号9223372036854775808,无符号18446744073709551615 |
浮点数类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
FLOAT | 4 | ±1.175495351E-38 | ±3.402823466E+38 |
DOUBLE | 8 | ±2.2250738585072014E-308 | ±1.7976931348623157+308 |
浮点类型推荐使用 decimal(保持为字符串格式)
字符串类型 | 字节 | 描述及存储需求 |
---|---|---|
CHAR(M) | M | |
VARCHAR(M) | M为0~65535间的整数,值的长度+1字节 | |
TINGBLOB | 允许长度0~255字节,值的长度+1字节 | |
BLOB | 允许长度0~65535字节,值的长度+2字节 | |
MEDIUMBLOB | 允许长度0~167772150字节,值的长度+3字节 | |
LONGBLOB | 允许长度0~4294967295字节,值的长度+4字节 | |
TINGTEXT | 允许长度0~255字节,值的长度+2字节 | |
TEXT | 允许长度0~65535字节,值的长度+2字节 | |
MEDIUMTEXT | 允许长度0~167772150字节,值的长度+3字节 | |
LONGTEXT | 允许长度0~4294967295字节,值的长度+4字节 | |
VARBINARY(M) | 允许长度为0~M个字节的可变厂字节字符串,值的长度+1字节 | |
BINARY(M) | M | 允许长度0~M个字节的定长字节字符串 |
日期和时间类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
DATE | 4 | 1000-01-01 | 9999-12-31 |
DATETIME | 8 | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 |
TIMESTAMP | 4 | 19700101080001 | 2038年的某个时刻 |
TIME | 3 | -838:59:59 | 939:59:59 |
YEAR | 1 | 1901 | 2155 |
enum 和 set:只能去固定的值,但enum唯一,set可以去任意个值
二、MySql运算符
> 算术运算符 #1
+ 加法
- 减法
* 乘法
/, DIV 除法,返回商
%,MOD 除法,返回余数
> 逻辑运算符 #2
NOT或! 逻辑非
AND或&& 逻辑与
OR或|| 逻辑或
> 比较运算符 #3
= 等于
<>或!= 不等于
<=> NULL安全的等于
< 小于
> 大于
>= 小于等于
<= 大于等于
BETWEEN 存在知道范围
IN 存在指定集合
IS NULL 为NULL
IS NOT NULL 不为NULL
LIKE 通配符匹配
REGEXP或RLIKE 正则表达式
三、MySql常用函数
> 时间和日期函数 #1
NOW(); //返回当前日期和时间
UNIX_TIMESTAMP(date); //返回日期date的UNIX时间戳
CURRENT_TIMESTAMP、CURRENT_TIMESTAMP(); //当前时间
CURDATE();
CURTIME();
DATE_FORMAT(date, "%y-%m-%d"); //格式化时间等
> 聚合函数 #2
count()、sum()、avg()、max()、min()
四、MySql完整性约束
primary key 主键
auto_increment 自增键
unique 唯一键
not null 非空键
default 默认值
foreign key 外键
五、MySql核心操作(库、表、CRUD、连接)
SQL作为结构化查询语言,是关系型数据库的同样语言,分为三个类别:
- DDL(Data Definition Languages)语句:
数据定义语言,这些语句定义了不同的数据库、表、列、索引等数据库对象的定义。常用的语句关
键字主要包括 create、drop、alter等。 - DML(Data Manipulation Language)语句:
数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字
主要包括 insert、delete、update 和select 等。 - DCL(Data Control Language)语句:
数据控制语句,用于控制不同的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户
的访问权限和安全级别。主要的语句关键字包括 grant、revoke 等。
库操作
show databases; //查询数据库
create database ChatDB; //创建数据库
drop database ChatDB; //删除数据库
use ChatDB; //选择数据库
表操作
show tables; //查看表
create table user(
id int unsigned primary key not null auto_increment,
name varchar(50) not null,
age tinyint not null,
sex enum('M','W') not null
)engine=INNODB default charset=utf8;
//创建表
desc user; //查看表结构
show create table user\G; //查看建表sql,\G表示分别罗列出每个属性的详细信息
drop table user; //删除表
CRUD
> insert增加 #1
insert into user(id, name, age, sex) values(null, 'zhang san', 22,
'M');
insert into user(id, name, age, sex) values(null, 'li si', 21, 'W'),
(null, 'gao yang', 20, 'M');
> update修改 #2
update user set age=23 where name='zhang san';
update user set age=age+1 where id=3;
> delete删除 #3
delete from user where age=23;
delete from user where age between 20 and 22;
delete from user;
> select查询 #4
select * from user;
select id,name,age,sex from user;
select * from user where sex='M' and age>=20 and age<=25;
> distinct去重 #5
select distince name from user;
> is[not]null空值 #6
select * from user where name is null;
> in子查询 #7
select * from user where id in(10, 20, 30, 40, 50)
select * from user where id not in(10, 20, 30, 40, 50)
select * from user where id in(select stu_id from grade where average>=60.0)
> limit分页 #8
select * from user limit N(offset) ,M(lines);
没有索引的情况下,limit可以提高效率
# 1 select * from user limit (pag - 1) * pagnum, pag; 效率低
select * from user where id > 上一页的最后一条数据 limit 20; 效率高
# 2 select * from user limit 100000, 20;
# 3 select * from user where id > 100000 limit 0, 20;
> order by排序 #9
select id,name,age,sex from user where sex='M' and age>=20 and age<=25
order by age asc;
> group by分组 #10
select count(id),age from user group by age having age>20;
通过存储过程生成大量测试数据
delimiter $
Create Procedure add_t_user (IN n INT)
BEGIN
DECLARE i INT;
SET i=0;
WHILE i<n DO
INSERT INTO t_user VALUES(NULL,CONCAT(i+1,'@fixbug.com'),i+1);
SET i=i+1;
END WHILE;
END$
delimiter ;
call add_t_user(2000000);
连接查询
先截个图,如下:
内连接(即最简单的等值连接):
select * from ta, tb where ta.a = tb.b;
左外连接(左连接):把left这边的表所有的数据显示出来,在右表中不存在相应数据,则显示NULL
select a.* from User a left outer join Orderlist b on a.uid=b.uidd where
a.orderid is null;
右外连接(右连接):把right这边的表所有的数据显示出来,在左表中不存在相应数据,则显示NULL
select a.* from User a right outer join Orderlist b on a.uid=b.uid where
b.orderid is null
参考图源博客:https://blog.csdn.net/qq_62687015/article/details/128104836