Mysql

相关内容

MySQL对多个表进行COUNT(*)查询

问题我该如何从 MySQL 中的多个表中选择 COUNT(*)?比如说:SELECT COUNT(*) AS table1Count FROM table1 WHERE someCondition JOIN?? SELECT COUNT(*) AS table2Count FROM table2 WHERE someCondition CROSS JOIN? subqueries? SELECT COUNT(*) AS table3Count FROM table3 WHERE someCondition编辑:我的目标是返回这个结果:+-------------+-------------+-------------+ | table1Count | table2Count | table3Count | +-------------+-------------+-------------+ | 14 | 27 | 0 | +-------------+-------------+-------------+回答1你可以通过使用子查询来实现它,每个tableCount对应一个子查询:SELECT (SELECT COUNT(*) FROM table1 WHERE someCondition) as table1Count, (SELECT COUNT(*) FROM table2 WHERE someCondition) as table2Count, (SELECT COUNT(*) FROM table3 WHERE someCondition) as table3Count回答2你可以使用子查询来做到这一点,比如:select (SELECT COUNT(*) FROM table1 WHERE someCondition) as table1Count, (SELECT COUNT(*) FROM table2 WHERE someCondition) as table2Count 回答3你可以使用联合查询 SELECT COUNT(*) FROM table1 WHERE someCondition UNION SELECT COUNT(*) FROM table2 WHERE someCondition UNION SELECT COUNT(*) FROM table3 WHERE someCondition内容来源于StackOverflow, 遵循 CCBY-SA 4.0 许可协议进行翻译与使用。原文链接:COUNT(*) from multiple tables in MySQL
2024-08-18 18:55:05

mysql中用一个查询获取多个数据库(模式)和表的计数之和

问题下面的查询返回了4排数据,这很好。但我同时需要对同一个查询中的所有计数求和。这如何实现?我已经尝试了多种不同的方法,但只得到sintax报错。SELECT COUNT(*) FROM `schema1`.`table` WHERE STATE = 17 AND LEVEL = 1 UNION ALL SELECT COUNT(*) FROM `schema2`.`table` WHERE STATE = 17 AND LEVEL = 1 UNION ALL SELECT COUNT(*) FROM `schema3`.`table` WHERE STATE = 17 AND LEVEL = 1 UNION ALL SELECT COUNT(*) FROM `schema4`.`table` WHERE STATE = 17 AND LEVEL = 1回答1. 只需要输入更少的代码:SELECT s1, s2, s3, s4, s1 + s2 + s3 + s4 AS total FROM ( SELECT ( SELECT COUNT(*) FROM `schema1`.`table` WHERE STATE = 17 AND LEVEL = 1 ) AS s1, ( SELECT COUNT(*) FROM `schema2`.`table` WHERE STATE = 17 AND LEVEL = 1 ) AS s2, ( SELECT COUNT(*) FROM `schema3`.`table` WHERE STATE = 17 AND LEVEL = 1 ) AS s3, ( SELECT COUNT(*) FROM `schema4`.`table` WHERE STATE = 17 AND LEVEL = 1 ) AS s4 ) AS counts;如果有性能问题,确保每个表都设置了INDEX(state, level)。(在这种情况下,索引中列的顺序并不重要。)如果这只是许多困难的查询方法中的一个,您可能需要重新考虑给数据配备多个数据库(模式)。2. 将你的子查询组合起来,并在它们上面放个SELECT子句SELECT (SELECT COUNT(*) AS cnt FROM `schema1`.`table` WHERE STATE = 17 AND LEVEL = 1) s1 , (SELECT COUNT(*) AS cnt FROM `schema2`.`table` WHERE STATE = 17 AND LEVEL = 1) s2 , (SELECT COUNT(*) AS cnt FROM `schema3`.`table` WHERE STATE = 17 AND LEVEL = 1) s3 , (SELECT COUNT(*) AS cnt FROM `schema4`.`table` WHERE STATE = 17 AND LEVEL = 1) s4这应该会给你输出一个单行四列的结果。如果你需要在一个查询中对他们进行求和,请使用下面这个查询。你可以把它们放进一个select子句中,让它给你求和。这是一个例子。SELECT SUM(cnt) FROM ( SELECT COUNT(*) AS cnt FROM `schema1`.`table` WHERE STATE = 17 AND LEVEL = 1 UNION ALL SELECT COUNT(*) AS cnt FROM `schema2`.`table` WHERE STATE = 17 AND LEVEL = 1 UNION ALL SELECT COUNT(*) AS cnt FROM `schema3`.`table` WHERE STATE = 17 AND LEVEL = 1 UNION ALL SELECT COUNT(*) AS cnt FROM `schema4`.`table` WHERE STATE = 17 AND LEVEL = 1 ) tmp内容来源于Database Administrators Stack Exchange, 遵循 CCBY-SA 4.0 许可协议进行翻译与使用。原文链接:Obtain the sum of count of multiple schema and tables in one query in mysql
2024-08-17 23:42:37

按照多个计数和SUM()排序

问题我正在努力纠正下面的语法。我尝试过各种联合和连接,但都没有成功。我需要将这3个总数加起来作为“totcount”。这些数据的表非常大,我希望找到一种比用四个子查询更好的方法来获取总计数。 SELECT location.*,data.status, (SELECT COUNT(data.id) FROM data WHERE data.locid=location.locid AND data.status='NEW') AS newcount, (SELECT COUNT(data.id) FROM data WHERE data.locid=location.locid AND data.status='IN-PROGRESS') AS ipcount, (SELECT COUNT(data.id) FROM data WHERE data.locid=location.locid AND data.status='COMPLATED') AS compcount FROM TP_locations LEFT JOIN data ON data.locid=location.locid AND data.status IN('NEW','IN-PROGRESS','COMPLETED') WHERE data.status IS NOT NULL GROUP BY location.locid ORDER BY totcount回答你的查询(如果我没理解错你的意思)可以简化为:SELECT location.*, data.status, --this is meaningless, it will give you a random one of the 3 possible values COUNT(IF(data.status='NEW',1,null)) AS newcount, COUNT(IF(data.status='IN-PROGRESS',1,null)) AS ipcount, COUNT(IF(data.status='COMPLATED',1,null)) AS compcount, COUNT(1) AS totcount FROM TP_locations JOIN data ON data.locid=location.locid AND data.status IN('NEW','IN-PROGRESS','COMPLETED') GROUP BY location.locid ORDER BY totcount然后你就可以按照任意一列进行排序了。内容来源于StackOverflow, 遵循 CCBY-SA 4.0 许可协议进行翻译与使用。原文链接:ORDER BY with Multiple Counts and SUM()
2024-08-18 14:46:42

将多个表的计数合为一个计数

问题我知道如何对不同的表做多个计数,但从没见过如何将他们合起来。我有一个MySQL数据库,在那里我执行以下查询:SELECT characters.name, COUNT(*) AS wiki_unlocks FROM wiki_items INNER JOIN characters ON characters.character_id=wiki_items.character_id GROUP BY wiki_items.character_id ORDER BY wiki_unlocks DESC LIMIT 10;这给我返回了以下结果,看着还不错:name wiki_unlocks player1 2 player2 1我想要得到一个所有'wiki_xxxx'表的加在一起的计数。比如说,我想要得到'wiki_items'(above) + 'wiki_armors' + 'wiki_weapons' + ...感谢大家的帮助!3个回答1. 如果性能方面是一个问题,毕竟表中有很多行数据,我会这么做。首先分组和计数,然后才是连接表。SELECT characters.name, COALESCE(count_unlocks,0) AS unlocks, COALESCE(count_armors,0) AS armors, COALESCE(count_weapons,0) AS weapons, COALESCE(count_unlocks,0) + COALESCE(count_armors,0) + COALESCE(count_weapons,0) AS total FROM characters LEFT JOIN (SELECT wiki_items.character_id, count(*) AS count_unlocks from wiki_items GROUP BY wiki_items.character_id) AS wiki_unlocks ON characters.character_id = wiki_unlocks.character_id LEFT JOIN (SELECT wiki_armors.character_id, count(*) AS count_armors from wiki_armors GROUP BY wiki_armors.character_id) AS wiki_armors ON characters.character_id = wiki_armors.character_id LEFT JOIN (SELECT wiki_weapons.character_id, count(*) AS count_weapons from wiki_weapons GROUP BY wiki_weapons.character_id) AS wiki_weapons ON characters.character_id = wiki_weapons.character_id2. 可能最简单的方法是将每个计数作为子选择:SELECT c.name , (select COUNT(i.character_id) From wiki_items i Where c.character_id=i.character_id ) as wiki_unlocks , (select COUNT(a.character_id) From wiki_armors a Where c.character_id=a.character_id ) as wiki_armors , (select COUNT(w.character_id) From wiki_weapons w Where c.character_id=w.character_id ) as wiki_weapons FROM characters c3. 这或许会有帮助:SELECT Sum( a.count ) FROM( SELECT Count( * ) AS count FROM Table1 UNION ALL SELECT Count( * ) AS count FROM Table2 UNION ALL SELECT Count( * ) AS count FROM Table3 UNION ALL SELECT Count( * ) AS count FROM Table4 ) a内容来源于Database Administrators Stack Exchange, 遵循 CCBY-SA 4.0 许可协议进行翻译与使用。原文链接:Count multiple tables as one count
2024-08-18 00:10:01

数据库中的Schema是什么?

在数据库中,schema( [ˈskimə],发音 “skee-muh” 或者“skee-mah”,(计划或理论的)提要,纲要;网络模式;图式;架构。中文叫模式)是数据库的组织和结构,schemas 和schemata都可以作为复数形式。模式中包含了schema对象,可以是表(table)、列(column)、数据类型(data type)、视图(view)、存储过程(stored procedures)、关系(relationships)、主键(primary key)、外键(foreign key)等。数据库模式可以用一个可视化的图来表示,它显示了数据库对象及其相互之间的关系。以上是模式图的一个简单例子,显示了三个表及其数据类型、表之间的关系以及主键和外键,以下是数据库模式的一个更复杂的例子。在这种情况下,模式图分为四个部分:(1)Customer Data(客户数据):与客户有关的数据,如姓名,地址等(2)Business(业务):业务所需的数据,例如员工,商店位置,付款细节等(3)Inventory(库存):所有产品的细节。在这里,产品是电影,所以它包含电影标题,类别,演员等数据。(4)Views(视图):关于用于评估的数据的特别观点,所以通过这些模式图,我们可以进一步创建一个数据库,实际上,MySQL Workbench允许我们直接从图中生成一个Create Table脚本,然后我们就可以直接用这个脚本去创建一个数据库,还可以直接将一个数据库转换为一个关系图表。Schema和DataBase是否等同?涉及到数据库的模式有很多疑惑,问题经常出现在模式和数据库之间是否有区别,如果有,区别在哪里。取决于数据库供应商对schema(模式)产生疑惑的一部分原因是数据库系统倾向于以自己的方式处理模式(1)MySQL的文档中指出,在物理上,模式与数据库是同义的,所以,模式和数据库是一回事。(2)但是,Oracle的文档却指出,某些对象可以存储在数据库中,但不能存储在schema中。 因此,模式和数据库不是一回事。(3)而根据这篇SQL Server技术文章SQLServer technical article,schema是数据库SQL Server内部的一个独立的实体。 所以,他们也不是一回事。因此,取决于您使用的RDBMS,模式和数据库可能不一样。SQL标准对schema如何定义?ISO/IEC 9075-1 SQL标准中将schema定义为描述符的持久命名集合(a persistent, named collection of descriptors),如果你之前对schema的定义疑惑不解,希望看了我的这篇文章会好一些,起码不会更差。广义上造成疑惑的另一个原因可能是由于schema这一术语具有如此广泛的含义,因为它在不同的环境下有不同的含义,schema一词源于希腊语skhēma,意思是形态(form),轮廓(figure),形状(shape)或方案(plan)。Schema在心理学中被用来描述组织信息类别及其之间关系的有组织的思维或行为模式。我们在设计一个数据库之前,还需要看看数据中的信息种类和它们之间的关系, 在我们开始使用DBMS中的物理模式之前,我们需要创建一个概念模式。在软件开发中讨论模式时,可以讨论概念模式、物理模式、内部模式、外部模式、逻辑模式等,每一个都有其特定的含义。DBMS的schema定义以下是三个领先的关系数据库系统的schema定义:MySQLConceptually, a schema is a set of interrelated database objects, such as tables, table columns, data types of the columns, indexes, foreign keys, and so on. These objects are connected through SQL syntax, because the columns make up the tables, the foreign keys refer to tables and columns, and so on. Ideally, they are also connected logically, working together as part of a unified application or flexible framework. For example, theINFORMATION_SCHEMA and performance_schema databases use “schema” in their names to emphasize the close relationships between the tables and columns they contain.In MySQL, physically, aschema is synonymous with adatabase. You can substitute the keywordSCHEMA instead ofDATABASE in MySQL SQL syntax, for example using CREATE SCHEMA instead of CREATE DATABASE.Some other database products draw a distinction. For example, in the Oracle Database product, aschema represents only a part of a database: the tables and other objects owned by a single user.MySQL官方文档指出,从概念上讲,模式是一组相互关联的数据库对象,如表,表列,列的数据类型,索引,外键等等。但是从物理层面上来说,模式与数据库是同义的。你可以在MySQL的SQL语法中用关键字SCHEMA替代DATABASE,例如使用CREATE SCHEMA来代替CREATE DATABASE。参考: MySQL Glossary, MySQL 5.7 参考手册. MySQL, Retrieved 6 June 2016。SQL ServerThe names of tables, fields, data types, and primary and foreign keys of a database.SQL Server官方文档指出,schema中包含了数据库的表,字段,数据类型以及主键和外键的名称。参考:SQL Server Glossary. SQL Server 2016 Technical Documentation. Microsoft Developer Network. Retrieved 6 June 2016.Oracle DatabaseOracle中的schema系统与其他数据库系统大不相同,Oracle的schema与数据库用户密切相关。A schema is a collection of logical structures of data, or schema objects. A schema is owned by a database user and has the same name as that user. Each user owns a single schema.Oracle官方文档指出,schema是数据或模式对象的逻辑结构的集合,由数据库用户拥有,并且与该用户具有相同的名称,也就是说每个用户拥有一个独立的schema。参考: Oracle Database Objects. Oracle Database Online Documentation 12c Release 1 (12.1). Oracle Help Center. Retrieved 6 June 2016.如果想了解更多关于schema的内容,可以参考这篇文章schema definitions by DBMS.创建Schema尽管上述三个DBMS在定义schema方面有所不同,还是有一个共同点,就是每一个都支持CREATE SCHEMA语句。MySQL在MySQL中,CREATE SCHEMA创建了一个数据库,这是因为CREATE SCHEMA是CREATE DATABASE的同义词。 换句话说,你可以使用CREATE SCHEMA或者CREATE DATABASE来创建一个数据库。Oracle Database在Oracle中,CREATE SCHEMA语句实际上并不创建一个模式,这是因为已经为在创建用户时,数据库用户就已经创建了一个模式,也就是说在ORACLE中CREATE USER就创建了一个schema,CREATE SCHEMA语句允许你将schema同表和视图关联起来,并在这些对象上授权,从而不必在多个事务中发出多个SQL语句。SQL Server在SQL Server中,CREATE SCHEMA将按照名称创建一个模式,与MySQL不同,CREATE SCHEMA语句创建了一个单独定义到数据库的模式。和ORACLE也不同,CREATE SCHEMA语句实际创建了一个模式(前面说到这个语句在ORACLE中不创建一个模式),在SQL Server中,一旦创建了模式,就可以往模式中添加用户和对象。总结schema这个词可以用在很多不同的环境中,在特定数据库管理系统创建一个schema时,您需要使用DBMS特定定义模式,当你切换到一个新的数据库管理系统时,一定要查看该系统是如何定义schema的。中文翻译转自:数据库中的Schema是什么?_我是蚁人的博客-CSDN博客_schema英文原文转换语言可见。
2024-08-18 00:31:51