MySQL:基础知识以及增删改查基本操作

1. 数据库类型

  • 关系型数据库(MySQL、Oracle、SQL Server、SQLite)

    关系型数据库,对于存储数据的格式,有非常严格的要求,大体上可以认为是通过"表格"(Excel) “这样的方式来组织的,每一行都是一条数据.

    每一行中都包含很多列,每个列还会有不同的类型,数据库中的所有数据,列数/类型/含义都要能够匹配

  • 非关系型数据库(Redis、MongoDB、HBase)

    对于数据的格式上要求比较松散,往往是按照键值对/文档的形式来进行组织,更适合在分布式的场景中使用

MySQL、Oracle、SQL Server、SQLite、MongoDB、HBase使用硬盘存储数据,Redis使用内存存储数据

2. MySQL

MySQL是一个”客户端-服务器“结构的程序

  • 客户端(client):主动发起请求的一方
  • 服务器(server):被动接受请求的一方
  • 请求(request):客户端主动给服务器发的数据
  • 响应(response):服务器给客户端返回的数据

大数据的核心技术体系:hadoop底层是通过JAVA实现的

人工智能中的核心组件是通过C++构建的

一个MySQL服务器上,可以有多个数据库,每个数据库里可以有多个数据表,每个数据表里,可以有很多行,每个行可以有很多列

3. 数据库操作

//1.查看现有的数据库
show databases;
//2.创建数据库
create database 数据库名字;
create database `SQL中的关键字`; //使用SQL中的关键字作为数据库名,使用反引号`
create database 数据库名 charset 字符集名; //utf8、GBK

GBK:使用2个字符表示一个汉字

UTF8:变长编码,对于汉字来说,一般是3个字节

MySQL的utf8并不是完全体,不包含emoji,可以使用utf8mb4

//3.使用数据库
use 数据库名;
//4.删除数据库
drop database 数据库名;

防止出现删库造成太大的影响:

  • 控制好权限:MySQL自身支持丰富的权限配置功能,根据你的账号,你能够进行哪些操作都是有明确限制的
  • 备份:重要的数据多备份几份

工作环境:

  • 办公环境
  • 开发环境:服务器
  • 测试环境:类似于开发环境
  • 生产环境(线上环境):程序放到上面,就可以被外面的用户真实访问到

把程序发布到生产环境上,这个过程就称为“上线”

4. 数据类型

  • int:表示整数
  • double:表示小数
  • varchar:表示字符串
  • datetime:表示时间日期

5. 数据库的表操作

1.列出当前数据库的表
show tables;
2.创建表
create table 表名(列名 类型, 列名 类型, 列名 类型,.....);
3.查看表结构
desc 表名;
4.删除表
drop table 表名;

术语:

  • 成员变量:member variable
  • 属性:property
  • 字段:field

注释:

更推荐使用#作为注释
胡总和-- 作为注释(两个减号一个空格)
create table goods(goods_id int, goods_name varchar(20), unitprice int, category varchar(50), provider varchar(50));

6. 数据库的增删改查(CRUD)

6.1 新增

insert into 表名 values (值,值....);//这里的数量、类型、含义都要和定义的表头的结构匹配
insert into student values(1,'张三');
  • 强类型和弱类型:是否支持隐式类型转换
  • 静态类型和动态类型:一个变量的类型能否在程序运行过程中发生改变

指定列插入

insert into 表名(列名,列名.....) values(值,值....);
  • 这个列名个数和顺序啥的就不需要和表头信息一致,但是要确保你写的列名,是存在的

一次性插入多行记录

insert into 表名 values(值,值....)(值,值....)(值,值....);
  • 一次插入三条记录,往往效率要比一次插入一条记录,分三次插入,效率更高

datetime

'2024-02-28 21:12:00'
insert into test values(now())

6.2 查询

6.2.1 全列查询
select * from 表名;

服务器会进行大量的IO操作,同时把得到的结果通过网络返回,触发大量的网络IO操作

硬盘、网卡,同一时刻能够处理的数据量都是有限的,进行了selec * 就可能把硬盘/网卡的带宽给吃满了,此时其他普通用户针对数据库进行的操作,就可能被卡住了

6.2.2 指定列查询
select 列名, 列名......from 表名;
  • 确保写的列名字是合法的,必须要在表名中存在
6.2.3 表达式查询
select name, chinese + 10 from exam_result;	
select name, chinese + math + english from exam_result;
select name, chinese + math + english as total from exam_result;
  • 查询的结果不仅仅是列,而且可以把列带入到表达式中,进行计算
  • 表达式查询只是针对服务器响应得到的临时结果进行了计算,不影响硬盘存储的数据本体
  • as可以省略,但是不建议
6.2.4 去重查询
select distinct 列名 from 表名;
select distinct math, english from exam_result;
  • 针对查询结果,进行去重,存在重复数据,就会把重复的行合并成一行

  • 两行的这两个列都相同的时候,才算重复

6.2.5 带有排序的查询
select * from 表名 order by 列名/表达式;//升序
select * from 表名 order by 列名/表达式 desc;//降序

select * from exam_result order by chinese;
select * from exam_result order by chinese desc;
select math + chinese + english as total from exam_result order by math + chinese + english;
select math + chinese + english as total from exam_result order by total;
  • MySQL中并不承诺结果集合以某种规则来排序
  • NULL在order by的时候,被视为是“最小值”,如果存在多个NULL,多个NULL之间的顺序是不确定的
  • SQL中进行算数运算的时候,如果其中某个操作数,结果是NULL,最后结果就也是NULL了
  • order by也是可以指定多个列排序,通过多个列排序约定更复杂的比较规则
select * from 表名 order by 列名[desc], 列名[desc]....;
  • 先按照第一列排序,第一列相同了,再按照第二列排序…
6.2.6 条件查询
select * / 列名/表达式/去重...from 表名 where 条件(逻辑运算符/关系运算符描述此条件);
select name, english from exam_result where english < 60 order by english;
select name,english,math from exam_result where english < math;
  • 数据库服务器收到这个SQL之后,就会遍历表中的每一个数据(行),取出当前行,带入到条件之中,如果条件成立,当前这一行数据就会进入到结果集合中,如果不成立,跳过,进入下一条数据
select name, chinese + english + math from exam_result where chinese + english + math < 200;
select name, chinese + english + math as total from exam_result where total < 200;//报错
  • 一个SQL的执行顺序:
    1. 遍历表
    2. 代入条件
    3. 计算列名中的表达式(定义别名)
    4. 排序/聚合等操作
select name, chinese, english from exam_result where chinese > 80 and english > 80;
select name, chinese, english from exam_result where chinese > 80 or english > 80;
select name, chinese, english from exam_result where chinese > 80 or english > 80 and english < 90;
  • and的优先级高于or,虽然优先级存在,但是实际写代码还是最好使用()
select name, chinese from exam_result where chinese between 80 and 90;
select name, chinese from exam_result where chinese in (58,59,98,99);
  • between and描述的是“连续的空间”
  • in描述的是“离散的集合”
6.2.7 模糊查询

= 精确查询,要求查询出的结果和条件中指定的内容,完全一致

like 模糊查询,不要求完全一致,只要有一部分一致即可,此处需要引入通配符来描述匹配规则

select name from exam_result where name like '孙%';//匹配孙开头的内容
select name from exam_result where name like '%孙';//匹配孙结尾的内容
select name from exam_result where name like '%孙%';//匹配包含孙的内容

select name from exam_result where name like '孙_';//匹配孙开头的内容
select name from exam_result where name like '_孙';//匹配孙结尾的内容
select name from exam_result where name like '_孙_';//匹配包含孙的内容
  • like这种模糊匹配,在SQL中要慎用这样的操作,开销是很大的,性能非常低的,尤其是表很大/匹配规则非常复杂的
6.2.8 针对空值的查询
  • <=>
  • is NULL
  • is not NULL
select * from exam_result where name <=> null;
select * from exam_result where name is null;
select * from exam_result where math <=> english;
6.2.9 分页查询
select * from exam_result limit 3;//只查询前三条记录
select * from exam_result limit 3 offset 3;//偏移量为3

6.3 修改

update 表名 set 列名 = 值 where 条件;
update exam_result set math = 80 where name = '孙悟空';
update exam_result set math = 60, chinese = 70 where name = '曹孟德';

  • 如果update的时候,不指定任何条件,相当于条件永远为true,所有的数据都会被修改
  • 修改操作也是一个危险操作,一定要确保指定的条件是合理的,正确的
  • 日常开发中,更多地使用“一次修改一条”操作,在进行单条修改的时候,可以搭配limit 1操作,就算出问题,最多影响一条记录

6.4 删除

delete from 表名 where 条件
delete from exam_result where name = '孙悟空';
  • 如果不指定条件就是删除所有数据
  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖了你都蹲不下来撸猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值