MariaDB 入门笔记(一)

222 阅读4分钟

概览

  • 创建
  • 排序
    • ORDER BY
    • DESC
    • ASC
  • 过滤
    • WHERE
    • IS NULL
  • 高级过滤
    • 操作符
      • AND
      • OR
      • IN
      • NOT
    • 通配符与 LIKE
      • %

      • _

创建

本地创建 fake-order.sql 文件后导入 MariaDB。

注:相关sql文件可以在MariaDB Crash Course 下载。

# 登录 MariaDB, root 换成自己设置的用户名
mysql -u root

# source 引用的是本地的sql文件
source ~/Sites/demo/learn-mariadb/fake-order.sql

# 查询, 在此之前可以添加一些假数据,同上的 source xx
# 从 products 中查找所有 prod_id
SELECT prod_id FROM products;

# 返回不同的 prod_id 
SELECT DISTINCT prod_id FROM products;

# 查找所有列
SELECT * FROM products;

# 限定结果, 返回5个结果
SELECT prod_name FROM products LIMIT 5;

# 从第3行开始,返回5行, 注意行数索引从0开始,第一行是0
SELECT prod_name FROM products LIMIT 3, 5;
# 和上面同一个意思。
SELECT prod_name FROM products LIMIT 5 OFFSET 3;

# 完全限定名
SELECT products.prod_name FROM products;
SELECT products.prod_name FROM fake_order.products;

# mariaDB 中的三种注释
-- 单行注释
# 单行注释
/*多行
注
释/*

排序

如果没有显式指定排序,不应该认为检索的数据顺序是有意义的。

子句:SQL语句由过个子句组成,有些是必需的,有些是可选的,一个子句通常由关键字和数据组成。

# 显式地对SELECT语句检索出的数据进行排序,可使用 ORDER BY 子句,ORDER BY 后面接一个或多个列名,依此对输出的数据排序。
# 将 prod_name 列以字母顺序对数据进行排序
SELECT prod_name FROM products ORDER BY prod_name;

# 以多列为标准排序, 先价格,再名字
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price, prod_name;

# ORDER BY 后面除了跟列名外,也可以指定顺序编号, 注意:列改变之后很容易出错
SELECT prod_id, prod_price, prod_name FROM products ORDER BY 2, 3;

指定排序方向

默认排序是升序排序(从A到Z),也可以降序,使用关键字 DESC

# 对价格进行降序排序,价格最高的在第一个
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC;

# 多列排序, DESC 只作用于其前面的列名,这里 prod_name 不会按照降序排
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC, prod_name;

# 多列排序,每一列上都进行降序排序
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC, prod_name DESC;

# 升序 ASC, 不经常使用,默认就是 ASC

# 大写A和小写a默认是一样的,如果有需要,可以修改列字符集,需要 CONVERT() 函数或联系数据库管理员

过滤数据

WHERE 子句指定搜索条件

# 检索两列,返回 prod_price 值为2.50 的行
# 客户端也可以检索数据,但是不推荐在客户端过滤,因为如果数据在客户端过滤,服务器需要发送不需要的数据,导致网络带宽资源的浪费
SELECT prod_name, prod_price FROM products WHERE prod_price = 2.50;

# 当同时使用 ORDER BY 和 WHERE 子句时,确保 ORDER BY 子句在 WHERE 之后,否则会产生错误

# 相等测试,匹配时不区分大小写
SELECT prod_name, prod_price FROM products WHERE prod_name = 'fuses';

# 列出所有价格低于10的产品
SELECT prod_name, prod_price FROM products WHERE prod_price < 10;

# 检查不匹配
# 列出所有非供应商1003制造的产品:<> (小于或大于)同 !=
SELECT vend_id, prod_name FROM products WHERE vend_id <> 1003;

# 检查区间值
SELECT prod_name, prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;

空值检查

NULL: 空值,不同于可包含0、空字符串或者空格的字段。

为了确定一个值是否是NULL, 不能简单地检查是否“=NULL”,而是, SELECT 语句又一个特殊的 WHERE 子句用于检测列是否有 NULL 值,即 IS NULL 子句。

SELECT cust_id FROM customers WHERE cust_email IS NULL;

当筛选不包含指定值的行时,包含 NULL 值的行不会返回,因为“未知”的含义是数据库并不知道是否匹配。

当过滤数据时,务必验证包含 NULL 列的行是否在返回的数据中

高级筛选组合

为了更好的控制过滤,可以指定多个 WHERE 子句,这些子句可以通过下面两种方式使用: AND子句或OR子句

操作符:在 WHERE 子句中用来连接或者改变子句的关键字,也被成为逻辑操作符

  • AND 对 WHERE 子句添加条件

    SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id = 1003 AND prod_price <= 10;
    # ORDER BY 需要放在 WHERE 后面
    
    SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id = 1003 AND prod_price <= 10 ORDER BY prod_price DESC;
    
  • OR 操作符:指示 MariaDB 检索匹配其中某个条件的行

计算次序,使用括号进行分组, 括号比 AND 和 OR 有更高的优先级

# 未分组,读取供应商1002生产的产品,而不管其价格是多少,以及任何由供应商1003生产的价格高于或等于10的产品
SELECT prod_name, prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003 AND prod_price >= 10;

# 分组
SELECT prod_name, prod_price FROM products WHERE(vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;
  • IN 操作符:指定一组条件,只要匹配其中任何一个条件即可。IN 用逗号隔开括号中列出的所有合法值。

    SELECT prod_name, prod_price
        -> FROM products
        -> WHERE vend_id IN (1002, 1003)
        -> ORDER BY prod_name;
    

    和 OR 的例子效果一样,优点:

    • 当使用很长的值列表选项时,IN 操作符语法更清晰易读。
    • 使用 IN 操作符更容易管理优先级顺序(由于使用更少的操作符)
    • IN 操作符几乎总是比一系列 OR 操作符执行得更快
    • IN 操作符最大的优势是可以包含 SELECT 语句,可以让你创建更为动态的 WHERE 子句
  • NOT: 用来否定条件的 WHERE 子句中的一个关键字

    SELECT prod_name, prod_price
        -> FROM products
        -> WHERE vend_id NOT IN (1002, 1003)
        -> ORDER BY prod_name;
    

    MariaDB 支持对 IN、BETWEEN、EXISTS 语句使用 NOT

通配符过滤

通配符: 用来匹配值的某个部分的特殊字符。

搜索模式:由纯文本、通配符,或者两者结合构成的匹配条件。

SQL 中使用 LIKE 操作符,进行通配符匹配,而不是纯粹的相等匹配。

  • % : 在字符串中,它表示任何数量的字符。大小写敏感,指% 在匹配模式中指定的位置代表0个、1个或者多个字符。小心结尾的空格!可以始终在结尾加一个%。不能匹配NULL

    # 匹配任何以 jet 开头的 prod_name
    > SELECT prod_id, prod_name
        -> FROM products
        -> WHERE prod_name LIKE 'jet%';
    +---------+--------------+
    | prod_id | prod_name    |
    +---------+--------------+
    | JP1000  | JetPack 1000 |
    | JP2000  | JetPack 2000 |
    +---------+--------------+
    2 rows in set (0.049 sec)
    
    # 匹配任何未知包含文本 anvil 的值,无论其它字符出现在 anvil 之前还是之后
    MariaDB [fake_order]> SELECT prod_id, prod_name
        -> FROM products
        -> WHERE prod_name LIKE '%anvil%';
    +---------+--------------+
    | prod_id | prod_name    |
    +---------+--------------+
    | ANV01   | .5 ton anvil |
    | ANV02   | 1 ton anvil  |
    | ANV03   | 2 ton anvil  |
    +---------+--------------+
    3 rows in set (0.011 sec)
    
    # 匹配以s开头,以e结尾
    MariaDB [fake_order]> SELECT prod_id, prod_name FROM products WHERE prod_name LIKE 's%e';
    +---------+-----------+
    | prod_id | prod_name |
    +---------+-----------+
    | SAFE    | Safe      |
    +---------+-----------+
    1 row in set (0.001 sec)
    
  • _: 下划线仅匹配一个字符

    # _ 通配符
    MariaDB [fake_order]> SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '_ ton anvil';
    +---------+-------------+
    | prod_id | prod_name   |
    +---------+-------------+
    | ANV02   | 1 ton anvil |
    | ANV03   | 2 ton anvil |
    +---------+-------------+
    2 rows in set (0.001 sec)
    
    # % 通配符
    MariaDB [fake_order]> SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '% ton anvil';
    +---------+--------------+
    | prod_id | prod_name    |
    +---------+--------------+
    | ANV01   | .5 ton anvil |
    | ANV02   | 1 ton anvil  |
    | ANV03   | 2 ton anvil  |
    +---------+--------------+
    3 rows in set (0.012 sec)