首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >MySQL基础篇

MySQL基础篇

作者头像
趙卋傑
发布2026-01-12 15:02:13
发布2026-01-12 15:02:13
800
举报

1.MySQL数据库基础

(1)数据库的操作

创建
代码语言:javascript
复制
CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, 
create_specification] ...]
create_specification:
 [DEFAULT] CHARACTER SET charset_name
 [DEFAULT] COLLATE collation_name

说明:

  1. 大写的表示关键字(也可用小写表示)
  2. [] 是可选项
  3. CHARACTER SET: 指定数据库采用的字符集
  4. COLLATE: 指定数据库字符集的校验规则

例:创建名为 test 的数据库​

代码语言:javascript
复制
CREATE DATABASE test;

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

如果系统没有 test 的数据库,则创建一个名叫 test 的数据库,如果有则不创建

代码语言:javascript
复制
CREATE DATABASE IF NOT EXISTS test CHARACTER SET utf8mb4;

如果系统没有 test 的数据库,则创建一个使用utf8mb4字符集的 test 数据库,如果有则 不创建

代码语言:javascript
复制
CREATE DATABASE IF NOT EXISTS test CHARACTER SET utf8mb4;

说明:MySQL的utf8编码不是真正的utf8,没有包含某些复杂的中文字符。MySQL真正的utf8是 使用utf8mb4,建议使用utf8mb4(mysql自己创建的,在别的数据库上不能用)

在数据库中如何让关键字成为数据库名?

  • 加上英文状态下的反引号 ``
  • 确保是英文标点 键盘左上角,~这个键, 在esc下面,在tab 上面,在1的左边

比如创建一个数据库表示"订单"订单order order 也是sql 中的关键字. 此时就可以使用反引号来进行创建

代码语言:javascript
复制
create database `order`;
显示
代码语言:javascript
复制
SHOW DATABASES;
使用
代码语言:javascript
复制
use 数据库名;
删除
代码语言:javascript
复制
DROP DATABASE [IF EXISTS] test;

说明: 数据库删除以后,内部看不到对应的数据库,里边的表和数据全部被删除

(2)常用数据类型

数值类型

  1. 数值类型可以指定为无符号(unsigned),表示不取负数。
  2. 对于整型类型的范围: ①有符号范围:-2^(类型字节数*8-1)到2^(类型字节数*8-1)-1,如int是4字节,就 是-2^31到2^31-1 ②无符号范围:0到2^(类型字节数*8)-1,如int就是2^32-1 尽量不使用unsigned,对于int类型可能存放不下的数据,int unsigned同样可能存放不下
  3. 虽然TINYINT和SMALLINT更节省空间,但是还是更推荐使用INT或者BIGINT

浮点数 :FLOAT(M,D) DOUBLE(M,D)

MySQL这里也是遵守IEEE754标准,表示浮点数.Mysql这里也是遵守IEEE 754标准,表示浮点数。

很多时候,小数是不能精确存储和表示的,这就导致在进行某些计算的时候,会出现误差.也严禁使用两个浮点数进行比较相等

如果针对浮点数,要比较相等,需要作差,看差值是否小于一定的误差范围.(小于一定的范围,就可以认为是近似相等)

双精度:DECIMAL(M,D) NUMERIC(M,D)


上述谈到的类型,都是有符号的类型.(有正负号,能表示负数) C语言,也有一个概念,无符号类型unsigned 其实mysql的类型中也提供了"无符号"类型. 在mysql 官方文档中,明确说明了,不建议使用无符号类型,甚至无符号类型,未来的更高版本的 mysql中可能会被删掉... 无符号类型,弊大于利. 最大的问题,是两个个无符号类型,做减法的时候,容易出现溢出~~=>得到很大的整数. Java中没有无符号类型

字符串类型

varchar (SIZE) 可变长度字符串

mysql中表示字符串,有很多种类型.

char(SIZE)固定长度 char(50) =>这个类型(这一列)固定就是50个字符

varchar(SIZE)可变长 varchar(50) =>这个类型就是可变长的,最大是50字符

强调: varchar (SIZE)的单位,是字符,不是字节!! 尤其是在utf8这样的编码方式下,一个字符=好几个字节


TEXT 长文本数据

TEXT也是可变长的字符串,不需要指定最大长度,完全根据你存储的数据自适应.

虽然TEXT和varchar都是可变长但是实际使用的时候,还是更倾向于varchar.

varchar 可以指定最大长度,TEXT没法指定.(TEXT 就可能会很大,大小难以预估) varchar由于指定了最大长度,程序猿很容易预估出,表里面的数据量有多少


BLOB 二进制形式的长文本数据

BLOB 存储的是二进制的数据. 前面几个都是存储文本数据

日期类型

时间戳建议使用8字节版本

(3)表的操作

需要操作数据库中的表时,需要先使用该数据库:

代码语言:javascript
复制
use test;
创建表

创建表,列名在前,类名在后

代码语言:javascript
复制
create table test (id int,name varchar(20),height decimal(3,1));
查找表结构
代码语言:javascript
复制
desc test

说明: varchar(20)意思是最大长度是20个字符. 此处的11是"位宽" int在硬盘上存储,仍然是4个字节. 但是在控制台上显示的时候,最多显示11个字符这么宽


*注释

可以使用comment增加字段说明。

代码语言:javascript
复制
create table student(
    name varchar(20) comment '这是姓名',
    height decimal(4,1) comment '这是身高'
);
删除表
代码语言:javascript
复制
drop table test;
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...

2.表的增删改查

CRUD

在SQL中可以使用“--空格+描述”来表示注释说明 CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写。


新增(Create)

代码语言:javascript
复制
--基本语句:
insert into 表名 values (值,值...);

SQL中,表示字符串可以使用 ' 也可以使用 "

C/C++/Java,'表示字符,”表示字符串.

注意: 在进行插入操作时,尽量保证插入值的顺序和创建表时的顺序一致

这里失败的原因是将'张三'转换成decimal(4,1)类型失败了。 但是在SQL中是支持隐式类型转换的,上面的177.5,就可以成功插入,因为发生了隐式的自动转换

指定列插入
代码语言:javascript
复制
--基本语句:
insert into表名(列名,列名...)values(值,值....);

对应的id就是NULL,因为没有设定

可以进行指定列插入多个数据

代码语言:javascript
复制
insert into student(name) values ('王五'),('赵六');
一次插入多行
代码语言:javascript
复制
--基本语句:
insert into表名values(值,值...),(值,值...),(值,值...);
代码语言:javascript
复制
 insert into student values('lucy',166.5),('jack',177.5),('mack',180.0);
插入时间
代码语言:javascript
复制
-- 时间书写的固定形式
insert into test values( '2024-05-14 16:46:00' );

--now() ->获取到当前的时间日期
insert into test values(now());

查询(Retrieve)

全列查询
代码语言:javascript
复制
--基本语句:
--*称为"通配符",可以指代所有的列.

select * from表名;
指定列查询
代码语言:javascript
复制
--基本语句:
`select列名,列名..... from表名;
查询时指定表达式

简单地说就是列与列之间进行加减乘除运算

代码语言:javascript
复制
--身高加5
select height + 5 from student;

说明: 执行select就会遍历每一行,取出需要的列,把列代入到表达式中. 这样的结果,只是数据库查询过程中生成的"临时表",数据库本体(数据库服务器硬盘上的数据)是没有任何改变的~

指定别名
代码语言:javascript
复制
select height + 5 as height from student;
去重(Distinct)

这里的去重都是针对"临时表"硬盘上的数据没有任何影响.

代码语言:javascript
复制
--基本语法:
select distinct列名from表名;

多个条件去重时,必须都重复才会触发 去重

代码语言:javascript
复制
select distinct name,height from student;
排序(order by)

排序查询针对查询结果进行排序 查询的时候,指定按照某个列进行排序.也可以指定是升序还是降序

代码语言:javascript
复制
 --默认是升序排序
select * from order by height;

注意!!!数据库,不会对于查询得到的结果集的顺序,做出任何承诺,除非sql中包含order by (如果不写order,得到的结果的顺序,是不可预期的.....写代码就不能依赖这样的顺序) asc显式表示升序,asc可以省略~~ 排序,也是只是针对临时表结果进行排序,不会影响到硬盘上原始的数据


代码语言:javascript
复制
--降序排序
select * from student order by height desc;

此处desc是descend的缩写之前desc表名, describe 如果身高相同, 这几个记录的顺序,都是不可预期的


多个列之间,使用,分割 先按照第一列来排序.如果第一列相同,再按照第二列排序...


条件查询(where)

查询过程中,指定筛选条件,满足条件的记录就保留,不满足条件的就跳过.....

代码语言:javascript
复制
--基本语法:
select列名from表名where条件;

SQL中=表示相等,没有==运算符 <=>也是比较相等 能够针对NULL和NULL进行比较的. NULL <=>NULL=> true

基本查询
代码语言:javascript
复制
--身高<170的
select * from student where height < 170;

注意:这里的null不包含在内


and和or
代码语言:javascript
复制
--身高>170,名字叫mack的
select * from student where height > 170 and name = 'mack';

代码语言:javascript
复制
--身高>170,或者名字叫mack的
select * from student where height > 170 or name = 'mack';
范围查询
代码语言:javascript
复制
--身高在170~180之间的
select * from student where height between 170 and 180;

代码语言:javascript
复制
--满足身高是165.0或177.5的
select * from student where height in (165.0,177.5);
模糊查询like

不要求完全相等,只要满足一定的条件就可以了. 此处,还是需要搭配通配符,描述这样的条件.

  • %∶匹配0个或者任意个任意的字符.
  • _匹配1个特定的字符.

%在右边,表示查找以m开头的内容,m后可以有任意个字符

代码语言:javascript
复制
select * from student where name like 'm%';

查询中间包含a的,两边可以有任意个字符

代码语言:javascript
复制
select * from student where name like '%a%';

%在左边,表示k的前面有任意字符,k的后面就没有东西了

代码语言:javascript
复制
 select * from student where name like '%k'

代码语言:javascript
复制
 select * from student where name like 'm_';
分页查询(limit)
代码语言:javascript
复制
--基本语法:
select 列名 from 表名 limit N;

指定limit的时候,还可以搭配 offset来使用. offset表示是从下标为几这样的记录开始算limit

NULL 的查询
代码语言:javascript
复制
-- 查询 qq_mail 已知的同学姓名
SELECT name, qq_mail FROM student WHERE qq_mail IS NOT NULL;
-- 查询 qq_mail 未知的同学姓名
SELECT name, qq_mail FROM student WHERE qq_mail IS NULL;

修改(update)

代码语言:javascript
复制
--基本语法:
update表名set列名=值,列名=值...

upset的修改是真正在改变硬盘,这样的修改是持久有效的 where,order by,limit在此处也适用 指定update的时候,如果当前不指定任何条件,就会针对所有的行都能生效!!(把整个表都给改了)

代码语言:javascript
复制
--将姓名叫王五的身高改为155.5
update student set height = 155.5 where name = '王五';

删除(delete)

代码语言:javascript
复制
--基本语句:
DELETE FROM  table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]

把筛选出来的行删除掉. 这里的匹配,是匹配到几个就删除几个!!! 修改的是硬盘!!一旦删掉了,数据就无了!!!

代码语言:javascript
复制
delete from student where name = '123';
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.MySQL数据库基础
    • (1)数据库的操作
      • 创建
      • 显示
      • 使用
      • 删除
    • (2)常用数据类型
      • 数值类型
      • 字符串类型
      • 日期类型
    • (3)表的操作
      • 创建表
      • 查找表结构
      • *注释
      • 删除表
  • 2.表的增删改查
    • CRUD
    • 新增(Create)
      • 指定列插入
      • 一次插入多行
      • 插入时间
    • 查询(Retrieve)
      • 全列查询
      • 指定列查询
      • 查询时指定表达式
      • 指定别名
      • 去重(Distinct)
      • 排序(order by)
      • 条件查询(where)
    • 修改(update)
    • 删除(delete)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档