MySQL数据库操作

目录

数据库层面基本操作

显示当前的数据库

创建数据库

使用数据库

删除数据库

常用数据类型

表的操作

创建表

查看表的结构

删除表

注释

练习

表的增删改查

单行插入

全列插入

指定参数顺序插入

多行和单行插入的性能对比

时间类型的插入

自定义输入时间

设置为当前时间

全列查找

指定列查询

表达式查询

不包含字段

一个字段

多个字段

查询对原数据是否有影响

查询结果去重

查询结果排序

单权重

多权重

条件查询

描述条件

比较运算符

逻辑运算符

比较或者逻辑运算中的表达式查询

模糊查询

分页查询


数据库层面基本操作

显示当前的数据库

show databases;

里面包含了:

information_schema,

mysql,

niceff....等数据库

创建数据库

create database 数据库名;

直接创建

create database if not exists 数据库名;

使用数据库

use 数据库名;

使用use + 数据库名,进入到当前数据库:

删除数据库

drop database 数据库名;
drop database if exists 数据库名;

删除数据库是一个非常危险的行为,一定要谨慎再谨慎(删除表同样危险),数据库一旦删除,里面的表和数据也会被全部删除.

常用数据类型

int:整型
decimal(M, D):浮点数类型
varchar(SIZE):字符串类型
timestamp:日期类型

表的操作

如果需要对某一个数据库里面的表进行操作,首先需要使用改数据库,也就是使用use + 数据库名的形式

创建表

create table 表名(field1 dataType, field2 dataType, field3 dataType, ..........);

例如:

也可以使用comment增加字段说明:

查看表的结构

desc 表名;

desc为describe的缩写,意为描述.

注意:describe为MySQL中的关键字,如果使用describe 表名的结构会创建失败

删除表

drop table 表名;
drop table if exists 表名;

注释

在SQL中可以使用“--空格+描述”来表示注释说明

例如:

练习

有一个商店的数据,记录客户及购物情况,有以下三个表组成:

  1. 商品goods(商品编号goods_id,商品名goods_name, 单价unitprice, 商品类别category, 供

应商provider)

  1. 客户customer(客户号customer_id,姓名name,住址address,邮箱email,性别sex,身份证

card_id)

  1. 购买purchase(购买订单号order_id,客户号customer_id,商品号goods_id,购买数量nums)

create database datas default character set utf8;
use datas;
create table if not exists goods
(
goods_id int comment '商品编号',
goods_name varchar(32) comment '商品名称',
unitprice int comment '商品价格',
category varchar(50) comment '商品类别',
provider varchar(50) comment '供应商'
);
create table if not exists customer
(
customer_id int comment '客户号',
name varchar(50) comment '姓名',
address varchar(100) comment '住址',
email varchar(50) comment '邮箱',
sex varchar(20) comment '性别',
card_id varchar(20) comment '身份证'
);
create table if not exists purchase
(
order_id varchar(20) comment '订单号',
customer_id int comment '客户号',
goods_id varchar(20) comment '商品号',
nums int comment '购买数量'
);

表的增删改查

表的增删改查也称作CRUD:

CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写

使用insert into语句:

insert into 表名 values(value1, value2, value3, ..... );

首先新建一个表:

如下:

单行插入

insert into 表名 values( value1, value2, value3, ..... );

写入的参数必须和创建表的时候的数据参数顺序一致;

全列插入

insert into 表名 values( value1, value2, value3, ..... ), ( value1, value2, value3, .....);

写入的参数必须和创建表的时候的数据参数顺序一致;

指定参数顺序插入

insert into 表名(valueA, valueB, valueC,......) values(valueA, valueB, valueC,......)

name 为varchar类型的数据,id为int类型的数据,所以在插入记录的时候,首先需要按顺序输入name的参数,然后输入id的参数.

多行和单行插入的性能对比

由于MySQL是一个'客户端服务器'结构的程序, 在MySQL中使用insert into语句的时候,会向服务器发送一次请求, 那么如果是多行输入, 只需要一次请求就可以插入多行记录, 如果是单行输入,那么多行记录就只能向服务器请求多次, 所以多行插入的性能消耗是比单行出入少的.

时间类型的插入

在ret数据库中创建一个表,表名为homework:

往这个homework里面插入数据(记录),使用特定格式字符串:

形如:

'2023-02-20 17:21:00'

自定义输入时间

例如:

insert into homework values(1,'2023-02-20 17:21:00');

设置为当前时间

假如我想直接输入当前的时间,该怎么做? MySQL提供了一个特殊的函数: now()

例如:

insert into homework values(2, now());

使用select语句

全列查找

select*from 表名;

'*' 表示所有列,这种符号在计算机当中称为'通配符', 通配符是一种特殊语句,主要有星号(*)和问号(?),用来模糊搜索文件。当查找文件夹时,可以使用它来代替一个或多个真正字符;当不知道真正字符或者懒得输入完整名字时,常常使用通配符代替一个或多个真正的字符

例如:

话说回来,MySQL是一个'客户端服务器'结构的程序, 如果当select* 时数据量过大, 单个数据通道的传输的数据量就会变大, 这就会沾满硬盘带宽或者影响网络的使用.

指定列查询

select 列名1,列名2,列名3...... from 表名;

例如:

表达式查询

(以下查找都是基于列与列之间的计算)

创建一个表(exam_result):

插入:

(1, '张三', 67, 98, 56),
(2, '李四', 87.5, 78, 77),
(3, '王五', 88, 98.5, 90)
不包含字段

一个字段

如果要对chinese + 10 的方式进行查询,如下

select name, chinese + 10 from exam_result;

结果如上.

多个字段

或者查询chinese,matzh,english的综合成绩:

select name, chinese + math + english from exam_result;

查询对原数据是否有影响

但是我们当前存储的结果是否发生改变?

再次全列查找,发现原始的数据是没有发生改变的.

MySQL是一个'客户端服务器'结构的程序, 此时用户输入的sql, 通过请求发送给服务器,服务器解析并执行sql, 把查询的结果从硬盘上读取出来,然后用网络的形式响应, 返还给用户, 客户端再把这些数据以临时表的形式展现出来.所以不会改变原来的数据.

有时候这种chinese + math + english的表达式在理解上可能不够直观,需要进行简化:可以在查询的时候指定别名,指定别名相当于给这个chinese + math + english取了一个小名,让它理解起来更加容易.

使用:全名 as 小名的方式

select chinese + math + english as 小名

select chinese + math + english as total from exam_result;

当小名为中文的时候,不需要加上单引号或者双引号.

查询结果去重

例如:

里面有221分的重复项,使用distinct关键字,如下

select distinct math + chinese + english as 总分 from exam_result;

他会把重复的去掉,只留下一个数据.

如果distinct指定多个列的话,则这些列的值都相同,才视为重复.

查询结果排序

单权重

使用order by 来对查询结果排序.可能是升序~~也可能是降序~~

例如,存在以下表:

以math的数据为权重,来对查询结果进行一个排序:

select id, math from exam_result order by math;

默认升序(从上往下递增)

或者在order by 权重 后面加一个 desc(descend)来让它以降序排序:

select*from exam_result order by math desc;

还可以使用asc表示升序.

但是,如果在查询的时候没有指定使用order by,则此时的查询结果的顺序时不可预期的.

多权重

如果一个order by 权重后面还有一个权重,形如:

select*from 表名 order by weight1, weight2, weight3.....

那么,排序就会先按照weight1的权重进行升序或者是降序排序,如果weight1这一列里面有相同的数据,那么这些相同的数据会根据weight2的权重进行升序或者是降序排序....以此类推.

条件查询

在筛选,查询的过程中指定查找的条件(符合条件的数据留下,不符合的去除)

描述条件

MySQL中使用一系列的运算符,搭配where来描述:

比较运算符

运算符

说明

< <= > >=

小于,小于等于,大于,大于等于

=

等于,NULL不安全,NULL = NULL的结果为NULL

<=>

等于,NULL安全,NULL <=> NULL结果为TRUE(1)

between a0 and a1

范围匹配,[a0, a1], a0 <= value <= a1, 返回TRUE(1)

in(ex1,ex2,ex3, ..... )

如果数据属于ex1,ex2,ex3,......其中任意一个,返回TRUE(1)

is NULL

是空(NULL)

is not NULL

不是空(NULL)

like

模糊匹配, %表示任意多个(包括0个)字符; _表示任意一个字符

不支持+=运算符

例如:查找英语分数<60的人

select*from exam_result where english < 60;

相当于对当前表进行遍历,取出每一条数据,看条件是否满足如果满足,这个记录就会被保留,作为结果集的一部分,否则这个记录就不会被记录,然后继续遍历下一个数据.

也可以直接拿两个列进行比较:

select*from exam_result where math > chinese;

但是要注意null的比较,例如:

如果使用=对含有null的表达式进行比较,结果还是null => 相当于false,其数据就不会被记录

所以要使用<=>来比较含有null的数据,例如 null <=> null 结果为true;

逻辑运算符

运算符

说明

and

多个条件都为TRUE(1),结果才为TRUE(1)

or

任意条件为TRUE(1),结果才为TRUE(1)

not

条件为TRUE(1),结果为FALSE(0)

注意:and 和 or 存在一个优先级问题, and 的优先级 > or 的优先级,所以先执行and ,后执行or

例如:

select*from exam_result where chinese > 80 and english > 80;
select*from exam_result where chinese > 80 or math > 80;

比较或者逻辑运算中的表达式查询

例如

select*from exam_result where math + chine + english< 250;

但是,条件查询里面的比较的对象不能是前面数据的小名,例如:

select id, math + chinese + english as total from exam_result where total < 250;

写下一个sql不是从前往后的执行, 执行顺序是有特殊规定的:

  1. 遍历每一行

  1. 把这一行带入到where后面的条件判断里面去

  1. 符合条件的结果,再根据select指定的列,进行查询/计算.

模糊查询

不要求元素完全相同,只要满足一定的规则就可以了,正则表达式就是模糊匹配的典型实现.

like支持两个用法:

  • 使用 %表示0个或者n个字符,例如 '张%'就是匹配所有以张开头的数据,如果是'张三%',就匹配所有以张三开头的数据.同理'%张'是查询以'张'结尾的数据.若是'%张%',则是查询包含'张'的数据.

  • 使用 _ 代表任意一个字符,例如'张_' ,就会匹配张开头,后面_可以代表任意的字符

例如:

select*from exam_result where name like '张%';

查询name中以'张'开头的数据有哪些

select*from exam_result where name like '张_';

分页查询

有时候数据量太大了,大量数据在一页里面显示, 查看者难免有时候会看不过来, 一方面系统压力也比较大,所以就设置了分页查询,这也是我们生活中经常看到的例子,如下:

对于一个表:

如果我只想看前三条,该怎么办?使用:

select * from exam_result limit 3;

如果需要选定某几条,可以使用offset来改变偏移量,可以类比数组,第一行数据的下标为0,第二行的数据下标为1,.....以此类推:

select * from exam_result limit 3 offset 1;

这种写法等价于:

select * from exam_result limit 1,3;

存在表:

使用update关键字来修改:

update 表名 set value1 = xx, value2 = xx, value3 =xx, ... where 条件

例如:

update exam_result set chinese = 60, math = 60, english = 60 where name = '张三';

结果如下:

但是如果加30之后超过了math的decimal(4,2)的范围,就会出现out of range 的异常

若对表中的chinses数据减半操作如下:

update exam_result set chinese = chinses / 2;

但是下面的执行结果出现了:

其中包含一个warnings

使用:show warnings; 来显示错误

结果如下:

Message:Data truncated for column 'chinses' at row 2;

意为数据截断,小数点后面不够用了,只能截断.错误出现在第二行

正常来讲,60.5 / 2 的结果为30.25,但是由于decimal(3,1)只能保留小数点一位,而0.25有两位小数,所以发生了截断,其中的0.05被直接舍弃.

注意:update这个操作非常危险!!!

使用delete,意为删除,是按照行(记录)来删除的.

delete from 表名 where 条件;

例如:

delete from exam_result where math <=> null;

同时也可以搭配like(模糊匹配);

直接删除表中的所有数据:

delete from 表名;

这种情况表还存在,但是表中的数据已经全部清除了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值