当前位置: 首页 > news >正文

MySQL库、表的操作

SQL分类

DDLdata definition language数据定义语言,用来维护存储数据的结构

代表指令: create, drop, alter

DMLdata manipulation language数据操纵语言,用来对数据进行操作

代表指令: insertdeleteupdate

DML中又单独分了一个DQL,数据查询语言,代表指令: select

DCLData Control Language数据控制语言,主要负责权限管理和事务

代表指令: grantrevokecommit

库的连接:

mysql -h [主机名] -P [端口号] -u [用户名] -p -A [数据库名]-h:指定要连接的 MySQL 服务器主机名,若连接本地数据库,可省略或写为 localhost。
-P:指定连接的端口号,MySQL 默认端口是 3306,如果使用默认端口,该参数也可省略。
-u:指定登录用户名。
-p:表示后续会提示输入密码,输入密码时不会回显。
-A:关闭自动补全表和列名等信息的功能。
[数据库名]:可选项,指定登录后默认进入的数据库。

1.库的操作

1.1.创建数据库

(1)语法

CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [,
create_specification] ...]create_specification:
数据库的创建规范,用于指定数据库的字符集和排序规则,可包含一个或多个规范(用逗号分隔)。
[DEFAULT] CHARACTER SET charset_name 
指定数据库的默认字符集(用于存储数据时的编码格式)。
[DEFAULT] COLLATE collation_name
指定数据库的默认排序规则(决定字符串比较和排序的规则),需与字符集匹配。

(2)案例

创建名为 db1 的数据库

create database db1;

当我们创建数据库没有指定字符集和校验规则时,系统使用默认字符集:utf8,校验规则是:utf8_ general_ c。

创建一个使用utf字符集,并带校对规则的 db2 数据库

create database db2 charset=utd8 collate utf8_general_ci创建数据库时指定字符集(charset)和排序规则(collate)时,带不带 = 都是允许的
charset 是 character set 的缩写形式

1.2.字符集和校验规则

(1)查看系统默认字符集以及校验规则

show variables like 'character_set_database';
show variables like 'collation_database';

(2)查看数据库支持的字符集
show charset;
字符集主要是控制用什么语言。比如utf8就可以使用中文。

(3)查看数据库支持的字符集校验规则
show collation;

(4)校验规则对数据库的影响

 - 是否区分大小写

创建一个数据库,校验规则使用utf8_ general_ ci[不区分大小写]

create database test1 collate utf8_general_ci;
use test1;
create table person(name varchar(20));
insert into person values('a');
insert into person values('A');
insert into person values('b');
insert into person values('B');
创建一个数据库,校验规则使用utf8_ bin[区分大小写]
create database test2 collate utf8_bin;
use test2
create table person(name varchar(20));
insert into person values('a');
insert into person values('A');
insert into person values('b');
insert into person values('B');

 - 进行查询

不区分大小写的查询以及结果

区分大小写的查询以及结果

如果是使用 apt(Debian、Ubuntu 等系统)或 yum(RHEL、CentOS 等系统)等包管理器安装,数据库文件通常在 /var/lib/mysql 目录下。

1.3.操纵数据库

1.3.1.查看数据库

(1)查看已经创建的数据库

show databases;

(2)查看指定数据库创建语句
show create database 数据库名;

Database 列:显示数据库名(此处为 test2)
Create Database 列:显示创建该数据库的完整语句,包含:
- 数据库名
- 字符集配置(DEFAULT CHARACTER SET utf8mb4)
 - /*!40100 default.... */ 这个不是注释,表示当前mysql版本大于4.01版本,就执行这句话

MySQL 建议我们关键字使用大写,但是不是必须的。

数据库名字的反引号``,是为了防止使用的数据库名刚好是关键字。

(3)查看数据库

在linux下,当使用 apt 或 yum等包管理器安装时,数据库文件通常在 /var/lib/mysql 目录下,每个数据库对应一个同名文件夹,其中保存着表结构文件、数据文件等。

在db.opt文件中保存着数据库使用的字符集和校验规则

1.3.2.修改数据库

ALTER DATABASE 数据库名
[DEFAULT] CHARACTER SET 字符集名称
[DEFAULT] COLLATE 排序规则名称;[DEFAULT] 可省略,不影响功能
主要能修改的是数据库的默认字符集和默认排序规则
实例: 将 mytest 数据库字符集改成 gbk

1.3.3.数据库删除

DROP DATABASE [IF EXISTS] db_ name;[IF EXISTS] 是一个可选参数,它的核心作用是避免因删除不存在的数据库而产生错误

执行删除之后的结果:
- 数据库内部看不到对应的数据库
- 对应的数据库文件夹被删除,级联删除,里面的数据表全部被删
注意:不要随意删除数据库

1.4.备份和恢复

备份

mysqldump -P3306 -u root -p 密码 -B 数据库名 > 数据库备份存储的文件路径

还原

mysql> source D:/mysql-5.7.22/mytest.sql;

在系统命令行(终端)中执行备份,在MySQL 客户端还原” 的操作

查看连接情况
show processlist;

可以告诉我们当前有哪些用户连接到我们的MySQL,如果查出某个用户不是你正常登陆的,很有可能你的数据库被人入侵了。以后大家发现自己数据库比较慢时,可以用这个指令来查看数据库连接情况。

2.表的操作

2.1.创建表

语法:

CREATE TABLE table_name (
field1 datatype,
field2 datatype,
field3 datatype
) character set 字符集 collate 校验规则 engine 存储引擎;

 - field 表示列名

 - datatype 表示列的类型

 - character set 字符集,如果没有指定字符集,则以所在数据库的字符集为准

 - collate 校验规则,如果没有指定校验规则,则以所在数据库的校验规则为准

create table users (
id int,
name varchar(20) comment '用户名',
password char(32) comment '密码是32位的md5值',
birthday date comment '生日'
) character set utf8 engine MyISAM;

不同的存储引擎,创建表的文件不一样。

users 表存储引擎是 MyISAM ,在数据目中有三个不同的文件,分别是:

users.frm:表结构

users.MYD:表数据

users.MYI:表索引

2.2.查看表

desc 表名;

2.3.修改表

在数据库的术语中,“列” 和 “字段” 是对表中同一类元素的不同称呼,本质上是同一个概念。

(1)添加列

ALTER TABLE 表名
ADD 列名 数据类型 [约束条件];

(2)修改列

ALTER TABLE 表名
MODIFY 列名 新数据类型 [新约束];

MODIFY:修改列的数据类型或约束(不修改列名)。
CHANGE:既可以修改列名,也可以修改数据类型和约束。

将name长度修改为60

alter table users modify name varchar(60);
name列修改为xingming
alter table employee change name xingming varchar(60);

(3)删除列

ALTER TABLE tablename DROP (column);
alter table users drop assets;

(4)重命名表

ALTER TABLE 旧表名 rename TO 新表名;
to可省略

2.4.删除表

ALTER TABLE 表名
DROP COLUMN 列名;  -- COLUMN 可省略
drop table t1;

3.数据类型

3.1.数值类型

3.2.1.int类型

 - 在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。

 - 可以通过UNSIGNED来说明某个字段是无符号的。

下面以tinyint类型为例,无符号tinyint类型的范围是: 0 - 255

mysql> create table datatype(num tinyint);
Query OK, 0 rows affected (0.02 sec)mysql> insert into datatype values(1);
Query OK, 1 row affected (0.01 sec)mysql> insert into datatype values(128);
ERROR 1264 (22003): Out of range value for column 'num' at row 1mysql> insert into datatype values(-128);
Query OK, 1 row affected (0.01 sec)mysql> select * from datatype;
+------+
| num  |
+------+
|    1 |
| -128 |
+------+
2 rows in set (0.00 sec)mysql> create table tt1(num tinyint unsigned);
Query OK, 0 rows affected (0.02 sec)mysql> insert into tt1 values(-1);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into tt1 values(255);
Query OK, 1 row affected (0.00 sec)mysql> select * from tt1;
+------+
| num  |
+------+
|  255 |
+------+
1 row in set (0.00 sec)

3.2.2.bit类型

bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1
bit字段在显示时,是按照ASCII码对应的值显示。
mysql> create table tt2 (id int, a bit(8));
ERROR 1046 (3D000): No database selected
mysql> use test1;
Database changed
mysql> create table tt2 (id int, a bit(8));
Query OK, 0 rows affected (0.02 sec)mysql> insert into tt2 values(10, 10);
Query OK, 1 row affected (0.00 sec)mysql> insert into tt2 values(10, 65);
Query OK, 1 row affected (0.00 sec)mysql> insert into tt2 values(10, 50);
Query OK, 1 row affected (0.01 sec)mysql> select * from tt2;
+------+------+
| id   | a    |
+------+------+
|   10 | |
|   10 | A    |
|   10 | 2    |
+------+------+
3 rows in set (0.00 sec)

3.2.3.小数类型

float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节

小数:float(4,2)表示的范围是-99.99 ~ 99.99MySQL在保存值时会进行四舍五入。

如果定义的是float(4,2) unsigned 这时,因为把它指定为无符号的数,范围是 0 ~ 99.99

mysql> create table tt3(id int, salary float(4,2));
Query OK, 0 rows affected (0.02 sec)mysql> insert into tt3 values(100, -99.99);
Query OK, 1 row affected (0.00 sec)mysql> insert into tt3 values(100, -99.991);
Query OK, 1 row affected (0.00 sec)mysql> insert into tt3 values(100, -99.995);
ERROR 1264 (22003): Out of range value for column 'salary' at row 1
mysql> select * from tt3;
+------+--------+
| id   | salary |
+------+--------+
|  100 | -99.99 |
|  100 | -99.99 |
+------+--------+
2 rows in set (0.00 sec)

3.2.4.decimal

decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数

decimal(5,2) 表示的范围是 -999.99 ~ 999.99

decimal(5,2) unsigned 表示的范围 0 ~ 999.99

decimalfloat很像,但是有区别,两者表示的精度不一样。

mysql> create table tt4(id int, salary1 float(10,2), salary2 decimal(10,2));
Query OK, 0 rows affected (0.02 sec)mysql> insert into tt8 values(100,23.12345612, 23.12345612);
ERROR 1146 (42S02): Table 'test1.tt8' doesn't exist
mysql> insert into tt4 values(100,23.12345612, 23.12345612);
Query OK, 1 row affected, 1 warning (0.00 sec)mysql> select * from tt4;
+------+---------+---------+
| id   | salary1 | salary2 |
+------+---------+---------+
|  100 |   23.12 |   23.12 |
+------+---------+---------+
1 row in set (0.00 sec)

float表示的精度大约是7位,decimal整数最大位数m为65,支持小数最大位数d是30。如果d被省略,默认为0。如果m被省略,默认是10。

3.2.字符类型char、varchar

char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
mysql> create table tt5(id int, name char(2));
Query OK, 0 rows affected (0.02 sec)mysql> insert into tt5 values(100, '中国');
Query OK, 1 row affected (0.00 sec)mysql> insert into tt5 values(100, 'china');
ERROR 1406 (22001): Data too long for column 'name' at row 1
mysql> select * from tt5;
+------+--------+
| id   | name   |
+------+--------+
|  100 | 中国   |
+------+--------+
1 row in set (0.00 sec)
mysql> create table tt6(id int, name varchar(6));
Query OK, 0 rows affected (0.02 sec)mysql> insert into tt6 values(100, 'china');
Query OK, 1 row affected (0.00 sec)mysql> insert into tt6 values(100, '我爱你,中国');
Query OK, 1 row affected (0.00 sec)mysql> select * from tt6;
+------+--------------------+
| id   | name               |
+------+--------------------+
|  100 | china              |
|  100 | 我爱你,中国       |
+------+--------------------+
2 rows in set (0.00 sec)

关于varchar(len),len到底是多大,这个 len 值,和表的编码密切相关:

 - varchar 长度可以指定为 0 到 65535 之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是65532。

 - 当我们的表的编码是 utf8 时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)。

char与varchar的比较

如何选择定长或变长字符串?
如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
定长的磁盘空间比较浪费,但是效率高。
变长的磁盘空间比较节省,但是效率低。
定长的意义是,直接开辟好对应的空间
变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少

3.3.日期类型

常用的日期有如下三个:
date:日期 'yyyy-mm-dd' ,占用三字节
datetime:时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节
timestamp:时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节

mysql> create table birthday(t1 date, t2 datetime, t3 timestamp);
Query OK, 0 rows affected (0.02 sec)mysql> insert into birthday(t1, t2) values('2005-02-24', '2009-03-25 10:11:29');
Query OK, 1 row affected (0.01 sec)mysql> select * from birthday;
+------------+---------------------+---------------------+
| t1         | t2                  | t3                  |
+------------+---------------------+---------------------+
| 2005-02-24 | 2009-03-25 10:11:29 | 2025-09-21 14:44:51 |
+------------+---------------------+---------------------+
1 row in set (0.00 sec)mysql> update birthday set t1 = '2015-1-18';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from birthday;
+------------+---------------------+---------------------+
| t1         | t2                  | t3                  |
+------------+---------------------+---------------------+
| 2015-01-18 | 2009-03-25 10:11:29 | 2025-09-21 14:46:09 |
+------------+---------------------+---------------------+
1 row in set (0.00 sec)

添加数据时,时间戳自动补上当前时间;更新数据,时间戳会更新 成当前时间

3.4.enum和set

enum:枚举,“单选”类型
enum('选项1','选项2','选项3',...)

enum(枚举) 是一种用于实现 “单选” 功能的字段数据类型,其核心作用是为字段限定一组固定的可选值,确保数据录入时只能从预设选项中选择其一。

set('选项值1','选项值2','选项值3', ...);

set(集合) 是一种支持 “多选” 功能的字段数据类型,核心作用是为字段预设一组可选值,允许单个单元格存储其中任意多个值(包括 1 个或多个);而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字1,2,4,8,16,32,.... 最多64个。

说明:不建议在添加枚举值,集合值的时候采用数字的方式,因为不利于阅读。

mysql> create table votes( username varchar(30), 
hobby set('足球', '篮球', '游泳'), gender enum('男', '女'));mysql> insert into votes values('张三', '足球,游泳', '男');mysql> insert into votes values('李四','篮球',2);mysql> insert into votes values('王五','足球,.篮球'1);mysql> insert into votes values('王五','篮球,游泳',1);mysql> select * from votes;
+----------+---------------+--------+
| username | hobby         | gender |
+----------+---------------+--------+
| 张三     | 足球,游泳     | 男     |
| 李四     | 篮球          | 女     |
| 王五     | 足球,篮球     | 男     |
| 王五     | 篮球,游泳     | 男     |
+----------+---------------+--------+

不能查询出所有,爱好为篮球的人

mysql> select * from votes where gender=1;
//使用数字标识的时候,就是正常的数组下标
+----------+---------------+--------+ 
| username | hobby         | gender |
+----------+---------------+--------+
| 张三     | 足球,游泳     | 男     |
| 王五     | 足球,篮球     | 男     |
| 王五     | 篮球,游泳     | 男     |
+----------+---------------+--------+
3 rows in set (0.00 sec)mysql> select * from votes where hobby='篮球';
+----------+--------+--------+
| username | hobby  | gender |
+----------+--------+--------+
| 李四     | 篮球   | 女     |
+----------+--------+--------+
1 row in set (0.00 sec)

set 类型支持通过数字匹配查询,但需严格遵循其底层 “选项 - 数字” 的映射规则(即选项按定义顺序对应 2⁰=1、2¹=2、2²=4、2³=8...)。

mysql> select * from votes where hobby & '2';
+----------+---------------+--------+
| username | hobby         | gender |
+----------+---------------+--------+
| 李四     | 篮球          | 女     |
| 王五     | 足球,篮球     | 男     |
| 王五     | 篮球,游泳     | 男     |
+----------+---------------+--------+
3 rows in set (0.00 sec)

集合查询使用find_ in_ set函数:

find_in_set(sub,str_list) :如果 sub str_list 中,则返回下标;如果不在,返回0; str_list 用逗号分隔的字符串。

mysql> select * from votes where find_in_set('篮球', hobby);
+----------+---------------+--------+
| username | hobby         | gender |
+----------+---------------+--------+
| 李四     | 篮球          | 女     |
| 王五     | 足球,篮球     | 男     |
| 王五     | 篮球,游泳     | 男     |
+----------+---------------+--------+
3 rows in set (0.00 sec)

http://www.dtcms.com/a/414170.html

相关文章:

  • FileProvider 配置必须针对 Android 7.0+(API 24+)做兼容
  • 混合止损策略在加密货币交易中的应用
  • Java模拟实现socket通信
  • iSCSI服务器
  • PyQt5 界面美化:从基础到高级的完整指南
  • 【Linux系列】让 Vim “跑”起来:实现一个会动的进度条
  • 上海商务网站建设wordpress 云相册
  • LLM - 构建AI智能体的完整指南:7步流程图与框架实战
  • springboot523基于Spring Boot的大学校园生活信息平台的设计与实现
  • Kubernetes 安全管理:认证、授权与准入控制全面解析
  • 江苏省住房城乡建设厅门户网站淄博企业网站
  • SpringBoot整合JakartaMail,实现发送邮箱功能
  • 开发 Flutter Windows 应用,如何安装工具链工具链和SDK
  • 杂记 10
  • 错误解决:Flutter找不到合适的Visual Studio 工具链
  • 基于KingbaseES集群管理实战:从部署运维到高可用架构深度解析
  • NXP - 用MCUXpresso IDE v25.6.136的工具链编译Smoothieware固件工程
  • 【影刀RPA】手机应用自动化
  • 有什么字体设计网站网站建设中的安全问题
  • 【开题答辩全过程】以 SpringBoot房屋出租管理系统为例,包含答辩的问题和答案
  • QT6中Column View与QUndoView功能与用法
  • Layui 使用
  • 如何优化 C# MVC 应用程序的性能
  • Uni-App 页面跳转监控实战:快速定位路由问题
  • Redisson的Lock和TryLock的区别
  • VLA技术论文阅读
  • find数组方法详解||Vue3 + uni-app + Wot Design(wd-picker)使用自定义插槽内容写一个下拉选择器
  • 怎么找做网站平台公司技术支持 湖北网站建设
  • 大型活动临时组网的技术解析:如何实现高效稳定的通信网络
  • 个人博客网站实验报告wordpress 页面新建