MySQL的增删查改(基础)一

一.增

方式1(简写插入):

语法:insert into 表名 values(值,值,值……);

这里insert into 代表要插入一条新数据行,values后面就是该行的值,其中后面的值的顺序和个数按照创建表时的字段的顺序一一对应,如果顺序不一样或者个数不一样,就会报错

方式2(指定列插入):

语法:insert into 表名(字段1,字段2……) values(值1,值2……)

这里就是指定对应的字段插入后面对应的值,没有指定到的字段就使用的默认值,同时后面的值也不是像上面那样按照创建表时的字段的顺序来对应的了,而是按照前面指定字段的顺序来对应

如下,就成功插入一条数据进入表里面,同时goods_describe这个字段因为没有被指定,所以使用的默认值为null

select是查这一部分的知识,稍后会讲到

方式3(多行插入):

语法::insert into 表名(字段1,字段2……)values(值1,值2……),(值1,值2……)……

这里就是表示连续插入多行数据,其中前面是否采用简写插入还是指定列插入自己选择,后面则以逗号来区别不同行的数据

问题:一次插入一条数据和一次插入多条数据哪个效率高?

首先有两种开销,一种是网络开销,另一种是磁盘IO的开销

执行所有的SQL时都有网络开销(这是一个不可控的因素)

写入数据时则会产生网络开销

而每执行一条SQL语句都会开启一个事务,事务的开启和关闭都需要消耗系统资源

所以在可控范围之内,一次插入多条数据比一次插入一条数据效率高那么一点

用手机充电来类比,充电线插入手机,一次充满和充电线充一会电拔出来,又插上去充一会电又拔,那么充电口多次插拔肯定对手机硬件的损耗更大

二.查

方式1(全列查询):

语法:select * from 表名

select就是查询的意思,*代表全部数据,from就代表查询哪里的数据

但是在生产环境中,一个表的数据量可能会很多很多,有可能达到TB级,而每查询一条数据都会产生磁盘开销和网络开销,所以如果使用全列查询,就有可能把服务器的资源吃光,其他的程序或是数据库操作就要等待当前SQL执行完之后才能继续执行

所以不加任何限制的查询在生产环境不要使用

方式2(指定列查询)

语法:select 列名1,列名2…… from 表名

同理,就是只查询指定列名对应的数据

注:这里可以不只是列名,而可以是个表达式,比如列名+10,就代表在原来的数据基础上+10,然后返回出来

例子如下

列于列之间也可以进行运算

但是这样子看起来比较繁冗,可以通过别名来简化

别名语法:表达式 as 别名

其中as可以省略,就直接表达式 别名,这个看个人习惯选择,有人习惯最简单的书写方式,有人习惯逻辑格式完整的书写方式

可以给别名加上单引号,但是如果别名中间有空格,那么必须加单引号包裹起来

我们的表里本来没有总分这一列,但是为什么这里查询表为什么会有这么一列呢

是因为通过表达式查询出来的结果集是通过一个临时表返回给我们的,执行完之后临时表就删除了(在MySQL中所有的查询结果都会通过临时表返回给用户)

同样可以对多个表达式命名别名

select 列名1 as 别名1,列名2 as 别名2…… from 表名

去重:distinct

语法:select distinct 列名 from 表名;

如果该列的值有重复的,那么查询的时候只会有一个

注:如果查询的列名有多个,那么只有当所有列名对应的值都相同才判断为重复,否则还是当作两条不一样的数据行

排序:order by

语法:select 列名 from 表名 order by 列名 [ASC|DESC]

其中order by 列名表示按照该列名的值进行排序,而ASC代表升序(从小到大往下排),DESC代表降序(从大到下往下排),注意的是desc这个关键字之前代表描述表,现在又代表降序,一个关键字代表了两个意思,这是MySQL不好的方面,当初设计的时候就没有很好的规范,我们要吸取这个教训,写代码的时候要注意一下命名规范

没有指定ASC或者DESC则默认按照ASC升序排序,但还是强烈建议指定排序规则,更便于理解

如果没有使用order by子句,那么MySQL默认根据哪个字段进行排序是不确定的,所以如果我们有排序的意向,那么就明确指定排序字段和排序方式

注:null在数据排序时,视为比任何值都小(比负数都小),所以升序一定在最上面,降序一定在最下面,而且null与其他值进行运算时,最终的返回值都是null,比如100+null=null。而且null始终被判定为false,同时也不像其他编程语言可以等于0,null就是null,比较特殊

同样,order by后面这个列名可以使用别名,前提是前面已经提前进行了别名命名

如果指定多个列名进行order by 排序呢

语法:order by 列名1[asc|desc],列名2[asc|desc],列名3[asc|desc]……

比如出现并列的情况,就会先按照列名1的值进行排序,再在该基础上按照列名2的值进行排序,如此类推

在使用 Flask 框架进行开发时,我们通常会使用 ORM 工具来进行数据库操作。常用的 ORM 工具有 SQLAlchemy 和 Peewee。这里以 SQLAlchemy 为例,介绍如何封装 MySQL增删查改操作。 首先,我们需要在 Flask 中初始化 SQLAlchemy: ```python from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://user:password@host/db_name' db = SQLAlchemy(app) ``` 接下来,我们可以定义一个基础的 Model 类,所有的数据模型都继承自它: ```python class BaseModel(db.Model): __abstract__ = True id = db.Column(db.Integer, primary_key=True) created_at = db.Column(db.DateTime, default=datetime.utcnow) updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) ``` 这里的 BaseModel 类定义了一个 id 字段和两个时间戳字段,所有的数据模型都会继承这些字段。 接着,我们可以定义一个封装了增删查改操作的基础 Repository 类: ```python class BaseRepository: model = None @classmethod def add(cls, data): db.session.add(data) db.session.commit() @classmethod def delete(cls, data): db.session.delete(data) db.session.commit() @classmethod def find(cls, **kwargs): return cls.model.query.filter_by(**kwargs).first() @classmethod def find_all(cls, **kwargs): return cls.model.query.filter_by(**kwargs).all() @classmethod def update(cls, data): db.session.commit() ``` 这里的 BaseRepository 类定义了 add、delete、find、find_all 和 update 五个方法,分别对应了增、删、查、查全部和改操作。这些方法都是基于 SQLAlchemy 提供的 API 进行封装的。 最后,我们可以定义一个具体的 Repository 类,继承自 BaseRepository,并指定对应的 model: ```python class UserRepository(BaseRepository): model = User ``` 这里的 UserRepository 类继承了 BaseRepository 类,并指定了 model 为 User。这样,我们就可以通过 UserRepository 类来进行 User 数据模型的增删查改操作了。 ```python user = User(name='John') UserRepository.add(user) user = UserRepository.find(name='John') user.name = 'Tom' UserRepository.update(user) UserRepository.delete(user) users = UserRepository.find_all() ``` 以上就是一个简单的 MySQL 增删查改操作的封装示例。在实际开发中,我们可以根据具体的需求对 Repository 类进行拓展,并且可以结合 Flask 的 Blueprint 等功能来进行模块化的开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值