小熊奶糖(BearCandy)
小熊奶糖(BearCandy)
发布于 2024-04-18 / 18 阅读
0
0

MySQL通配符,运算符,distinct去重|MySql运算符实训1|[character set|charset]修改字符集

BETWEEN AND

作用: BETWEEN AND 运算符用于在一个范围内筛选数据,该范围包括指定的两个边界值。

语法:

column_name BETWEEN lower_bound AND upper_bound

示例:

  • SELECT * FROM employees WHERE salary BETWEEN 30000 AND 40000; 选取薪水在 30000 至 40000 之间的所有员工记录。

注意:

  1. BETWEEN 是inclusive的,即包含边界值。
  2. 两端的值可以是常量,也可以是表达式或子查询结果。
  3. 对于日期或时间类型的列,BETWEEN 也能很好地处理范围查询。

IS NULL 和 IS NOT NULL

作用: IS NULLIS NOT NULL 用于判断某个列的值是否为 NULL 或非 NULL。

语法:

column_name IS NULL
column_name IS NOT NULL

示例:

  • SELECT * FROM users WHERE last_login IS NULL; 选取最后一次登录时间为空(未登录过)的所有用户。
  • SELECT * FROM orders WHERE shipping_address IS NOT NULL; 查找有填写配送地址的所有订单。

!=<>

作用: !=<> 都表示“不等于”关系,用于比较两个表达式或值是否不同。

语法:

expression1 != expression2
expression1 <> expression2

示例:

  • SELECT * FROM students WHERE grade != 'A'; 选取成绩不是 "A" 的学生记录。
  • SELECT * FROM products WHERE category <> 'Electronics'; 查找类别不是 "Electronics" 的产品。

注意:

  1. !=<> 在功能上完全等价,都可以用于表示“不等于”关系。在 MySQL 中,二者可以互换使用。
  2. 虽然 <> 在某些数据库系统中可能不被支持,但在 MySQL 中两者都是标准且广泛接受的不等于运算符。

综上所述,BETWEEN AND 用于在指定范围内筛选数据,IS NULLIS NOT NULL 判断列值是否为空,而 !=<> 则用于比较两个表达式或值是否不相等。这些运算符都是 SQL 查询中常用的条件筛选工具,有助于精准定位需要的数据。

MySQL 通配符

MySQL 中的通配符主要用于 LIKE 运算符中,实现对字符串的模式匹配和模糊查询。以下是最常用的两种通配符:

% (百分号)

作用: 匹配任何数量的(包括零个)字符。

示例:

  • SELECT * FROM users WHERE username LIKE 'John%'; 会找到以 "John" 开头的所有用户名。
  • SELECT * FROM articles WHERE title LIKE '%MySQL%'; 会找出标题中包含 "MySQL" 字符串的任何位置的文章。

_ (下划线)

作用: 匹配单个字符。

示例:

  • SELECT * FROM products WHERE code LIKE 'AB_12'; 会找出代码以 "AB" 开始,紧接着一个任意字符,然后是 "12" 结尾的产品。
  • SELECT * FROM employees WHERE phone LIKE '___-____'; 会查找格式类似于 "XXX-XXXX"(三个数字、短横线、四个数字)的电话号码。

比较运算符

MySQL 中的比较运算符用于比较两个表达式或值之间的关系。以下是常见的比较运算符:

等于(=

作用: 判断两个操作数是否相等。

示例:

  • SELECT * FROM students WHERE score = 90; 选取成绩为 90 分的学生记录。

不等于(<>!=

作用: 判断两个操作数是否不相等。

示例:

  • SELECT * FROM orders WHERE status <> 'Completed'; 查找状态不是 "Completed" 的订单。

大于(>)、小于(<

作用: 分别判断左操作数是否大于右操作数、左操作数是否小于右操作数。

示例:

  • SELECT * FROM salaries WHERE amount > 50000; 获取薪水超过 50000 的员工记录。
  • SELECT * FROM products WHERE price < 75; 查找价格低于 75 的产品。

大于等于(>=)、小于等于(<=

作用: 分别判断左操作数是否大于等于右操作数、左操作数是否小于等于右操作数。

示例:

  • SELECT * FROM inventory WHERE stock_level >= 100; 查找库存量不少于 100 的商品。
  • SELECT * FROM temperatures WHERE temperature <= 25; 获取温度不超过 25 度的记录。

安全等于(<=>

作用: 类似于 =, 但能正确处理 NULL 值。当两个操作数均为 NULL 时,返回 1(认为它们相等),而 = 在此情况下返回 NULL。

示例:

  • SELECT * FROM table WHERE column <=> NULL; 选取 column 字段值为 NULL 的行。

LIKE 运算符

作用: 用于在 SQL 查询中执行模式匹配,结合通配符进行字符串的模糊查询。

示例:

  • SELECT * FROM books WHERE title LIKE 'The%'; 查找书名以 "The" 开头的所有书籍。
  • SELECT * FROM contacts WHERE email LIKE '%@gmail.com'; 找出电子邮件地址以 "@gmail.com" 结尾的联系人。

SELECT 语句

SELECT 语句是 SQL 中用来从数据库中检索数据的核心命令。其基本语法如下:

SELECT column1, column2, ...
FROM table_name
[WHERE condition]
[GROUP BY column_list]
[HAVING condition]
[ORDER BY column1, column2 ... ASC|DESC]
[LIMIT offset, row_count];

各部分说明:

  • SELECT column1, column2, ...: 指定要从表中选择哪些列。可以用 * 表示选择所有列。
  • FROM table_name: 指定查询的数据来源,即从哪个表中获取数据。
  • [WHERE condition]: 可选,设置查询的筛选条件,使用比较运算符或 LIKE 等进行过滤。
  • [GROUP BY column_list]: 可选,对查询结果按指定列进行分组。
  • [HAVING condition]: 可选,对分组后的结果进一步筛选,通常与聚合函数配合使用。
  • [ORDER BY column1, column2 ... ASC|DESC]: 可选,指定查询结果的排序方式,ASC 表示升序,DESC 表示降序。
  • [LIMIT offset, row_count]: 可选,限制返回的记录数,offset 是起始位置(从0开始),row_count 是要返回的行数。

DISTINCT 关键字

DISTINCT 用于去除查询结果集中重复的行或列值,确保返回唯一的结果。

示例:

  • SELECT DISTINCT country FROM customers; 返回不重复的客户所在国家列表。
  • SELECT product_type, COUNT(DISTINCT customer_id) FROM orders GROUP BY product_type; 统计每个产品类型对应的不重复购买客户数量。

总结起来,MySQL 中的通配符、比较运算符、LIKE 运算符以及 SELECT 语句(含 DISTINCT 关键字)都是用于构建复杂查询、从数据库中提取所需信息的重要工具。通过灵活组合这些元素,您可以精准地定位、筛选和组织数据,满足各种数据分析和业务需求。

MySql运算符实训1

mysql>
mysql> create schema if not exists test3;
Query OK, 1 row affected (0.00 sec)

mysql> use test3;
Database changed
mysql> select database();
+------------+
| database() |
+------------+
| test3      |
+------------+
1 row in set (0.00 sec)

mysql> create table user (id int primary key auto_increment,name varchar(30) not
 null unique,sex varchar(30) not null,score float not null default 0);
Query OK, 0 rows affected (0.12 sec)

mysql> desc user;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(30) | NO   | UNI | NULL    |                |
| sex   | varchar(30) | NO   |     | NULL    |                |
| score | float       | NO   |     | 0       |                |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql> insert into user (name,sex,score) values
    ->
    -> ('张三','男',55),
    -> ('李四','男',55),
    -> ('四里','男',55),
    -> ('小红','男',55);
ERROR 1366 (HY000): Incorrect string value: '\xE5\xBC\xA0\xE4\xB8\x89' for colum
n 'name' at row 1
//字符集错误,通过convert to character set 字符集 转换字符集 
mysql> alter table user convert to character set utf8mb4;
Query OK, 0 rows affected (0.26 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> insert into user (name,sex,score) values
    -> ('张三','男',55),
    -> ('李四','男',55),
    -> ('四里','男',55),
    -> ('小红','男',55);
Query OK, 4 rows affected (0.03 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from user;
+----+--------+-----+-------+
| id | name   | sex | score |
+----+--------+-----+-------+
|  1 | 张三   | 男  |    55 |
|  2 | 李四   | 男  |    55 |
|  3 | 四里   | 男  |    55 |
|  4 | 小红   | 男  |    55 |
+----+--------+-----+-------+
4 rows in set (0.00 sec)

mysql> select * from user where name like '%四%';
+----+--------+-----+-------+
| id | name   | sex | score |
+----+--------+-----+-------+
|  2 | 李四   | 男  |    55 |
|  3 | 四里   | 男  |    55 |
+----+--------+-----+-------+
2 rows in set (0.00 sec)

mysql> select * from user where name like '%四';
+----+--------+-----+-------+
| id | name   | sex | score |
+----+--------+-----+-------+
|  2 | 李四   | 男  |    55 |
+----+--------+-----+-------+
1 row in set (0.00 sec)

mysql> select score from user where name='张三';
+-------+
| score |
+-------+
|    55 |
+-------+
1 row in set (0.00 sec)

mysql> select * from user where name='%张%';
Empty set (0.00 sec)

mysql> select * from user where name like '%张%';
+----+--------+-----+-------+
| id | name   | sex | score |
+----+--------+-----+-------+
|  1 | 张三   | 男  |    55 |
+----+--------+-----+-------+
1 row in set (0.00 sec)

mysql>

不足总结

select,create总是忘记加表名

创建表/数据库时忘记指定字符集

在MySQL中创建表时指定字符集和排序规则,您可以在 CREATE TABLE语句中直接包含相关选项。以下是创建表时指定字符集的语法示例:

CREATE TABLE your_table_name (
    -- 列定义...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

解释如下:

  • your_table_name: 替换为您实际要创建的表名。
  • ENGINE=InnoDB: 指定表使用的存储引擎。这里以InnoDB为例,它是MySQL中常用的事务安全存储引擎。
  • DEFAULT CHARSET=utf8mb4: 设置表的默认字符集为 utf8mb4。这是Unicode字符集的一种扩展形式,支持大多数现代字符,包括表情符号和其他特殊字符。
  • COLLATE=utf8mb4_unicode_ci: 设置表的排序规则为 utf8mb4_unicode_ci。排序规则决定了字符比较和排序的方式。utf8mb4_unicode_ci提供了对Unicode字符的更准确排序,并且对大小写不敏感。

如果您希望使用其他字符集和排序规则,只需将上述示例中的 utf8mb4utf8mb4_unicode_ci替换为您所需的字符集和对应的排序规则即可。

例如,如果您需要创建一个使用GBK字符集和相应排序规则的表,可以这样写:

CREATE TABLE your_table_name (
    -- 列定义...
) ENGINE=InnoDB DEFAULT CHARSET=gbk COLLATE=gbk_chinese_ci;

确保所选字符集和排序规则能够满足您的应用程序对多语言支持、排序行为等方面的特定需求。通常情况下,utf8mb4是一个广泛推荐的选择,因为它能兼容世界上大多数语言的文字。

总之,在创建MySQL表时,通过在 CREATE TABLE语句中明确指定 CHARSETCOLLATE选项,您可以直接设定该表的字符集和排序规则,无需在创建后进行额外的修改。

"character set" 和 "charset" 是同义词,它们在数据库和文本处理的上下文中都用来指代同一概念,即一套预定义的字符及其对应的编码规则。以下是对这两个术语的详细解释:

Character Set (字符集):
字符集是一组抽象字符的集合,包括字母、数字、标点符号、特殊符号、以及特定语言或文化环境中的专用字符。每个字符集定义了一个具体的字符范围,如拉丁字母、西里尔字母、汉字、阿拉伯字母等,并为这些字符分配唯一的编码。字符集旨在确保计算机系统能够正确识别、存储和处理各种语言的文字信息。

Charset (字符集的缩写):
"Charset" 是 "Character Set" 的缩写形式,它同样代表了相同的概念。在实际使用中,特别是在数据库管理、编程语言文档、配置文件等技术环境中,由于简洁性和方便性的考虑,人们常常使用 "charset" 来代替 "character set"。虽然拼写形式不同,但它们传达的意义完全一致。

因此,无论是提到 "character set" 还是 "charset",都是指同一个东西,即用于定义一组字符以及这些字符在计算机内部如何被编码的规范。在MySQL等数据库系统的语境中,您会经常看到这两个术语交替使用,例如在创建表、设置连接属性、查询系统信息等操作中指定字符集时,可以使用 DEFAULT CHARACTER SETCHARSET 关键字,它们的效果是一样的。

总结来说:

  • Character SetCharset 是同义词,均指代字符编码体系。
  • 在正式文档、学术讨论中,通常使用全称 "Character Set"。
  • 在日常对话、编程代码、数据库配置等场合,常使用缩写 "Charset",以求简练。

无论使用哪个术语,关键是要确保在数据库设计、应用程序开发及数据交换过程中,正确选择和一致应用合适的字符集,以保证数据的正确存储、检索和跨系统兼容性。"character set" 和 "charset" 在数据库管理、编程等相关场景中都能使用,它们表达的是同一个概念,没有本质区别。具体使用哪一个取决于个人习惯、文档规范或代码风格。以下是一些使用场景示例:

  1. 创建表时指定字符集

    • 使用 "character set":
      CREATE TABLE your_table (
          column_name VARCHAR(255) DEFAULT CHARACTER SET utf8mb4
      );
      
    • 使用 "charset":
      CREATE TABLE your_table (
          column_name VARCHAR(255) CHARSET utf8mb4
      );
      
  2. 设置数据库连接字符集

    • 使用 "character set":
      conn = mysql.connector.connect(
          host="localhost",
          user="username",
          password="password",
          database="your_db",
          charset="utf8mb4"
      )
      
    • 使用 "charset":
      conn = mysql.connector.connect(
          host="localhost",
          user="username",
          password="password",
          database="your_db",
          character_set="utf8mb4"
      )
      
  3. 查询系统字符集信息

    • 使用 "character set":
      SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%';
      
    • 使用 "charset":
      SHOW VARIABLES WHERE Variable_name LIKE 'charset\_%';
      

以上示例表明,无论是在SQL语句、程序代码还是命令行交互中,您可以根据需要自由选择使用 "character set" 或 "charset"。两者都能准确传达字符编码体系的含义,不会影响其在数据库系统中的功能和效果。

总之,尽管形式上略有差异,但 "character set" 和 "charset" 在实际应用中完全可以互换使用,都表示相同的字符编码体系概念。选择哪一个取决于您的个人偏好、团队约定或特定上下文的要求。


评论