【mysql--求解求2个或以上字段为NULL 的记录】

本文详细介绍了如何使用SQL查询语句和存储过程来筛选出数据库表中指定字段为空的记录,并通过存储过程实现按顺序逐条读取这些记录的方法。具体实例包括创建表、插入数据、使用CASE表达式判断NULL字段数量、筛选并打印符合条件的记录,以及如何在存储过程中实现高效、有序的数据读取。

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

/*--------------------------------

求2个或以上字段为NULL 的记录

t1:

id, id1, id2, id3, id4, id5, id6

t1 表中有个字段;

其中id是主键;

怎样打印其中个字段或以上为NULL 的记录id

另外,存储过程中怎么实现按顺序一条一条读取记录最方便?

注:主键id 是没有顺序的,也可能是字符串的;

-----------------------------------------*/

drop table if exists t1;

create table t1(id int,id1 int,id2 int,id3 int,id4 int,id5 int,id6 int);

insert t1 select

1,1,1,1,1,null,null union all select 

2,null,null,null,1,2,union all select 

3,1,2,3,4,5,union all select 

4,1,2,3,4,5,null union all select 

5,null,3,4,null,null,null ;

delimiter $$

create procedure usp_c_null()

begin 

declare n_c int;

declare idd int;

declare cur cursor for 

select id,case char_length(concat(ifnull(id1,'@'),ifnull(id2,'@'),ifnull(id3,'@'),ifnull(id4,'@'),ifnull(id5,'@'),ifnull(id6,'@')))

-char_length(replace(concat(ifnull(id1,'@'),ifnull(id2,'@'),ifnull(id3,'@'),ifnull(id4,'@'),ifnull(id5,'@'),ifnull(id6,'@')),'@','') )

  when 6 then 6 when 5 then 5 when 4 then 4   when 3 then 3 when 2 then 2 when 1 then 1 else 0 end as c from t1;

declare exit HANDLER for not found close cur ;

open cur;

repeat 

fetch cur into idd,n_c;

if(n_c>=2) then

select * from t1 where id=idd;

end if ;

until 0 end repeat;

close cur;

end ;

$$

delimiter ;

/*

+------+------+------+------+------+------+------+

| id   | id1  | id2  | id3  | id4  | id5  | id6  |

+------+------+------+------+------+------+------+

|    1 |    1 |    1 |    1 |    1 | NULL | NULL |

+------+------+------+------+------+------+------+

1 row in set (0.10 sec)

+------+------+------+------+------+------+------+

| id   | id1  | id2  | id3  | id4  | id5  | id6  |

+------+------+------+------+------+------+------+

|    2 | NULL | NULL | NULL |    1 |    2 |    3 |

+------+------+------+------+------+------+------+

1 row in set (0.14 sec)

+------+------+------+------+------+------+------+

| id   | id1  | id2  | id3  | id4  | id5  | id6  |

+------+------+------+------+------+------+------+

|    5 | NULL |    3 |    4 | NULL | NULL | NULL |

+------+------+------+------+------+------+------+

1 row in set (0.17 sec)

*/

<think>我们参考用户提供的引用内容,特别是引用[2]和引用[3]中关于创建表的语法和数据类型说明,以及引用[4]中关于主键和唯一键的用法。用户要创建一个表,包含以下字段-english:整形-python:整形-ID:整形,主键,非-name:字符类型,非根据要,我们使用以下步骤:1.登录MySQL终端2.创建数据库(可选,如果已有数据库可跳过)3.选择数据库4.创建表,指定字段和约束注意:-主键通常使用`PRIMARYKEY`,并且我们设置为非(实际上主键自带非约束)。-整形通常用`INT`。-字符类型可以用`VARCHAR`,并指定长度,例如`VARCHAR(50)`。创建表的SQL语句如下:```sqlCREATETABLEstudent_scores(IDINTNOTNULLAUTO_INCREMENTPRIMARYKEY,--主键,自增,非nameVARCHAR(50)NOTNULL,--englishINT,--整形,可以为pythonINT--整形,可以为);```解释:-`ID`字段:我们设置为`INT`类型,`NOTNULL`表示非,`AUTO_INCREMENT`表示自动增长(这样在插入数据时可以不指定ID的值,系统会自动分配一个唯一的ID),`PRIMARYKEY`表示设置为主键。-`name`字段:`VARCHAR(50)`表示可变长度字符串,最多50个字符,`NOTNULL`表示不能为-`english`和`python`字段:都是`INT`类型,表示整数,可以为(如果要,可以加上`NOTNULL`,但用户没有要,所以我们这里允许为)。如果用户希望这两个成绩字段也不能为,可以修改为`englishINTNOTNULL`和`pythonINTNOTNULL`。我们按照用户要,只对ID和name设置了非约束。现在,我们给出完整的步骤(假设数据库名为`school_db`):</think>### 在Linux终端创建MySQL表的初学者指南 #### 一、基础操作步骤 1. **登录MySQL终端** ```bash mysql -u root -p ``` 输入密码后进入交互界面[^1] 2. **创建/选择数据库** ```sql CREATE DATABASE IF NOT EXISTS student_db; USE student_db; ``` 3. **创建数据表** ```sql CREATE TABLE course_scores ( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -- 整型主键,非且自动增长[^4] name VARCHAR(50) NOT NULL, -- 字符类型,非[^2] english INT, -- 整型成绩 python INT -- 整型成绩 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 设置存储引擎和字符集[^3] ``` #### 二、关键知识点解析 1. **字段类型** - `INT`:整型数据(存储成绩) - `VARCHAR(50)`:最大50字符的变长字符串(存储姓名)[^3] - `AUTO_INCREMENT`:自动生成唯一ID(适用于主键) - `PRIMARY KEY`:主键约束(唯一标识每条记录2. **约束条件** - `NOT NULL`:强制字段必须有值(如name字段)[^4] - `DEFAULT`:设置默认值(如未指定可添加`DEFAULT 0`) 3. **表选项** - `ENGINE=InnoDB`:事务安全的存储引擎 - `DEFAULT CHARSET=utf8`:支持中文字符[^2] #### 三、验证操作 ```sql -- 查看表结构 DESCRIBE course_scores; -- 插入测试数据 INSERT INTO course_scores (name, english, python) VALUES ('张三', 85, 92), ('李四', 78, 88); -- 查询数据 SELECT * FROM course_scores; ``` #### 四、可视化结果示例 | ID | name | english | python | |----|------|---------|--------| | 1 | 张三 | 85 | 92 | | 2 | 李四 | 78 | 88 | > **提示**:在Linux终端操作时,所有SQL命令以分号`;`结束 #### 五、常见错误处理 1. **字段长度不足**:`VARCHAR`值超出长度时报错,可增大长度如`VARCHAR(100)` 2. **主键冲突**:确保`AUTO_INCREMENT`字段不手动插入重复值 3. **字符集问题**:中文乱码时检查`CHARSET=utf8`设置[^2]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值