MySQL笔记 —— 基础(概念,对于数据库、表、数据的各种操作语句)

2023-11-07

关系型数据库

数据库与普通文件系统的区别在于,数据库拥有数据结构。数据库与普通的txt文件都能存储数据内容,但是数据库拥有数据结构,能够快速查找

而根据数据结构的不同,数据库又可以分为关系型数据库和非关系型数据库

关系型数据库:是指采用了关系模型来组织数据的数据库
关系模型有一对一,一对多,多对多等,关系模型指存储格式是以行列组成的二维表格,其以行和列的形式存储数据,一组行和列被称为一张表。一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织

非关系型数据库的模型有:

  1. 列模型:存储的数据是以列的形式存放的。比如学生信息,一个完整的学生信息是放在一个列中,一个列中可以有多个属性,不同列的属性数量可以不同
  2. 键值对模型:存储的数据是键值对的形式
  3. 文档类模型:用一个个的文档来存放数据

与列模型以一列为单位存储一条数据不同,关系型数据库是以行为单位来存储数据,一行是一条数据,而不同的列是不同的属性。

关系模型中常用的概念:
关系:一张二维表,每个关系都具有一个关系名,也就是表名
元组:二维表中的一行,在数据库中被称为记录
属性:二维表中的一列,在数据库中被称为字段
域:属性的取值范围,也就是数据库中某一列的取值限制
关键字:一组可以唯一标识元组的属性,数据库中常称为主键,由一个或多个列组成

MySQL就是关系型数据库

安装MySQL时,会安装MySQL的数据库服务器,数据库服务器实质上是一个数据库管理程序,这个管理程序可以管理多个数据库,一般会为每一个应用创建一个数据库。比如说,学校要存储学生和老师的信息,这两者的信息放在一起的话,既可能造成数据的重复冲突,也不利于数据的查询保管,因此分别为学生和老师各创建一个数据库。

而为了保存实体的数据,一般又会在数据库中创建多张表,表里面保存的是实际的数据
比如 10086 一纸春秋 18 男 爱好看书。像这样就是一条数据,里面有五个字段(属性)

具体的结构大概就像这样
在这里插入图片描述

使用MySQL,需要通过下面四种SQL语句

  • DDL 数据定义语言
    用来定义数据库的对象,比如数据表,视图,索引等
  • DML 数据处理语言
    在数据库表中更新、增加和删除记录,比如update、insert、delete
  • DCL 数据控制语言
    指用于设置用户权限和控制事务语句,比如grant,if-else,while等
  • DQL 数据查询语言,只有一个,那就是 select
创建、查看、删除数据库
  • 创建数据库 create database show1;
    在这里插入图片描述
  • 查询数据库的创建信息 show create database show1;
    在这里插入图片描述
  • 查看已经创建的数据库 show databases;
    在这里插入图片描述
  • 删除数据库 drop database show1;
    在这里插入图片描述
  • 创建数据库时指定编码格式 create database show1 character set utf8;
    在这里插入图片描述
  • 修改已经创建的数据库的编码格式 alter database show2 character set utf8;
    在这里插入图片描述
  • 另外创建数据库与删除数据库的时候,还可以加上条件判断。
    分别是if not exists如果不存在则创建 ,if exists 如果存在则删除
    在这里插入图片描述
    在这里插入图片描述
  • 切换数据库 use 数据库名
    在这里插入图片描述
  • 查看当前使用的数据库 select database();
    在这里插入图片描述

注意,MySQL中不允许修改数据库的名字

创建表、查询表、删除表
  1. 创建表
create table if not exists stu1(
	id int not null,
	name varchar(255) not null,
	age int not null,
	primary key(id)
)engine=innodb default charset=utf8;

定义一张表需要,表名,字段名,对每个字段的说明
像上面这个例子,stu1就是表名。id、name、age都是字段名。而字段名后面跟着的各个参数就是对字段的定义要求。

注意一般是int(11),varchar(255),int(11)可以简写为int,varchar(255)不能简写

对字段的定义要求又分为两个部分,第一部分是数据类型,第二种是各种参数

数据类型的类型具体可以到菜鸟驿站看
https://www.runoob.com/mysql/mysql-data-types.html

各种参数的含义:

  • not null的含义是禁止此字段的数据为空,为空则报错
  • AUTO_INCREMENT的含义是自增,比如给id字段加上这个,那么第一个学生的id是1000,如果第二个学生在输入数据时没有给定id值,id就会自动加一变成1001(通常是用在主键上,不能用在其他字段上)
  • primary key将列定义为主键,可以指定多个列为主键,列之间以逗号分隔
  • engine用于设置存储引擎,一般都设置为InnoDB
  • default charset 用于设置编码格式
    如果不设置编码格式,那么表的编码格式与所在数据库的编码格式保持一致
  1. 查询建表语句 show create table 表名;
    在这里插入图片描述
  2. 查询当前数据库下的所有表 show tables;
    在这里插入图片描述
  3. 删除表 drop table if exists 表名;
    在这里插入图片描述

在mysql的命令行模式敲习惯之后,其实会发现代码修改起来很麻烦,比如不小心回车到了下一行,那么发现上一行的代码出现了问题,也不能回去修改。所以在终端练习,练习完之后建议使用navicat,用图形化界面来操作mysql

在这里插入图片描述
使用navicat之间,先新建查询,然后输入

set @@global.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

然后选中这句话,右键执行选中的语句,然后断开连接再重新连接。完成后就可以正常写sql语句了。

新建查询,即可在这里输入代码,比如这里输入了一个建表语句

CREATE TABLE stu2 (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `sex` enum('0','1') DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8

这里与上面不同的是,使用了enum枚举作为数据类型,即输入数据时只能从0和1中选择,0和1分别表示男生和女生的意思

这里还设置了AUTO_INCREMENT=1001,表示自增序号从1001开始,之后每一条数据都会加1
在这里插入图片描述
创建表格成功

修改表结构
  • 修改表名:alter table 旧表名 to 新表名;
  • 添加字段:alter table 表名 add 字段 字段数据类型 属性;
  • 修改字段:alter table 表名 change 旧字段 新字段 数据类型 属性;
  • 修改字段:alter table 表名 modify 字段 数据类型 属性;
  • 删除字段:alter table 表名 drop 字段名;

注意:

  1. 可以将int类型改为varchar类型,但不能将varchar类型改为int类型
  2. 字符串需要用单引号包裹,数字不用
-- 修改表名
rename table stu2 to stu;
-- 添加字段
alter table stu add age int not null;
desc stu;
-- 修改字段的全部内容
alter table stu change name StudentName varchar(255) not null;
desc stu;
-- 修改字段的部分内容
alter table stu modify sex int not null;
desc stu;
-- 删除字段
alter table stu drop sex;
desc stu;

change 和 modify 的区别是change一次性修改所有内容包括字段名,而modify则是只修改数据类型和属性。

每次修改完,都可以用 desc 表名; 语句快速查询表格结构
在这里插入图片描述

最后修改完的表格结构就是上面这张图这样

在navicat里面运行语句时,可以将多个不相关的,结尾有;结束符的语句都选中,然后一起运行

插入数据

insert into 表名(字段1,字段2,……) values(值1,值2,……),(值1,值2,……)……;

当字段列表为全部字段时,可以简写为insert into 表名 values(字段值1,字段值2,……);

字段列表中可以给出表结构的全部字段,也可以只给出部分字段。后面的值就是对应位置的字段的值。比如字段列表是name,age,那么值就是’zhang’,12按位置顺序对应name和age。而只给出部分字段时,后面的值也要跳过此字段,然后结果默认填充为 null

注意:如果只给出部分属性,必须给出所有设置为not null的属性

-- 插入数据
-- 为了方便观察,这里新增一个属性sex,sex属性的值只能是0或1。
-- 然后将age设置为not null,插入值的时候才能跳过这个字段
alter table stu add sex enum('0','1') not null;
alter table stu modify age int default null;

-- 插入一条数据,新增一个属性sex,sex属性的值只能是0或1
insert into stu(id,StudentName,age,sex) values(10001,'zhang',18,'0');

-- 插入一条有空值的数据(age值为null)
insert into stu(id,StudentName,sex) values(10002,'chen','1');

-- 插入多条数据
insert into stu(id,StudentName,age,sex) values(10003,'qian',15,'0'),(10004,'cao',22,'1');

-- 快速插入一条数据
insert into stu values(10005,'sun',19,'0');

-- 最后用select查询表内数据
select * from stu;

在这里插入图片描述

删除数据

delete from 表名 where 字段=字段值;

-- 删除一条数据
delete from stu where id=10002;
select * from stu;

在这里插入图片描述
直接delete from 表名; 可以清空表里面的内容

修改数据

update 表名 set 字段名=字段值 where 字段号;

-- 修改一个字段
update stu set StudentName='liu' where id=10004;
-- 修改多个字段
update stu set StudentName='wang',age=80 where id=10005;

在这里插入图片描述

查询语句

就是之前用了很多次的 select 字段名 from 表名;

-- 查询一个表中的部分字段(查询全部数据用*)
select StudentName,age from stu;

在这里插入图片描述

-- 查询指定行的数据
select * from stu where StudentName='zhang';

在这里插入图片描述

执行select语句会生成一张虚拟表,这张表格并不是真实存在,查询语句结束输出结果后,就会消失。但是针对select语句生成的虚拟表,同样可以进行查询

-- 对虚拟表进行查询
select id,StudentName from(select * from stu as s2) as s1;

在这里插入图片描述
但是要注意的是,如果对虚拟表进行查询,那么必须给表取一个别名。被查询的虚拟表和显示结果的虚拟表都需要一个别名。

另外,显示的虚拟表中的列的顺序,是按照select语句选中的字段顺序来定的
比如 select StudentName,id,age from stu;
在这里插入图片描述
可以发现列的顺序改变了,StudentName的顺序在id的前面

where与having的区别
  1. where子句针对整个元数据表格,在聚合前筛选数据,执行顺序在group by和having子句前。而 having子句是对聚合后的一组数据进行筛选
  2. where子句中不能是有聚合函数,having子句中可以使用聚合函数

例子,按照性别分组,选择平均年龄大于20的那一组

-- 使用 where子句,会报错,错误信息Invalid use of group function
select * from stu1 where avg(age)>18 group by id;
-- 使用having子句,可以正常使用avg(age)进行筛选选择
select * from stu1 group by id having avg(age)>18;

这里的having用法其实就相当于求每个年龄大于18的学生,这是因为按id分组,每个组里面只有一条数据。
在这里插入图片描述

语句的执行顺序

查询时会主要用到的关键字大概有六个,书写时的顺序是
select —— from —— where —— group by —— having —— order by

但是实际执行的时候,是按照下面这个顺序执行的
from —— where —— group by —— having —— select —— order by

下面解释一下各个关键字:
from:选择具体查询哪个表的数据
where:针对表格数据进行筛选过滤的条件
group by:按照某个字段进行分组(比如性别只有0和1,group by sex后,结果就只有两行,一行sex为0,一行sex为1)
having:对已经分组的数据进行筛选
select:查看查询结果
order by:对select的查询结果进行排序

更加详细的执行顺序是:
from —— join on —— where —— group by(从这里开始,包括这里都可以使用select中的别名)
—— 聚合函数 —— having —— select —— distinct —— order by —— limit

别名

select id , StudentName as n from stu;
在这里插入图片描述
select id ,StudentName from stu as student;
在这里插入图片描述
关于表别名与字段别名的区别:
表别名只在执行查询时使用,返回结果中并不会显示,而给字段定义别名后,会返回给客户端显示,显示的字段名就是定义的别名。

子句中的运算符

在这里插入图片描述

select * from stu where age>20;

select * from stu where age BETWEEN 18 and 22;
select * from stu where age in (18,22);

select * from stu where StudentName like'z%';
select * from stu where StudentName like'l_';

select * from stu where id is null;
select * from stu where id is not null;

注意:

  1. between and 和 in的区别,between and是一个区间,只要是在18到22之间的数字都算。而 in 是列表,只有18和22两个数字满足要求,18和22之间的数字不算。
  2. like里面的 %是匹配任意多个字符,_ 是只匹配一个字符
  3. is null是选中所有该字段为null值的数据,is not null则相反,选中所有该字段不为空的数据

在这里插入图片描述 select * from stu; 初始为
在这里插入图片描述
逻辑运算符

  1. 使用and:select * from stu where StudentName=‘zhang’ and age=18;
    在这里插入图片描述
    and左右的两个条件都满足才选中这条数据

  2. 使用or:select * from stu where StudentName=‘zhang’ or age=18;
    在这里插入图片描述
    or 左右的条件只要满足一个就会被选中

  3. 使用not,select * from stu where not(age>20);
    在这里插入图片描述
    将条件反转

limit 分页

格式: limit 开始下标,长度;

select * from stu limit 0,3;

在这里插入图片描述
只显示前三行的数据

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL笔记 —— 基础(概念,对于数据库、表、数据的各种操作语句) 的相关文章

随机推荐

  • Knife4j 基础(OpenAPI3+SpringBoot2.7)

    1 Knife4j基础 OpenAPI3 SpringBoot2 7 本文按照官方文档 在 SpringBoot 2 7 项目中 集成 Knife4j 的 OpenAPI3 版本 2 官网 Knife4j官网 Knife4j在实现OpenA
  • adb shell后,getevent退出方法

    adb shell后 getevent退出方法 输入 exit 然后回车退出
  • ubuntu 下安装微软字体和 console

    https www cnblogs com feipeng8848 p 9649089 html 转载于 https www cnblogs com zach0812 p 11514680 html
  • SJTU简单路径数目

    Description 大家还记得邻接表类吗 没错 邻接表是表示稀疏图 边数比较少的图 的一种很好的数据结构 现在 我们要求使用深度优先遍历的思想 利用邻接表类 对给定的有向图 找出从指定结点start出发 长度为M的所有简单路径 简单路径
  • 超详细的卷积后大小的计算公式

    计算公式定义 定义几个参数 输入图片大小 W W 卷积核大小 F F 步长 S padding的像素数 P 于是我们可以得出计算公式为 N W F 2P S 1 输出图片大小为 N N 以resnet50为例 输入为 1 3 224 224
  • 手机耳机怎么在电脑上说话_手机耳机怎样当做电脑麦克风?

    首先 这篇文章讲的是有绿粉两个颜色的耳机 麦克接口的电脑 方法一 某宝9 9一条耳机一分二分线器进行解决 注意默认录音设备是否设置对了 方法二 玄学声卡 某些电脑的自带声卡很神奇 可以玄学逆转电流 就比如我家电脑 只要把手机耳机 单线耳机
  • Hive启动报错(个人遇到问题&解决方法)

    hive执行sql报错 FAILED SemanticException org apache hadoop hive ql metadata HiveException java lang RuntimeException Unable
  • C++ 代码换行

    1 字符串太长 换行显示 怎么办 2 使用反斜杠 如下 string str abcd 1234 注意 反斜杠后面不准有任何字符 下一行开头的制表符不包含在整个字符串中 但是下一行开头的空格符包含在整个字符串中 3 使用双引号 如下 str
  • 浅谈关于QT中Webkit内核浏览器

    关于QT中Webkit内核浏览器是本文要介绍的内容 主要是来学习QT中webkit中浏览器的使用 提起WebKit 大家自然而然地想到浏览器 作为浏览器内部的主要构件 WebKit的主要工作是渲染 给定一个HTML文件 WebKit的工作是
  • linux设备管理之设备号与次设备号

    linux设备管理之主设备号与次设备号 jinzi 博客园 剽窃 过来的 记录下 以备查 主设备号和次设备号 一个字符设备或者块设备都有一个主设备号和次设备号 主设备号和次设备号统称为设备号 主设备号用来表示一个特定的驱动程序 次设备号用来
  • 使用 Python 对股票数据分析预测

    使用 Python 对股票数据分析预测 文章目录 使用 Python 对股票数据分析预测 目录索引 模块安装 股票数据获取 雅虎财经 Quandl 模块 Pandas Datareader 模块 数据预处理 缺失值查找 数据规范化 股价涨跌
  • 前端埋点VS后端埋点

    前端埋点比后端埋点更灵活 比如页面停留时间 点击下拉框动作等都可以通过埋点接口让后端记录下来 而后端埋点 这些是记录不下来的 因为没有请求 后端埋点还有一个问题 有可能前端不同按钮调用后端同一个接口 此时后端埋点是区分不出来的 后端埋点又分
  • 代码习惯

    补个liangs333的代码习惯 include
  • 全面 Serverless 化,阿里云微服务引擎 MSE 重磅升级

    微服务已成为企业数字化首选的应用架构 并正在向缩短服务的构建周期和降低资源成本 提升架构质量和架构效率两个方向演进 今天 阿里云正式宣布微服务引擎 MSE 重磅升级 全面 Serverless 化 带来两大新形态和两大新体验 产业新形态 业
  • [Android AIDL系列 1] 手动编译aidl文件,生成Java、C++[android]、C++[ndk]、Rust接口

    AIDL文件在Android系统上应用广泛 和底层的Binder机制紧密关联 在Android源码或者Android Studio中通常是自动编译aidl文件 生成对应语言的接口文件 做应用层Java开发 aidl和binder封装的比较
  • centos7虚拟网卡其他服务器不识别,Vmware10 下安装centos7,网卡无法识别问题处理...

    问题表现 之前安装的是32位版本的centos5 后来操作不当损坏 于是安装了64位版本的centos7 安装后网卡无法识别 用如下第一种方式顺利解决 网络连接使用nat方式 由于Vmware虚拟网卡和linux兼容问题导致驱动无法正常安装
  • Retrofit+OKHttp+RxAndroid,图文最详细解释(Kotlin)

    文章目录 一 Retrofit 1 上图说明了如下几点 2 Retrofit 对Okhttp做了什么 3 下面我们来看一下Retrofit的具体使用 1 导入依赖 module build gradle下 2 添加网络权限 src main
  • mac iterm2快捷键

    mac iterm2快捷键 1 命令一 查找 Cmd f 自动完成 Cmd 命令历史 Cmd Shift H
  • vue 组件同页面多次调用 props 传值无效

    项目场景 在同一个编辑页面使用了同一个Vue组件 导致props 传值无效 问题描述 在做一个文章编辑的页面 需要通过切换文章类型 音频 视频 显示隐藏上传不同类型的按钮给用户上传 例如以下代码会出现一个奇怪的问题 当我从article m
  • MySQL笔记 —— 基础(概念,对于数据库、表、数据的各种操作语句)

    目录 关系型数据库 创建 查看 删除数据库 创建表 查询表 删除表 修改表结构 插入数据 删除数据 修改数据 查询语句 where与having的区别 语句的执行顺序 别名 子句中的运算符 limit 分页 关系型数据库 数据库与普通文件系