NoSQLBooster4MongoDB - 完整的SQL支持列表

NoSQLBooster4MongoDB - 完整的SQL支持列表

所有 SQL 示例都针对 MongoDB 3.4+ 运行。 MongoDB 2.6-3.2 不支持 $addFields 运算符; 等效的 MongoDB 查询会略有不同。

SQL SELECT

SELECT 语句用于从数据库中选择数据。

返回的数据存储在一个结果表中,称为结果集。

SELECT Syntax
SELECT column1, column2, ...
FROM table_name;

这里,column1, column2, … 是您要从中选择数据的表的字段名称。 如果要选择表中的所有可用字段,请使用以下语法:

SELECT * FROM table_name;

示例 - 从表/集合中选择所有字段

SELECT * FROM customers

等效的 MongoDB 查询

db.customers.aggregate()

示例 - 从表/集合中选择单个字段

SELECT supplier_name, city FROM suppliers

等效的 MongoDB 查询

db.suppliers.aggregate(
  [{
    "$project": {
      "supplier_name": 1,
      "city": 1
    }
  }])

示例 - 从表/集合中排除选定的单个字段

SELECT supplier_name,city, -_id FROM suppliers

等效的 MongoDB 查询

db.suppliers.aggregate(
  [{
    "$project": {
      "supplier_name": 1,
      "city": 1,
      "_id": 0
    }
  }])

SQL SELECT DISTINCT

SELECT DISTINCT 语句用于仅返回不同的(不同的)值。

在表中,一列通常包含许多重复值; 有时您只想列出不同的(不同的)值。

SELECT DISTINCT country FROM customers;

等效的 MongoDB 查询

db.customers.aggregate(
  [{
      "$match": {
        "country": {
          "$exists": true
        }
      }
    },
    {
      "$group": {
        "_id": {
          "country": "$country"
        }
      }
    },
    {
      "$project": {
        "country": "$_id.country"
      }
    }
  ])

以下 SQL 语句列出了不同(不同)客户国家/地区的数量:

SELECT COUNT(DISTINCT country) FROM customers;

等效的 MongoDB 查询

db.customers.aggregate(
  [{
      "$group": {
        "_id": null,
        "COUNT(DISTINCT country)": {
          "$addToSet": "$country"
        }
      }
    },
    {
      "$project": {
        "COUNT(DISTINCT country)": {
          "$size": "$COUNT(DISTINCT country)"
        }
      }
    }
  ])

SQL WHERE

WHERE 子句用于过滤记录。

WHERE 子句用于仅提取那些满足指定条件的记录。

WHERE 子句示例

以下 SQL 语句在“customers”表中选择来自国家“ShangHai”的所有客户:

SELECT * FROM customers WHERE country='ShangHai';

等效的 MongoDB 查询

db.customers.find({
  "country": "ShangHai"
})

单引号用于字符串。 如果您将ShangHai加双引号,MongoDB 的 NoSQLBooster 会将其视为“ShangHai”列,而不是字符串'ShangHai'

SELECT * FROM customers WHERE country="ShangHai";

SQL 将生成您可能不需要的以下 MongoDB 查询。

db.customers.aggregate(
  [{
      "$addFields": {
        "__tmp_cond_1": {
          "$eq": [
            "$country",
            "$ShangHai"
          ]
        }
      }
    },
    {
      "$match": {
        "__tmp_cond_1": true
      }
    },
    {
      "$project": {
        "__tmp_cond_1": 0
      }
    }
  ])

文本字段与数字字段

NoSQLBooster SQL 需要用单引号将文本值括起来。 但是,数字字段不应包含在引号中:

例子

SELECT * FROM customers WHERE customer_id !=1;

等效的 MongoDB 查询

db.customers.find({
  "customer_id": {
    "$ne": 1
  }
})

WHERE 子句中的运算符

WHERE 子句中可以使用以下运算符:

比较 运算符MongoDB 运算符描述
=$eq等于
<>$ne不等于
!=$ne不等于
>$gt大于
>=$gte大于等于
<$lt小于
<=$lte小于等于
IN()$in匹配列表中的值
NOT IN()$nin不匹配列表中的值
IS$eq匹配等于指定值的值。
IS NOT$ne匹配所有不等于指定值的值。
LIKE$eq与 % 和 _ 的模式匹配
NOT LIKE$not与 % 和 _ 的模式不匹配
BETWEEN$gte and $lte一定范围内(含)
NOT BETWEEN不支持不在范围内(含)
EXISTS不支持如果子查询至少返回一行,则满足条件

SQL AND, OR 和 NOT

AND 和 OR 运算符用于根据多个条件过滤记录:

  • 如果由 AND 分隔的所有条件都为 TRUE,则 AND 运算符显示一条记录。
  • 如果由 OR 分隔的任何条件为 TRUE,则 OR 运算符显示一条记录。
  • 如果条件不为真,则 NOT 运算符显示一条记录。 不支持

AND 例子

SELECT * FROM customers
WHERE country='China' AND city='ShangHai';   

等效的 MongoDB 查询

db.customers.find({
  "country": "China",
  "city": "ShangHai"
})

OR 例子

SELECT * FROM Customers
WHERE city='ShangHai' OR city='Wuxi';

等效的 MongoDB 查询

db.Customers.find({
  "$or": [{
      "city": "ShangHai"
    },
    {
      "city": "Wuxi"
    }
  ]
})

组合 AND 和 OR 示例

SELECT * FROM customers
WHERE country='China' AND (city='ShangHai' OR city='Wuxi');

等效的 MongoDB 查询

db.customers.find({
  "$and": [{
      "country": "China"
    },
    {
      "$or": [{
          "city": "ShangHai"
        },
        {
          "city": "Wuxi"
        }
      ]
    }
  ]
})

SQL ORDER BY

SQL ORDER BY 子句用于对 SELECT 语句的结果集中的记录进行排序。

此示例将返回按 last_name 字段升序排序的客户的所有记录。

SELECT *
FROM customers
ORDER BY last_name ASC; --Most programmers omit the ASC attribute if sorting in ascending order.

等效的 MongoDB 查询

db.customers.find({})
  .sort({
    "last_name": 1
  })

示例 - 同时使用 ASC 和 DESC 属性

SELECT *
FROM products
WHERE product_id <> 7
ORDER BY category_id DESC, product_name ASC;

等效的 MongoDB 查询

db.products.find({
    "product_id": {
      "$ne": 7
    }
  })
  .sort({
    "category_id": -1,
    "product_name": 1
  })

SQL NULL 值

IS NULL 条件在 SQL 中用于测试 NULL 值。 如果找到 NULL 值或缺少字段,则返回 TRUE,否则返回 FALSE。 IS NOT NULL 条件在 SQL 中用于测试非 NULL 值。 如果找到非 NULL 值,则返回 TRUE。 否则,它返回 FALSE。 不包含不包含该字段的文档

MongoDB 中的不同查询运算符以不同方式处理空值。 请参考空字段或缺失字段的查询在mongo中怎么查询这个?(不为空)

此示例将返回客户表中 favorite_website 为 空字段或缺失字段.

SELECT * FROM customers WHERE favorite_website IS NULL;

等效的 MongoDB 查询

db.customers.find({
  "favorite_website": null
})

此示例将返回 customers 表中 favorite_website 字段存在且其值不为 null 的所有记录

SELECT * FROM customers WHERE favorite_website IS NOT NULL;

等效的 MongoDB 查询

db.customers.find({
  "favorite_website": {
    "$ne": null
  }
})

如果要检查该字段是否存在于 MongoDB 中,则必须使用 “$exists” 操作符。 目前没有对应的SQL函数。

db.inventory.find( { qty: { $exists: true } });

//or  chaining method
db.inventory.where("qty").exists(true);

SQL LIMIT 和 OFFSET

LIMIT 子句在 SELECT 语句中用于限制结果集中的行数。 LIMIT 子句接受一个或两个参数。 两个参数的值必须为零或正整数。

下面说明了带有两个参数的 LIMIT 子句语法:

SELECT column1,column2,... FROM table LIMIT offset , count;

让我们检查一下 LIMIT 子句参数:

  • offset 指定要返回的第一行的偏移量。 第一行的偏移量是 0,而不是 1。
  • count 确定要返回的最大行数。

例如 使用 LIMIT 获取前 N 行

select * from housing limit 3;

等效的 MongoDB 查询

db.housing.find({})
  .limit(3)

例如 使用 LIMIT 跳过 N 行并获取前 N 行

select * from housing order by units desc limit 3,10;

等效的 MongoDB 查询

db.housing.find({})
  .sort({
    "units": -1
  })
  .limit(10)
  .skip(3)

提示: mb.runSQLQuery() 函数返回一个游标,您可以使用链式方法跳过并获取 N 行。

而不是写:

  select * from housing order by units desc limit 3,10;

我们可以这样写:

mb.runSQLQuery(`
    select * from housing order by units desc
`)
  .skip(3)   //chaining skip and limit methods
  .limit(10)

他们的执行结果是一样的

SQL COUNT(), SUM() , AVG() , MIN() 和 MAX()

COUNT(*) 和 COUNT(列名)

COUNT() 函数返回符合指定条件的行数。

例如: COUNT 函数只包括 NOT NULL 值

SELECT COUNT(customer_id) FROM customers;

等效的 MongoDB 查询

db.customers.aggregate(
  [{
      "$match": {
        "customer_id": {
          "$ne": null
        }
      }
    },
    {
      "$group": {
        "_id": null,
        "COUNT(customer_id)": {
          "$sum": NumberInt("1")
        }
      }
    }
  ])

AVG(), MIN() 和 MAX()

AVG() 函数返回数字列的平均值。

MIN() 函数返回所选列的最小值。

MAX() 函数返回所选列的最大值。

例如:

SELECT avg(salary), min(salary), max(salary) FROM employees WHERE salary > 25000;

等效的 MongoDB 查询

db.employees.aggregate(
  [{
      "$match": {
        "salary": {
          "$gt": 25000
        }
      }
    },
    {
      "$group": {
        "_id": null,
        "AVG(salary)": {
          "$avg": "$salary"
        },
        "MIN(salary)": {
          "$min": "$salary"
        },
        "MAX(salary)": {
          "$max": "$salary"
        }
      }
    }
  ])

SUM()

SUM() 函数返回数字列的总和。

SELECT SUM(salary) AS "Total Salary"
FROM employees
WHERE salary > 25000;

等效的 MongoDB 查询

db.employees.aggregate(
  [{
      "$match": {
        "salary": {
          "$gt": 25000
        }
      }
    },
    {
      "$group": {
        "_id": null,
        "Total Salary": {
          "$sum": "$salary"
        }
      }
    }
  ])

对比上面的SQL语句和生成的MongoDB脚本,使用MongoDB脚本写一些简单的聚合操作有点繁琐。

SQL GROUP BY

SQL GROUP BY 子句可在 SELECT 语句中使用,以跨多个记录收集数据并将结果按一列或多列分组。

例如:

SELECT dept_id, SUM(salary) AS total_salaries
FROM employees
GROUP BY dept_id;

等效的 MongoDB 查询

db.employees.aggregate(
  [{
      "$group": {
        "_id": {
          "dept_id": "$dept_id"
        },
        "total_salaries": {
          "$sum": "$salary"
        }
      }
    },
    {
      "$project": {
        "dept_id": "$_id.dept_id",
        "total_salaries": "$total_salaries"
      }
    }
  ])

SQL LIKE 和 Wildcards

SQL LIKE 条件允许您使用通配符在查询中执行模式匹配。

  • % 允许您匹配任意长度的任意字符串(包括零长度)
  • _ 允许您匹配单个字符
  • LIKE 条件不区分大小写
  • 转义“escape_character” 不支持

例如,匹配任意长度的任意字符串

SELECT *
FROM customers
WHERE last_name LIKE 'J%'
ORDER BY last_name;

等效的 MongoDB 查询

db.customers.find({
    "last_name": /^J.*$/i
  })
  .sort({
    "last_name": 1
  })

例如,匹配单个字符

SELECT *
FROM categories
WHERE category_id LIKE '_5';

等效的 MongoDB 查询

db.categories.find({
  "category_id": /^.5$/i
})

SQL IN 操作符

SQL IN 条件允许您快速测试表达式是否与值列表中的任何值匹配。 它用于帮助减少 SELECT 语句中对多个 OR 条件的需求。

SELECT *
FROM suppliers
WHERE supplier_name IN ('Microsoft', 'Oracle', 'Flowers Foods');

等效的 MongoDB 查询

db.suppliers.find({
  "supplier_name": {
    "$in": [
      "Microsoft",
      "Oracle",
      "Flowers Foods"
    ]
  }
})

SQL IN 非相关子查询

NoSQLBooster 支持不相关的子查询,这些子查询将被转换为 MongoDB $lookup 阶段。

 SELECT *, holidays FROM absences
 WHERE holidays IN (SELECT name, date
                     FROM holidays
                     WHERE year = 2018);

等效的 MongoDB 查询

db.getCollection("absences").aggregate(
 [
    {
        "$lookup" : {
            "from" : "holidays",
            "as" : "holidays",
            "pipeline" : [
                {
                    "$match" : {
                        "year" : 2018
                    }
                },
                {
                    "$project" : {
                        "name" : 1,
                        "date" : 1
                    }
                }
            ]
        }
    }
])

SQL BETWEEN 操作符

SQL BETWEEN 条件允许您快速测试表达式是否在值范围内(含)。

使用 ISODate 函数 将字符串转换为 MongoDB 日期。 mongo shell 使用 ISODate 帮助程序包装 Date 对象。 所有 MongoDB 辅助函数都区分大小写

不支持 NOT BETWEEN。

SELECT *
FROM orders
WHERE ord_date BETWEEN ISODate('2016-02-27') AND ISODate('2017-02-27');

等效的 MongoDB 查询

db.orders.find({
  "ord_date": {
    "$gte": ISODate("2016-02-27T08:00:00.000+08:00"),
    "$lte": ISODate("2017-02-27T08:00:00.000+08:00")
  }
})

SQL 别名

SQL ALIASES 可用于为列或表创建临时名称。 目前NoSQLBooster SQL for MongoDB只针对单个集合,不需要支持TABLE ALIASES。

  • COLUMN ALIASES 用于使结果集中的列标题更易于阅读。
  • TABLE ALIASES (不支持)用于缩短您的 SQL 以使其更易于理解或在您执行自连接时使用。

例如:

SELECT dept_id, COUNT(*) AS total
FROM employees
GROUP BY dept_id;

SQL HAVING 子句

SQL HAVING 子句与 GROUP BY 子句结合使用,以将返回行的组限制为仅条件为 TRUE 的行。

e.g.

SELECT dept_id, COUNT(*) AS "Number of employees"
FROM employees
WHERE salary > 5000
GROUP BY dept_id
HAVING COUNT(*) > 5;

SQL 注释

注释用于对 SQL 语句的各个部分进行解释,或者用于阻止 SQL 语句的执行。

单行注释

单行注释以 -- 开头。

例如:

--Select all customer:
SELECT * FROM customers;
SELECT * FROM customers -- WHERE City='ShangHai';

多行注释

多行注释以 /* 开头,以 */ 结尾。

/* 和 */ 之间的任何文本都将被忽略。

例如:

/*Select all the columns
of all the records
in the Customers table:*/
SELECT * FROM customers;

SQL 函数和 MongoDB 聚合运算符

通过将 SQL 函数映射到 MongoDB 运算符,NoSQLBooster for MongoDB 允许您在 SQL 语句中使用所有 MongoDB 聚合运算符 作为 SQL 函数。

例如,我们要查找今年雇用的所有员工,并将 first_name 和 last_name 显示为全名。

SELECT  concat("first_name", ' ', "last_name") as fullname,
      dateToString('%Y-%m-%d',"hire_date") as hiredate 
FROM employees 
WHERE "hire_date" >= date('2017-01-01') 

等效的 MongoDB 查询:

db.employees.aggregate(
  [{
      "$match": {
        "hire_date": {
          "$gte": ISODate("2017-01-01T08:00:00.000+08:00")
        }
      }
    },
    {
      "$project": {
        "fullname": {
          "$concat": [
            "$first_name",
            " ",
            "$last_name"
          ]
        },
        "hiredate": {
          "$dateToString": {
            "format": "%Y-%m-%d",
            "date": "$hire_date"
          }
        }
      }
    }
  ])

让我们看看 concat 函数 concat(“first_name”, ’ ', “last_name”)。 concat 函数是一个 MongoDB 字符串聚合运算符。

// 而不是写作
{ $concat: [ "$first_name", " ", "last_name" ] }

// we write,  
concat("first_name", ' ', "last_name") //双引号表示字段名,单引号表示字符串

// or 
concat(first_name, ' ', last_name)  //允许省略双引号
  1. MongoDB 运算符和集合字段名称没有 $ 前缀
  2. 双引号引用字段名称。 单引号用于字符串。
  3. 除了 COUNT、SUM、MAX、MIN、AVG 之外,所有函数名称都区分大小写
  4. 我们可以使用标准的 SQL 比较运算符:=、!=、<>、<、<=、>= 或 >。

日期函数 将字符串转换为 MongoDB 日期类型。 NoSQLBooster for MongoDB 使用 Moment.js 来解析日期字符串。 当从字符串中创建日期时,Moment.js首先检查字符串是否匹配已知的ISO 8601格式,如果没有找到已知的格式,Moment.js然后检查字符串是否匹配RFC 2822 date时间格式,然后返回 new date(字符串)

请参考Moment.js 解析字符串文档 查看所有支持的字符串格式。

dateToString 是另一个 MongoDB 日期运算符,用于根据用户指定的格式将日期对象转换为字符串。 $dateToString 表达式具有以下语法:

{ $dateToString: { format: <formatString>, date: <dateExpression> } }

由于 SQL 函数不支持 JSON 对象参数,NoSQLBooster for MongoDB 将对象参数转换为普通参数列表。

dateToString('%Y-%m-%d',"hire_date") as hiredate 

第一个参数是formatString,单引号,第二个参数是“日期字段”,双引号。

MongoDB 聚合运算符列表

NoSQLBooster for MongoDB 允许您在 SQL 语句中使用以下所有 MongoDB 聚合运算符作为 SQL 函数。

SQL 连接

NoSQLBooster 支持 SQL Equi JOIN,它针对关联表的相等或匹配列值执行 JOIN。 等号 (=) 在 where 子句中用作比较运算符以引用相等性。

NoSQLBooster 支持 INNER JOIN 和 LEFT JOIN,不支持 OUTER JOIN。

  1. (INNER) JOIN: 返回在两个表中都具有匹配值的记录
  2. LEFT JOIN: 返回左表中的所有记录,以及右表中匹配的记录

Equi JOIN 会被翻译成 MongoDB $lookup stage。 (MongoDB 3.2+) 参考: https://docs.mongodb.com/manual/reference/operator/aggregation/lookup

例如:

   SELECT * FROM orders
   JOIN inventory ON orders.item=inventory.sku
   
db.getCollection("orders").aggregate(
 [
    {
        "$lookup" : {
            "from" : "inventory",
            "localField" : "item",
            "foreignField" : "sku",
            "as" : "inventory_docs"
        }
    },
    {
        "$match" : {
            "inventory_docs" : {
                "$ne" : [ ]
            }
        }
    },
    {
        "$addFields" : {
            "inventory_docs" : {
                "$arrayElemAt" : [
                    "$inventory_docs",
                    0
                ]
            }
        }
    },
    {
        "$replaceRoot" : {
            "newRoot" : {
                "$mergeObjects" : [
                    "$inventory_docs",
                    "$$ROOT"
                ]
            }
        }
    },
    {
        "$project" : {
            "inventory_docs" : 0
        }
    }
])

SQL 子查询

不支持

EXISTS 运算符用于测试子查询中是否存在任何记录。

例如:

SELECT SupplierName
FROM Suppliers
WHERE EXISTS (SELECT ProductName FROM Products WHERE SupplierId = Suppliers.supplierId AND Price < 20);
SELECT ProductName
  FROM Product 
 WHERE Id IN (SELECT ProductId 
                FROM OrderItem
               WHERE Quantity > 100)

SQL UNION 和 UNION ALL (MongoDB 4.4+)

SQL UNION 运算符用于合并 2 个或多个 SELECT 语句的结果集。 它删除各种 SELECT 语句之间的重复行。

e.g.

    SELECT supplier_id, supplier_name
    FROM suppliers
    WHERE supplier_id > 2000
    UNION
    SELECT company_id, company_name
    FROM companies
    WHERE company_id > 1000
    ORDER BY 1;

SQL any 操作符

不支持

any 运算符与 WHERE 或 HAVING 子句一起使用。

如果任何子查询值满足条件,则 ANY 运算符返回 true。

如果所有子查询值都满足条件,则 ALL 运算符返回 true。

例如:

SELECT ProductName
FROM Products
WHERE ProductID = ANY (SELECT ProductID FROM OrderDetails WHERE Quantity = 10);
SELECT ProductName
FROM Products
WHERE ProductID = ALL (SELECT ProductID FROM OrderDetails WHERE Quantity = 10);

SQL SELECT INTO 语句

不支持

SELECT INTO 语句将数据从一个表复制到一个新表中。

SELECT *
INTO newtable [IN externaldb]
FROM oldtable
WHERE condition;

<<<<<<<<<<<< [完] >>>>>>>>>>>>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值