如何在mysql中一次性查出某表中所有字段的非空个数
你是要根据字段名字查询哪些表有这个字段?
SELECT TABLE_SCHEMA,TABLE_NAMEFROM information_schema.`COLUMNS`WHERE COLUMN_NAME='字段名字'
1、通过图形界面操作,在左侧依次选择objects-tables,右键单击要修改的表名,选中‘Edit’-column,可以直接修改;
2、使用DDL语句:alter table 表名 modify 字段名(字符类型(长度))
例如:
alter table emp modify ename(varchar2(32))
其实用到 NULL 的场景都可以转换为有意义的字符或者数值,一是有利用数据的易读性以及后期的易维护性;二是降低 SQL 语句的编写难度。
关于 NULL 的特性如下:
1. 参与 NULL 字段拼接的结果都为 NULL,预期的可能会有差异
预想把字段 r1 做个拼接,再插入到新的表 t3 里,结果 t3 表的记录全为 NULL,跟预期不符。
mysql> show create table t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`r1` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
mysql> show create table t2\G
*************************** 1. row ***************************
Table: t2
Create Table: CREATE TABLE `t2` (
`r1` varchar(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
mysql> create table t3 like t1
Query OK, 0 rows affected (0.04 sec)
mysql> insert into t3 select concat(r1,'database') from t1 limit 2;
Query OK, 2 rows affected (0.02 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from t3;
+------+
| r1 |
+------+
| NULL |
| NULL |
+------+
2 rows in set (0.00 sec)
那正确的方法如下,对 NULL 用函数 IFNULL 特殊处理。
mysql> insert into t3 select concat(ifnull(r1,''),'database') from t1 limit 2;
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from t3;
+----------+
| r1 |
+----------+
| database |
| database |
+----------+
2 rows in set (0.00 sec)
2. 对于包含 NULL 列的求 COUNT 值也不准确
t1 和 t2 的记录数是一样的,但是字段 r1 包含了 NULL,这导致结果忽略了这些值。
mysql> select count(r1) as rc from t1;
+-------+
| rc |
+-------+
| 16384 |
+-------+
1 row in set (0.01 sec)
mysql> select count(r1) as rc from t2;
+-------+
| rc |
+-------+
| 32768 |
+-------+
1 row in set (0.03 sec)
这时候我们可能想到了,正确的方法是用 NULL 相关函数处理,
mysql> select count(ifnull(r1,'')) as rc from t1;
+-------+
| rc |
+-------+
| 32768 |
+-------+
1 row in set (0.03 sec)
或者是直接用 COUNT(*) 包含了所有可能的值
mysql> select count(*) as rc from t1;
+-------+
| rc |
+-------+
| 32768 |
+-------+
1 row in set (0.02 sec)
当然了不仅仅是 COUNT,除了 NULL 相关的函数,大部分对 NULL 处理都不友好。
所以其实从上面两点来看,NULL 的处理都得特殊处理,额外增加了编写 SQL 的难度。
3. 包含 NULL 的索引列
对包含 NULL 列建立索引,比不包含的 NULL 的字段,要多占用一个 BIT 位来存储。
示例
key_len 分别为 43 和 42,t1 比 t2 多了一个字节,那这里可能有人要问了,不是说占了一个 BIT 位吗?那为什么多了一个字节?可以关注我上一篇文章(第02期:MySQL 数据类型的艺术 - 大对象字段)关于 BIT 的详细描述。
mysql> pager grep -i 'key_len'
PAGER set to 'grep -i 'key_len''
mysql> explain select * from t1 where r1 = ''\G
key_len: 43
1 row in set, 1 warning (0.00 sec)
mysql> explain select * from t2 where r1 = ''\G
key_len: 42
1 row in set, 1 warning (0.00 sec)
4. 各存储引擎相关的对 NULL 的处理
在 MySQL 8.0 发布后,仅有 InnoDB、MyISAM 和 Memory 支持对包含 NULL 列的索引,其他引擎不支持。比如 NDB。
你所谓的空如果是NULL的话那可以写一段代码搞定(以下代码是sqlserver中的,请确保选中所需运行的数据库)
declare @tablename nvarchar(50);
declare @sql nvarchar(max);
set @tablename='贷款表'
set @sql='';
select @sql=@sql+'select '''+name+''',count(*) from '+ @tablename +' where '+ name + ' is null union ' from syscolumns where id = object_id(@tablename)
set @sql=SUBSTRING(@sql,1,len(@sql)-6)
exec(@sql)
但如果是'',那就会有问题,因为存在不同类型的字段,比如数字型的和字符型的空的形式就不一样,除非你确保所有字段都是字符型的才可以用,把is null修改为=''''
解析MySQL不使用外键意义何在mysql不用外键啥意思
外键约束经常会应用在指向同一表中的行的操作中。这种情况下,外键可能会限制数据操作的灵活性,因为插入或删除一个行时必须满足特定的限制。这种限制可能会导致不必要的复杂性和开销。禁用外键约束可能会使数据更加灵活,因为您更容易执行需要的操作。3、维护更方便 在关系数据库中,数据完整性是需要保持的...
探究MySQL查询慢的原因上亿数据背后瓶颈何在mysql上亿查询慢原因_百度...
一、数据库设计 数据库的设计也是影响查询效率的一个重要原因。早期的MySQL设计往往会遵循单个表集中存储数据的思路,而现在的设计则更多地采用分库分表的方式,即将单个表拆分成多个表来存储数据。这种设计可以避免单张表中数据过多,而导致查询变慢的问题。例如以下是一种简单的分库分表设计方法:用户信息...
一文搞懂数据库索引原理
首先,索引有哈希表和B+树等数据结构。哈希索引适用于等值查询,但不支持范围查询,可能导致全表扫描,效率低下。B+树,尤其是MySQL的B+树,因其高效且支持范围查询而受欢迎。B+树的节点存储多个元素,使得树高降低,磁盘I\/O效率提升。选择B+树而非B树,是因为B+树在叶子节点中冗余非叶子节点信息,...
MYSQL怎么改变一条记录的位置?
步骤:1、取出记录1,并暂存。2、删除记录1。3、取出记录3,将其数据存为记录1。(id=1,这是可行的,因为记录1删除后,其id 将不再存在)4、删除记录3,将步骤1中暂存的记录1存为记录3。完毕。
PostgreSQL 与 MySQL 相比,优势何在?
当比较 PostgreSQL 与 MySQL,我们不难发现 PostgreSQL 在众多领域展现出显著的优势。首先,让我们来看看 PostgreSQL 如何超越 MySQL 的局限:1. 数据类型灵活性MySQL 对 text 字段的处理存在复杂性,区分 small text、middle text 和 large text 等不同规格。相反,PostgreSQL 的 text 类型能够适应各种...
PostgreSQL与MySQL相比,优势何在?
PostgreSQL数据库的源代码要比MySQL数据库的源代码更容易读懂,如果团队的C语言能力比较强的话,就可以在PostgreSQL数据库上做开发,比方说实现类似greenplum的系统,这样也能与现在的分布式趋势接轨。 为了说明PostgreSQL的功能,下面从“从Oracle迁移到Mysql之前必须知道的50件事”简要对比一下PostgreSQL数据库与MySQL数据库...
【SQL】表中的空字符串与NULL中的区别何在
mysql> INSERT INTO my_table (phone) VALUES (NULL); mysql> INSERT INTO my_table (phone) VALUES (''); 这两条语句均会将值插入phone(电话)列,但第1条语句插入的是NULL值,第2条语句插入的是空字符串。第1种情况的含义可被解释为“电话号码未知”,而第2种情况的含义可被解释为“...
数据库管理系统有哪些
Foxpro、MS SQL Server、Informix、PostgreSQL这几种。数据库管理系统软件的种类有很多,常见的也很多,但是针对不同人群的不同需求,常用的数据库管理系统软件也那么三五种:ORACLE、MySQL、ACCESS、MS SQL Server这些是不同领域常用的数据库管理系统软件,下面我们来介绍一下这些软件各自的优势何在。
mysql int显示宽度,在不补0的情况下,有必要设置吗?
没有必要设置,int型无论设置成多少位,最后他使用的空间还是11位,如要设置可以设置无符号或有符号就可以了
软件测试工程师发展规划路线
1.5. MySQL 数据库 软件测试工程师必备 MySQL 数据库知识, 不仅仅停留在基本的 “增删改查”。 爱码小士 MySQL 数据库 MySQL 数据库测试应用 MySQL 环境搭建, 客户端 Navicat 的基本使用与数据操作, 学习并巩固基本的 SQL 语法, 增删改查缺一不可, 掌握各种条件的使用方法 MySQL 高级查询 查询升级, 掌握多表...
徭支参芪: mysql查找数据 在哪个表中1、 //看当前使用的是哪个数据库 ,如果你还没选择任何数据库,结果是NULL.mysql>select database(); +------------+ | DATABASE() | +------------+ | menagerie | +------------+ 2、//查看有哪些数据库 mysql> show ...
蛟河市13619184252: mysql 随机查询全部 - ?
徭支参芪: select * from user order by rand() limit 1,50 order by rand()表示将查询到的数据乱序排序(每执行一次乱序一次,理论上有限的次数内不会重复) limit 1,50表示取出第1到50条数据,这样可以达到每次查询出的50条数据都是随机的 lz试下 绝对可以 用过N次了
蛟河市13619184252: 查询出Mysql数据库中一个表的所有字段???? - ?
徭支参芪: --通过如下语句得到当前Sql server中所有的数据的名称: use master select [name] from [sysdatabases] order by [name] go-- 查询数据库中的所有用户表 use [DBname] select [id], [name] from [sysobjects] where [type] = 'u' order by [name]--通过上...
蛟河市13619184252: MySQL中,一个字段在多张表都存在,怎么用sql语句一次性查询这些表呢 - ?
徭支参芪: 你是要根据字段名字查询哪些表有这个字段?SELECT TABLE_SCHEMA,TABLE_NAME FROM information_schema.`COLUMNS` WHERE COLUMN_NAME='字段名字'
蛟河市13619184252: mysql如何查找某字段所在表 - ?
徭支参芪: 1、使用mysql_list_tables() 获取该数据库里所有表名2、循环使用mysql_fetch_field() 获取所有表名里的所有字段名信息(因为该函数查询出的是每个字段的所有信息 比如字段名、字段长度、字段类型等.你要单独取出字段名称 他的使用方法网上有很详细介绍的)3、然后在循环中 查询出一个字段名称就与你已知的字段名比较 如果一样了 那么就在该循环出字段的表里了..这2个函数具体使用方法 你百度查询一下 资料很丰富的 全写出来太费劲了 只能告诉你思路了.
蛟河市13619184252: 如何利用mysql系统命令直接查询某字段出现在所在的表方法 - ?
徭支参芪: MYSQL没有类似于MSSQLSERVER的sysobjects或者Oracle的dba_tab_comments这样的表,但MYSQL可以用SHOW命令查询数据库和表、字段、索引等信息:一些SHOW语句提供额外的字符集信息.这些语句包括SHOW CHARACTER SET、SHOW COLLATION、SHOW CREATE DATABASE、SHOW CREATE TABLE和SHOW COLUMNS.SHOW CHARACTER SET命令显示全部可用的字符集.它带有一个可选的LIKE子句来指示匹配哪些字符集名.
蛟河市13619184252: mysql如何查询表字段名 - ?
徭支参芪: 用describe talbeName只能查询表中定义的所有字段信息.要想一次查出未使用的字段恐怕办不到,你只能用查询记录的语句来查询,看哪个字段没有值即说明未使用.
蛟河市13619184252: mysql 查询整个数据库中某个特定值所在的表和字段的方法 - ?
徭支参芪: 好的,楼主,那么我们开始吧:语句: select * from shop where price in(select max(price) from shop group by article); 结果,请看图-------
蛟河市13619184252: mysql怎么查一张表的同时查另一张表 - ?
徭支参芪: 使用联合查询,以下例子来说明联合查询(内联、左联、右联、全联)的好处: T1表结构(用户名,密码) userid(int) usernamevarchar(20) passwordvarchar(20) 1 jack jackpwd 2 owen owenpwd T2表结构(用户名,密码) userid(int) ...
蛟河市13619184252: sql中怎么随机查??
徭支参芪: declare @a table([id] int ,[name] varchar(20)) insert @a select 1,'张三' union select 2,'李四' union select 3,'王五' union select 4,'毛六' --随机取两条,随机关键在于:order by newid() select top 2 * from @a order by newid() select top 2 * from ...