MySQL 数据库系统设计即SQL语句 (一)

本文介绍如何使用SQL创建和管理表,包括ID自增长、数据去重及排序等实用技巧,并探讨了视图创建过程中的常见问题及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建表,如果表存在,则删除表

DROP TABLE if EXISTS tel_1

CREATE TABLE tel_1(
	id INT(6) PRIMARY KEY NOT NULL AUTO_INCREMENT,
	tel VARCHAR(13) CHECK (LENGTH(tel) = 13)
)

SQL 实现ID自增长后的重新排序:(使用情况:导入数据中没有自带的ID段,且ID作为主码必须唯一,这时清空数据表数据重新导入数据,ID就会从之前导入数据后的最后一位数增长)

alter table 表名 AUTO_INCREMENT=1;

创建视图,语法结构为:create view 视图名 as ( select 字段名1,字段名2....  from 表名)

#视图操作
DROP VIEW IF EXISTS dist;

CREATE VIEW dist AS (
	SELECT DISTINCT(tel) FROM tel	
);

刚开始使用比较简单的语句,直接把去重后查询结果创建到视图中,但发现不是很美观,没有序号,可能对用户来说体验不是特别好。所以小编想对去重后的数据进行再次排序。

开始从网上查询资料,发现很多人都提到了使用row_count()函数,所以,小编也就尝试了一下,毕竟使用MySQL自带函数,解决问题也较为高效。

SELECT ROW_COUNT(),a.tel FROM (SELECT DISTINCT(tel) FROM tel) a

但是该语句执行结果显示row_count()列的值全为-1,这并不是我想要的结果。

然后小编就去网上查询了一下row_count()函数使用方法,发现该函数用作查询上一条语句的影响行,上一条为查询语句则返回-1,修改语句返回修改(增删改)影响结果数,增删改无记录则返回0。可以说是跟重新设置序列毫无关系了。

所以从网上找到了另一种方法进行设置,代码如下:

#查询结果生成序号
SET @rownum = 0; #视图创建能不能引入系统变量和用户变量,不能使用临时表
SELECT @rownum := @rownum + 1 as rownum, a.tel FROM (SELECT DISTINCT(tel) FROM tel) a

等同于:

SELECT @rownum := @rownum + 1 as id,tel FROM tel GROUP BY tel

然后就如大众想的一样,以上面的查询语句来创建一个视图,rownum即为序号。但是执行语句却提示错误,网上查找错误原因:视图创建不能引入系统变量和用户变量,不能使用临时表,由于视图本身的规则引起的,那么简单粗暴的方法不可行,也就只能曲线救国。

方法一:将查询结果存为一张表,当数据库里面表比较少和用户需求也较少的时候,该方法也是可行的。

方法二:创建一张临时表,所有的操作与真实的表一直,但该临时表会在关闭数据库连接时自动删除。

DROP TABLE IF EXISTS tmp1; 
SET @rownum = 0; #视图创建能不能引入系统变量和用户变量,不能使用临时表
CREATE TEMPORARY TABLE tmp1 (
	SELECT @rownum := @rownum + 1 as id, a.tel FROM (SELECT DISTINCT(tel) FROM tel) a
);
#查询结果
SELECT * FROM tmp1
DESC tmp1

第二种方法虽然也比较节省空间,但要获得该数据就必须执行上述语句,跟直接查询结果并无二致;小编也会思考用其他方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值