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次方)
#取正值
tinyint unsigned
浮点型
float(m,d) 单精度浮点型 8位精度(4字节) m总个数,d小数位
double(m,d) 双精度浮点型16位精度(8字节) m总个数,d小数位
#设一个字段定义为float(6,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位
字符串
char(n) 固定长度,最多255个字符
varchar(n) 可变长度,最多65535个字符
tinytext 可变长度,最多255个字符
text 可变长度,最多65535个字符
mediumtext 可变长度,最多2的24次方-1个字符
longtext 可变长度,最多2的32次方-1个字符
BINARY(M) 固定长度,可存二进制或字符,长度为0-M字节
VARBINARY(M) 可变长度,可存二进制或字符,允许长度为0-M字节
内建类型:ENUM枚举, SET集合
char和varchar的区别
char是固定长度,varchar是可变但有最值,定义4个字节情况下显示空
char固定占4个字节,varchar只占一个字节
数据大小差不多用char,大小不一用varchar
看情况来使用
varchar和text
TEXT以文本方式存储,英文存储区分大小写
text类型不能有默认值
varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text
日期时间类型
- DATE: 用来表示年、月、日。日期 ‘2008-12-2’
- TIME: 用来表示时、分、秒。时间 ‘12:25:36’
- DATETIME : 用来表示年、月、日、时、分、秒。日期时间 ‘2008-12-2 22:06:44’
- YEAR: 用来表示年
- TIMESTAMP: 自动存储记录修改时间,可以存放这条记录最后被修改的时间
修饰符
#适用所有类型的修饰符:
NULL #数据列可包含NULL值,默认值
NOT NULL #数据列不允许包含NULL值,*为必填选项,不能为空
DEFAULT #默认值
PRIMARY KEY #主键,所有记录中此字段的值不能重复,且不能为NULL
UNIQUE KEY #唯一键,所有记录中此字段的值不能重复,但可以为NULL
CHARACTER SET name #指定一个字符集
comment '描述' #添加描述
#适用数值型的修饰符:
AUTO_INCREMENT #自动递增,适用于整数类型
UNSIGNED #无符号
SQL指令
语句分类
-
DDL: Data Defination Language 数据定义语言
CREATE,DROP,ALTER
-
DML: Data Manipulation Language 数据操纵语言
INSERT,DELETE,UPDATE
-
DQL:Data Query Language 数据查询语言
SELECT
-
DCL:数据控制语言
-
TCL:事务控制语言
查看命令帮助
help contents #总目录,需要细看就找目录下的具体命令
#官方文档
https://dev.mysql.com/doc/refman/8.0/en/sql-statements.html
基于帮助完成添加testdb库,字符集utf8, 排序集合utf8_bin
mysql> help create database
Name: 'CREATE DATABASE'
Description:
Syntax:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[create_option] ...
create_option: [DEFAULT] {
CHARACTER SET [=] charset_name
| COLLATE [=] collation_name
| ENCRYPTION [=] {'Y' | 'N'}
}
CREATE DATABASE creates a database with the given name. To use this
statement, you need the CREATE privilege for the database. CREATE
SCHEMA is a synonym for CREATE DATABASE.
URL: https://dev.mysql.com/doc/refman/8.0/en/create-database.html
mysql> create database testdb character set utf8 collate utf8_bin;
Query OK, 1 row affected, 2 warnings (0.01 sec)
mysql> show create database testdb;
+---------+-------------------------------------------------------------------------------------------------------------------+
|Database | Create Database |
+---------+-------------------------------------------------------------------------------------------------------------------+
|testdb |CREATE DATABASE `testdb` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */ /*!80016 DEFAULT ENCRYPTION='N' */|
+---------+-------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
更改c/s端的默认字符集为utf8mb4
vim /etc/my.cnf
[mysqld]
character-set-server=utf8mb4
[client]
default-character-set=utf8mb4
systemctl restart mysqld
[root@localhost ~]#mysql
mysql> SHOW VARIABLES LIKE '%char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
创建一个主机表host,放在testdb中,
要求:
- 主键自增id 无符号, tinyint.
- hostname可变字符长度256,可为空。。
- ip 可变字符长度256,可为空。
- 账号,可变字符长度256,可为空。
- 密码,可变字符长度256,可为空。
- 创建时间,时间类型,非空。
- 更新时间,时间类型,默认当前时间。
- 区域,只能在华南,华北,华东,三个区域之一。
- 端口,无符号整数,可为空。
- 外网地址,可变字符长度256,可为空。
- 内网地址,可变字符长度256,可为空。
mysql> use testdb
Database changed
mysql> create table host (id tinyint unsigned primary key auto_increment, hostname varchar(256) null,ip varchar(256) null,password varchar(256),account varchar(256),creationtime datetime not null,updatetime datetime,region enum('south china','north china','east china'),port tinyint unsigned,internetaddress varchar(256),insidenetwork varchar(256) );
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| host |
+------------------+
1 row in set (0.00 sec)
mysql> desc host;
+-----------------+------------------------------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+------------------------------------------------+------+-----+---------+----------------+
| id | tinyint unsigned | NO | PRI | NULL | auto_increment |
| hostname | varchar(256) | YES | | NULL | |
| ip | varchar(256) | YES | | NULL | |
| password | varchar(256) | YES | | NULL | |
| account | varchar(256) | YES | | NULL | |
| creationtime | datetime | NO | | NULL | |
| updatetime | datetime | YES | | NULL | |
| region | enum('south china','north china','east china') | YES | | NULL | |
| port | tinyint unsigned | YES | | NULL | |
| internetaddress | varchar(256) | YES | | NULL | |
| insidenetwork | varchar(256) | YES | | NULL | |
+-----------------+------------------------------------------------+------+-----+---------+----------------+
11 rows in set (0.00 sec)
给testdb.host表中添加多条数据。
mysql> insert into host (id,creationtime,region) values(1,now(),'north china');
Query OK, 1 row affected (0.00 sec)
mysql> insert into host (creationtime,region) values(now(),'east china');
Query OK, 1 row affected (0.00 sec)
mysql> insert into host (creationtime,region) values(now(),'south china');
Query OK, 1 row affected (0.00 sec)
mysql> select * from host;
mysql> select * from host;
+----+----------+------+----------+---------+---------------------+------------+-------------+------+-----------------+---------------+
| id | hostname | ip | password | account | creationtime | updatetime | region | port | internetaddress | insidenetwork |
+----+----------+------+----------+---------+---------------------+------------+-------------+------+-----------------+---------------+
| 1 | NULL | NULL | NULL | NULL | 2023-05-26 11:46:26 | NULL | north china | NULL | NULL | NULL |
| 2 | NULL | NULL | NULL | NULL | 2023-05-26 11:47:41 | NULL | east china | NULL | NULL | NULL |
| 3 | NULL | NULL | NULL | NULL | 2023-05-26 11:47:54 | NULL | south china | NULL | NULL | NULL |
+----+----------+------+----------+---------+---------------------+------------+-------------+------+-----------------+---------------+
3 rows in set (0.00 sec)
总结DDL, DML的用法,并配上示例
表DDL
创建表
#定义表里相对应的列,创建学生信息表
create table student ( #创建新表命名student,()里面是相对应的列及对应的赋值
id tinyint unsigned primary key auto_increment , #人数取正值,按照范围选取,设置主键,主键是不允许为空的,自动递增
name char(4) not null, #名字定义字符宽度4,不能为空
gender char(1), #性别定义字符宽度1,也可写成enum('F','M')要么F要么M
age tinyint unsigned ); #年龄,取正值,按照范围选取
#用select user.host from mysql.user;查看的信息来创建新的表teacher,带有表结构和数据
create table teacher select user.host from mysql.user;
#拷贝student的表结构命名为emp表,不拷贝数据
create table emp like student;
查看表
show tables; #列出当前所在数据库的所有表
desc student; #查看student表的结构
select * from student; #查看student表内容
show table status\G #将所有表横着显示\G
show table status like 'emp' \G #查看单个表状态信息
select count(*) from student; #统计表里的记录数量
删除表
drop table student; #删除student表
增删改表DML
增加、插入insert
#1
insert into student (id,name,gender,age) values(1,'韦小升','M',20),(2,'魏晓声','M',22); #可同时多个
#into可不写,意为指定表
#第一个括号里的次序决定了第二个括号的次序
#values具体值,留意字符集和表结构赋值
#2
insert student set name='韦小升',gender='M',age=18
#3,将其他表信息导入新表里,表结构需相同
insert emp select * from student;
#当具体数值未知时可不写或者赋值null
insert ignore 会忽视数据库中已经存在的数据,根据主键或者唯一索引判断,如果数据库没有数据,就会插入新的数据,如果有数据的话就跳过这条数据
root:test> select * from t3;
+----+------+------+------+
| id | c1 | c2 | c3 |
+----+------+------+------+
| 1 | 1 | a | 1 |
| 2 | 2 | a | 1 |
| 8 | NULL | NULL | 1 |
| 14 | 4 | bb | NULL |
| 17 | 5 | cc | 4 |
+----+------+------+------+
5 rows in set (0.00 sec)
insert ignore into t3 (c1,c2,c3) values(5,'cc',4),(6,'dd',5);
root:test> select * from t3;
+----+------+------+------+
| id | c1 | c2 | c3 |
+----+------+------+------+
| 1 | 1 | a | 1 |
| 2 | 2 | a | 1 |
| 8 | NULL | NULL | 1 |
| 14 | 4 | bb | NULL |
| 17 | 5 | cc | 4 |
| 18 | 6 | dd | 5 |
+----+------+------+------+
6 rows in set (0.00 sec)
修改表update
update student set age = 19 where id = 4;
#指定表student,指定修改值set age = 19,指定修改哪一行或者哪一个目标where
#修改表student里的id为4的行的age值为19
删除delete
dekete from student; #删除整个student表
dekete from student where age >=20; #指定删除age的值>=20的行,序号会不连续,新添加值不会插在删除的行位置,而是在最下面继续递增,可update更改
防止误删除,添加条件才可删除
vim /etc/my.cnf
[mysql]
safe-updates
删除表中数据,但不会自动缩减数据文件的大小,释放表空间
OPTIMIZE TABLE stubent;
#清空表也会释放空间
TRUNCATE TABLE stubent;