mysql - SQL列作为选择

标签 mysql sql sqlite

在 SQLite 和/或 MySQL 中,是否可以将列定义为 SELECT 语句?

就像 Book.NumOfPages 列实际上是 SELECT COUNT(*) FROM PAGES WHERE BOOK_ID=BOOK.ID,所以 NumOfPages 会自动计算分配给一个页面的页数某本书。

请注意,我知道如何在一次选择中获取书籍数量。我想知道是否可以将 select 语句定义为列的一部分。

最佳答案

不清楚您要实现的目标,但您至少有以下选择:

  1. 使用子查询在 SELECT 语句中定义新列(示例 1)
  2. 将 p.1 中描述的查询包装在外部 SELECT 中,以便进行连接、分组、计算聚合等(示例 2)
  3. 根据第 1 页(示例 3)中描述的查询创建 View
  4. 以同样的方式创建一个存储过程
  5. 还有一个选择 - 在父表(在您的案例簿中)中创建一列,并在子表(在您的案例页面中)上使用触发器 INSERT、UPDATE、DELETE 填充它。这种非规范化方法通常在非常特殊的情况下使用(例如,当您需要加速分析查询时)。

示例 1

SELECT id, `title`, 
       (SELECT COUNT(*)
          FROM pages p 
         WHERE p.book_id = b.id) npages
  FROM books b

输出

| ID | TITLE | NPAGES |
-----------------------
|  1 | book1 |      3 |
|  2 | book2 |      2 |

MySql SQLFiddle

SQLLite SQLFiddle

示例 2

SELECT SUM(npages) total_pages
FROM (SELECT id, `title`, 
       (SELECT COUNT(*)
          FROM pages p 
         WHERE p.book_id = b.id) npages
  FROM books b) t

示例 3 创建 View

CREATE VIEW vw_books AS
SELECT id, `title`, 
       (SELECT COUNT(*)
          FROM pages p 
         WHERE p.book_id = b.id) npages
  FROM books b 

示例 4 创建 SP

DELIMITER $$
CREATE PROCEDURE sp_books()
BEGIN
SELECT id, `title`, 
       (SELECT COUNT(*)
          FROM pages p 
         WHERE p.book_id = b.id) npages
  FROM books b;
END$$

DELIMITER ;

并使用它

CALL sp_books();

关于mysql - SQL列作为选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15488907/

相关文章:

mysql - mySQL 查询中的错误输出

Objective-c 中的 SQL 和 oop

mysql - mysql - 如何在没有触发器和手动插入的情况下在插入时生成/自动增加 guid mysql?

mysql - 带有 MySql 的 ASP.Net MVC - 无法找到请求的 .Net Framework 数据提供程序

php - 把div放到MYSQL里死掉

mysql - 存储过程不返回多行

mysql - 索引名称在 Mysql 的整个数据库中必须是唯一的吗?

sql查找字符串中不可打印的字符

Python、SQLite 和线程

java - 插入不保存