【MySQL】MySQL的介绍及基础操作

文章目录

  • 1.数据库的介绍
    • 1.1 什么是数据库
    • 1.2 数据库的分类
    • 1.3 数据库的连接
    • 1.4 SQL分类
    • 1.5 MySQL整体结构
  • 2. 数据库的操作
    • 2.1 显示当前数据库
    • 2.2 创建数据库
    • 2.3 使用数据库
    • 2.4 删除数据库
    • 2.5 常用数据类型
      • 2.5.1 数值类型
      • 2.5.2 字符串类型
      • 2.5.3 日期类型
    • 2.6 表的操作
      • 2.6.1 创建表
      • 2.6.2 查看表
      • 2.6.3 查看表结构
      • 2.6.4 删除表
  • 3.MySQL表的增删查改(基础)
    • 3.1 新增(Create)
      • 3.1.1 单行数据 + 全列插入
      • 3.1.2 单行数据 + 指定列插入
      • 3.1.3 单行数据 + 全列插入
      • 3.1.4 多行数据 + 指定列插入
    • 3.2查询(Retrieve)
      • 3.2.1 全列查询
      • 3.2.2 指定列查询
      • 3.2.3 查询字段为表达式
      • 3.2.4 别名
      • 3.2.5 去重 (distinct)
      • 3.2.6 排序查询 (order by)
      • 3.2.7 条件查询
    • 3.3 修改(Update)
    • 3.4 删除(Delete)

本节目标

  • 数据库的介绍
  • 数据库的基础操作

1.数据库的介绍

1.1 什么是数据库

我们平常使用文件就可以保存数据了,为什么还要整个数据库呢?

那就要说到文件存储数据的缺点了:

  • 文件存储安全性差
  • 文件不利于存储大量数据
  • 文件存储不利于管理和查询
  • 文件在程序控制中不方便

文件存储和数据库存储数据的存储介质是磁盘和内存中,但是数据能够更加有效的管理数据,数据库可以提供远程服务,即提供远程连接来使用数据库,因此也称为数据库服务器.

1.2 数据库的分类

数据库大体可以分为 关系型数据库非关系型数据库

  • 关系型数据库

是指采用了关系模型来组织数据的数据库. 简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织 , 基于标准的SQL,只是内部一些实现有区别。常用的关系型数据库如:

  1. Oracle:甲骨文产品,适合大型项目,适用于做复杂的业务逻辑,如ERP、OA等企业信息系
    统。收费。
  2. MySQL:属于甲骨文,不适合做复杂的业务。开源免费。
  3. SQL Server:微软的产品,安装部署在windows server上,适用于中大型项目。收费
  • 非关系数据库

不规定基于SQL实现。现在更多是指NoSQL数据库,如 :

  1. 基于键值对(Key-Value):如 memcached、redis
  2. 基于文档型:如 mongodb
  3. 基于列族:如 hbase
  4. 基于图型:如 neo4j

关系型数据库与非关系型数据库的 区别

关系数据库 非关系数据库
使用SQL 不强制要求,一般不基于SQL实现
事务支持 支持 不支持
复杂操作 支持 不支持
海量读写操作 效率低 效率高
基本结构 基于表和列,结构固定 灵活性比较高
使用场景 业务方面的OLTP系统 用于数据的缓存,或基于统计分析的OLAP系统

注:OLTP(On-Line Transaction Processing)是指联机事务处理,OLAP(On-Line Analytical Processing)是指联机分析处理

1.3 数据库的连接

当我们安装配置好数据库后,MySql默认只允许本机服务器,使用root账户访问,如果要设置为任意ip都可以访问,按照下面操作进行

// 1.在本地服务器命令行中输入 
mysql -u root -p
//2.如果有密码则输入后回车进入
//3.使用数据库
use mysql
//4.更新用户表的root账户,设置为任意ip都可以访问,密码修改为原root密码
update user set host="%",authentication_string=password('root') where user="root";
//5.刷新权限
flush privileges;
//6.退出
quit

1.4 SQL分类

  • DDL数据定义语言,用来维护存储数据的结构

​ 代表指令: create, drop, alter

  • DML数据操纵语言,用来对数据进行操作

​ 代表指令: insert,delete,update

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

  • DCL数据控制语言,主要负责权限管理和事务

    代表指令: grant,revoke,commit

1.5 MySQL整体结构

一. MySQL分为客户端和服务器

  • 客户端: 和用户进行交互(客户端有很多版本,命令行,图形化界面…)
  • 服务器: 用于数据的保存,处理,管理.

客户端和服务器之间是通过网络进行通信,那么有一个问题,现在一台服务器和客户端都在同一机器上,但是该机器没有联网,为什么客户端还可以访问服务器呢?

因为网卡和操作系统虚拟出来一个特殊的网卡,“环形网卡”,所以可以访问自己的主机上的服务器,只不过由于没有网络,访问不到其他主机.

二. MySQL内部组织数据结构

【MySQL】MySQL的介绍及基础操作_第1张图片

2. 数据库的操作

2.1 显示当前数据库

show databases;

【MySQL】MySQL的介绍及基础操作_第2张图片

2.2 创建数据库

create database 数据库名;

【MySQL】MySQL的介绍及基础操作_第3张图片

2.3 使用数据库

use 数据库名;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EZNQwG9b-1657611189706)(C:\Users\a\AppData\Roaming\Typora\typora-user-images\image-20220711154137070.png)]

2.4 删除数据库

drop database 数据库名;

在这里插入图片描述

2.5 常用数据类型

2.5.1 数值类型

数据类型 大小 说明 对应Java类型
bit[(M)] M指定位数,默认为1 二进制数,M范围从1到64, 存储数值范围从0到2^M-1 常用Boolean对应BIT,此时 默认是1位,即只能存0和1
tinyint 1字节 Byte
smallint 2字节 Short
int 4字节 Integer
bigint 8字节 Long
float(M,D) 4字节 单精度,M指定长度,D指定 小数位数。会发生精度丢失 Float
double(M, D) 8字节 Double
decimal(M,D) M/D最大值+2 双精度,M指定长度,D表示 小数点位数。精确数值 BigDecimal
Decimal M/D最大值+2 BigDecimal

相关资料:

  1. 1字节(byte) = 8bit

  2. 对应整型范围:

    2.1 有符号范围:-2^(类型字节数*8 - 1) ~2^(类型字节数 *8 - 1) - 1;比如int为4字节,范围为-2^31 ~ 2^31 -1

    2.2 无符号范围:0到2 ^(类型字节数* 8)-1,如int就是2^32-1

  3. SQL语言比Java早诞生,那时候编程界对类型的命名没有一个统计的约束.

  4. 浮点数按照IEEE754标准,规定浮点数如何存储.例如计算0.3+0.2结果不是0.5

  5. Decimal相当于通过字符串的方式来表示浮点数,优势能够精确表示,精确计算;但是劣势是计算消耗时间更多,存储的空间也更多,所以是特别需要才使用它.

  6. 数据类型不区分大小写.

2.5.2 字符串类型

数据类型 大小 说明 对应java类型
varchar(size) 0-65,535字节 可变长度字符串 String
text 0-65,535字节 长文本数据 String
mediumtext 0-16 777 215字节 中等长度文本数据 String
blob 0-65,535字节 二进制形式的长文本数据 byte[]

相关资料:

  1. BLOB中存储的二级制数据,它上面三个存储的是文本数据
  2. vachar(20),表示这个字段最多存20个字符,有可能是更短的,动态开辟根据存入的数据长度来适应空间.
  3. 字符和字节有本质的区别,一个字节是8比特位,字符取决于具体的编码规则,比如Java中默认使用的是unicode编码,其具体的大小需要大家自行网上查询

2.5.3 日期类型

数据类型 大小 说明 对应Java类型
datatime 8字节 范围从1000到9999年,不会进行时区的 检索及转换 java.util.Date、 java.sql.Timestamp
timestamp 4字节 范围从1970到2038年,自动检索当前时 区并进行转换。 java.util.Date、 java.sql.Timestamp

2.6 表的操作

2.6.1 创建表

在创建表时,需要指明在哪一个数据库中创建,使用要使用:

use 数据库名;

接下来就是创建表:

create table 表名 (列名 类型, 列名 类型 ...)

注意:

  1. 在创建表时,需要明确表结构,明确每一列的类型及名称.
  2. 不可以使用SQL关键字作为表名或者列名,如果非要使用,可以使用反引号`引起来.也就是esc下面的那个.

​ 例使用关键字show:

在这里插入图片描述

​ 处理方法,加反引号:

  1. 在同一个数据库中不能出现相同名字的表

在这里插入图片描述

  1. 在建表时,如果没有;的时候按下回车键,mysql客户端就视为当前sql没有写完,给你换行了,但是你一旦写错了,就回不去了,所以建议大家使用其他的编辑器,比如记事本,idea…然后复制粘贴过来.
  2. 可以使用comment增加字段说明 ,或者-- 注释内容 (两个横线,加一个空格,后面接注释内容)

在这里插入图片描述

show create table 表名;

【MySQL】MySQL的介绍及基础操作_第4张图片

2.6.2 查看表

查看当前数据库中有那些表:

show tables;

【MySQL】MySQL的介绍及基础操作_第5张图片

2.6.3 查看表结构

查看这个表里面的列和类型

desc 表名;

【MySQL】MySQL的介绍及基础操作_第6张图片

2.6.4 删除表

drop table 表名;

3.MySQL表的增删查改(基础)

所谓的增删查改就是CRUD : Create(增加), Retrieve(查询),Update(更新),Delete(删除).

3.1 新增(Create)

3.1.1 单行数据 + 全列插入

insert into 表名 values (值, 值, ...);

3.1.2 单行数据 + 指定列插入

insert into 表名 (列名) values (值);

在这里插入图片描述

注意: 其他没有指定的列,其值为默认值;

3.1.3 单行数据 + 全列插入

insert into 表名 values (值, 值..);

在这里插入图片描述

注意: value_list 数量必须和定义表的列的数量及顺序一致

3.1.4 多行数据 + 指定列插入

insert into 表名(列名,列名..) values (值, 值..);

注意:

  1. 括号里面的值要和表中数据类型相匹配,否则会报错;

  2. 在SQL中表示字符串’ ’ 和"" 具有等价关系:

【MySQL】MySQL的介绍及基础操作_第7张图片

  1. MySql中默认字符集为拉丁文,不支持中文,为了能够存储中文,所以要把字符集改为UTF-8.
  2. 每次在客户端中输入的命令sql指令,都是通过网络来运输的,在插入向表中插入数据时,如果是一次一次的插入,就会有多次请求/响应;如果是一次插入多条,那么一个请求/响应就够了.

【MySQL】MySQL的介绍及基础操作_第8张图片

3.2查询(Retrieve)

--创建表
create table exam_result (
        id int,
        name varchar(20),
        chinese decimal(3.1),
        math decimal(3,1),
        english decimal(3,1)
     );
    
--插入测试数据
insert into exam_result (id, name, chinese, math, english) values
   (1,'唐三藏', 67.0, 98.0, 56.0),
   (2,'孙悟空', 87.5, 78.0, 77.0),
   (3,'猪悟能', 88.0, 98.5, 90.0),
   (4,'曹孟德', 82.0, 84.0, 67.0),
   (5,'刘玄德', 55.5, 85.0, 45.0),
   (6,'孙权', 70.0, 73.0, 78.5),
   (7,'宋公明', 75.0, 65.0, 30.0);

3.2.1 全列查询

select * from 表名;

【MySQL】MySQL的介绍及基础操作_第9张图片

注:

  1. *是通配符,代表匹配任意的列.
  2. select操作返回的这张表格是一张’临时表’,也就是说无论怎么操作都不会影响数据库中原有的数据.
  3. 在数据量大的情况下,服务器需要先读取磁盘,把这些数据都查询出来,再通过网卡把数据传输给客户端,由于数据量十分大,极有可能把C盘IO吃满,或者把网络带宽吃满,最直观的感受是十分卡,如果是生产环境的服务器,会导致该服务器卡顿,从而影响到用户的体验,可以按ctrl + c 来中断.所以不建议使用这个方法来查询

3.2.2 指定列查询

select 列名,列名... from 表名;

【MySQL】MySQL的介绍及基础操作_第10张图片

注:

  1. 用这种方法查询,会极大减少占用C盘和网络带宽.

3.2.3 查询字段为表达式

在查询的时候带有表达式,让查询结果进行一些计算.

-- 表达式不包含字段
select id, name, 10 from exam_result;

【MySQL】MySQL的介绍及基础操作_第11张图片

注意事项:

当10输入进去是sql会在数据库中查询列名为10的列,有则输出,没有也会输出10,因为10本来就是一个表达式

-- 表达式包含一个字段
 select name, chinese + 10 from exam_result;

【MySQL】MySQL的介绍及基础操作_第12张图片

-- 表达式包含多个字段
 select name, chinese + math + english from exam_result;

【MySQL】MySQL的介绍及基础操作_第13张图片

注意事项:

  1. 如果表达式结果超出列类型的范围,不会影响到什么,因为它是临时表如:

    1.1 【MySQL】MySQL的介绍及基础操作_第14张图片

    1.2 如果我们向原表中插入超出范围的数据是不行的.

  2. 字符串和数值进行运算会出现报错或者警告:

​ 2.1 【MySQL】MySQL的介绍及基础操作_第15张图片

​ 2.2 可以使用

show warnings; 查看警告信息

【MySQL】MySQL的介绍及基础操作_第16张图片

3.2.4 别名

--由于表达式的名称太复杂,所以可以使用起一个别名来表示它
select name, chinese + math + english as total from exam_result;

【MySQL】MySQL的介绍及基础操作_第17张图片

3.2.5 去重 (distinct)

这里有两个数学成绩相同的:

【MySQL】MySQL的介绍及基础操作_第18张图片

--这时候就可以去重查询,会把查询结果相同的合并为一行
select distinct 列名 from 表名;

【MySQL】MySQL的介绍及基础操作_第19张图片

distinct后面可以指定多个列,那么此时只有列结果全部相同时,才会去重;

【MySQL】MySQL的介绍及基础操作_第20张图片

现在插入一段相同数据

insert into exam_result values (8, '唐三藏',67.0,98.0, 56.0);

然后多条件去重;

select distinct name, math from exam_result;

【MySQL】MySQL的介绍及基础操作_第21张图片

3.2.6 排序查询 (order by)

在查询过程中,对查询的结果进行排序;

select 列名 from 表名 order by 列名;
-- asc 为升序 (从小到大)
-- desc 为降序(从大到小)
-- 默认比较asc

注意事项:

​ 1.使用表达式及别名排序

​ 1.1 不使用别名版

【MySQL】MySQL的介绍及基础操作_第22张图片

​ 1.2 使用别名版

【MySQL】MySQL的介绍及基础操作_第23张图片

  1. 有null数据排序时

​ 1.1 null数据排序,视为比任何值都小,升序出现在最上面,降序出现在最下面

【MySQL】MySQL的介绍及基础操作_第24张图片
【MySQL】MySQL的介绍及基础操作_第25张图片

​ 1.2 在表达式求值并排序时,任何数据与其结果是null

【MySQL】MySQL的介绍及基础操作_第26张图片

  1. 当指定多个列排序时,排序优先级按照书写顺序;也就是说先按照第一个为基准排序,如果不分胜负,就按照下一个进行比较

【MySQL】MySQL的介绍及基础操作_第27张图片

​ 这里的math三个人相同,然后按照chinese降序比较(不行默认为降序).

3.2.7 条件查询

比较运算符:

运算符 说明
>, >=, <, <= 大于,大于等于,小于,小于等于
= 等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL,相当于false
<=> 等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1)
!=, <> 不等于
between a0 and a1 范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1)
in(option) 如果是 option 中的任意一个,返回 TRUE(1)
is null 是 NULL
is not null 不是 NULL
like 模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符

逻辑运算符 :

运算符 说明
and 多个条件必须都为 TRUE(1),结果才是 TRUE(1)
or 任意一个条件为 TRUE(1), 结果为 TRUE(1)
not 条件为 TRUE(1),结果为 FALSE(0)

案例:

  • 基本查询
-- 查询英语不及格的同学及英语成绩 ( < 60 )
 select name, english from exam_result where english < 60;

【MySQL】MySQL的介绍及基础操作_第28张图片

-- 查询语文成绩好于英语成绩的同学
select name, chinese, english from exam_result where chinese > english;

【MySQL】MySQL的介绍及基础操作_第29张图片

-- 查询总分在 200 分以下的同学
 select name, chinese+math+english as total from exam_result where chinese + math + english < 200;

【MySQL】MySQL的介绍及基础操作_第30张图片

注:where中可以使用表达式,不可以使用别名.

  • and与or
-- 查询语文成绩大于80分,且英语成绩大于80分的同学
select name, chinese,english from exam_result where chinese > 80 and english > 80;

-- 查询语文成绩大于80分,或英语成绩大于80分的同学
select name, chinese,english from exam_result where chinese > 80 or english > 80;

【MySQL】MySQL的介绍及基础操作_第31张图片

-- and 和 or 的优先级
 select * from exam_result where chinese > 80 or math > 70 and english > 70;

【MySQL】MySQL的介绍及基础操作_第32张图片

结论: and的优先级比or高, 也就是说在表达式中优先判断and,如果不满足则判断or的另一个条件

-- 加() 后改变运算顺序
select * from exam_result where( chinese > 80 or math > 70) and english > 70;

【MySQL】MySQL的介绍及基础操作_第33张图片

  • 范围查询

    1. between …and…
-- 查询语文成绩在 [80, 90] 分的同学及语文成绩
select name, chinese from exam_result where chinese between 80 and 90;

【MySQL】MySQL的介绍及基础操作_第34张图片

-- 也可以使用and实现
 select name, chinese from exam_result where chinese >= 80 and chinese <= 90;

【MySQL】MySQL的介绍及基础操作_第35张图片

注:between…and… 是闭区间

  1. in
-- 查询数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
 select * from exam_result where math in (58, 59, 98, 90);

【MySQL】MySQL的介绍及基础操作_第36张图片

-- 使用 OR 也可以实现
 select * from exam_result where math = 58 or math = 59 or math = 98 or math = 90;

【MySQL】MySQL的介绍及基础操作_第37张图片

  • 模糊查询(like)
-- % 匹配任意多个(包括 0 个)字符
select name from exam_result where name like '孙%';

【MySQL】MySQL的介绍及基础操作_第38张图片

类似的: %孙 -> 匹配以孙结尾的数据; %孙% -> 匹配包含孙的数据; % -> 匹配所有数据.

-- _ 匹配严格的一个任意字符
select name from exam_result where name like '孙_';

【MySQL】MySQL的介绍及基础操作_第39张图片

类似的: 孙_ -> 匹配一个任意字符; 孙__ -> 匹配两个任意字符

  • null的查询
-- 查询语文成绩为null

-- = 是不能够正确筛选
select * from exam_result where chinese = null;
-- <=> 可以正确筛选
select * from exam_result where chinese <=> null;
-- 也可以用 is null 来正确筛选
select * from exam_result where chinese is null;

【MySQL】MySQL的介绍及基础操作_第40张图片

  • 分页查询
-- 起始下标是0, offset是偏移量,相对于起始位置的偏移量. limit限制返回的结果条数

-- 从 0 开始,筛选 n 条结果 
select 列名 from 表名 limit n;
-- 从 m 开始,筛选 n 条结果 ,建议使用写法1 更直观
写法1: select 列名 from 表名 limit n offset m;
写法2: select 列名 from 表名 limit m, n; 

【MySQL】MySQL的介绍及基础操作_第41张图片

limit可以可where,order by等子句搭配使用,查询总成绩前4位

【MySQL】MySQL的介绍及基础操作_第42张图片

3.3 修改(Update)

语法:

update 表名 set 列名 = 值 , 列名 = 值...where 子句 order by 子句 limit 子句
-- 将孙悟空同学的数学成绩变更为 80 分
update exam_result set math = 80 where name = '孙悟空';

【MySQL】MySQL的介绍及基础操作_第43张图片

-- 将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分
 update exam_result set math = 80, chinese = 70 where name = '曹孟德';

【MySQL】MySQL的介绍及基础操作_第44张图片

-- 将总成绩倒数前三的 3 位同学的数学成绩加上 30 分

修改前:

【MySQL】MySQL的介绍及基础操作_第45张图片
修改后:
【MySQL】MySQL的介绍及基础操作_第46张图片

注:

  1. 由于这里的修改会改变真正改变数据库中的数据,所以在修改时注意范围,否则会报错

  1. 这里没有像java,c++中,可以简写 a += 10 ;在MySQL中只能 写作 a = a + 10;
-- 将所有同学的语文成绩更新为原来的 0 倍
update exam_result set chinese = 0;

【MySQL】MySQL的介绍及基础操作_第47张图片

3.4 删除(Delete)

delete from 表名 where 条件;
-- 删除孙悟空同学的考试成绩
delete from exam_result where name = '孙悟空';

【MySQL】MySQL的介绍及基础操作_第48张图片

-- 删除整张表,只是数据清空
 delete from exam_result;

【MySQL】MySQL的介绍及基础操作_第49张图片

你可能感兴趣的:(MySQL,mysql,数据库)