BETWEEN AND
作用: BETWEEN AND
运算符用于在一个范围内筛选数据,该范围包括指定的两个边界值。
语法:
column_name BETWEEN lower_bound AND upper_bound
示例:
SELECT * FROM employees WHERE salary BETWEEN 30000 AND 40000;
选取薪水在 30000 至 40000 之间的所有员工记录。
注意:
BETWEEN
是inclusive的,即包含边界值。- 两端的值可以是常量,也可以是表达式或子查询结果。
- 对于日期或时间类型的列,
BETWEEN
也能很好地处理范围查询。
IS NULL 和 IS NOT NULL
作用: IS NULL
和 IS 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" 的产品。
注意:
!=
和<>
在功能上完全等价,都可以用于表示“不等于”关系。在 MySQL 中,二者可以互换使用。- 虽然
<>
在某些数据库系统中可能不被支持,但在 MySQL 中两者都是标准且广泛接受的不等于运算符。
综上所述,BETWEEN AND
用于在指定范围内筛选数据,IS NULL
和 IS 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字符的更准确排序,并且对大小写不敏感。
如果您希望使用其他字符集和排序规则,只需将上述示例中的 utf8mb4
和 utf8mb4_unicode_ci
替换为您所需的字符集和对应的排序规则即可。
例如,如果您需要创建一个使用GBK字符集和相应排序规则的表,可以这样写:
CREATE TABLE your_table_name (
-- 列定义...
) ENGINE=InnoDB DEFAULT CHARSET=gbk COLLATE=gbk_chinese_ci;
确保所选字符集和排序规则能够满足您的应用程序对多语言支持、排序行为等方面的特定需求。通常情况下,utf8mb4
是一个广泛推荐的选择,因为它能兼容世界上大多数语言的文字。
总之,在创建MySQL表时,通过在 CREATE TABLE
语句中明确指定 CHARSET
和 COLLATE
选项,您可以直接设定该表的字符集和排序规则,无需在创建后进行额外的修改。
"character set" 和 "charset" 是同义词,它们在数据库和文本处理的上下文中都用来指代同一概念,即一套预定义的字符及其对应的编码规则。以下是对这两个术语的详细解释:
Character Set (字符集):
字符集是一组抽象字符的集合,包括字母、数字、标点符号、特殊符号、以及特定语言或文化环境中的专用字符。每个字符集定义了一个具体的字符范围,如拉丁字母、西里尔字母、汉字、阿拉伯字母等,并为这些字符分配唯一的编码。字符集旨在确保计算机系统能够正确识别、存储和处理各种语言的文字信息。
Charset (字符集的缩写):
"Charset" 是 "Character Set" 的缩写形式,它同样代表了相同的概念。在实际使用中,特别是在数据库管理、编程语言文档、配置文件等技术环境中,由于简洁性和方便性的考虑,人们常常使用 "charset" 来代替 "character set"。虽然拼写形式不同,但它们传达的意义完全一致。
因此,无论是提到 "character set" 还是 "charset",都是指同一个东西,即用于定义一组字符以及这些字符在计算机内部如何被编码的规范。在MySQL等数据库系统的语境中,您会经常看到这两个术语交替使用,例如在创建表、设置连接属性、查询系统信息等操作中指定字符集时,可以使用 DEFAULT CHARACTER SET
或 CHARSET
关键字,它们的效果是一样的。
总结来说:
- Character Set 和 Charset 是同义词,均指代字符编码体系。
- 在正式文档、学术讨论中,通常使用全称 "Character Set"。
- 在日常对话、编程代码、数据库配置等场合,常使用缩写 "Charset",以求简练。
无论使用哪个术语,关键是要确保在数据库设计、应用程序开发及数据交换过程中,正确选择和一致应用合适的字符集,以保证数据的正确存储、检索和跨系统兼容性。"character set" 和 "charset" 在数据库管理、编程等相关场景中都能使用,它们表达的是同一个概念,没有本质区别。具体使用哪一个取决于个人习惯、文档规范或代码风格。以下是一些使用场景示例:
-
创建表时指定字符集:
- 使用 "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 );
- 使用 "character set":
-
设置数据库连接字符集:
- 使用 "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" )
- 使用 "character set":
-
查询系统字符集信息:
- 使用 "character set":
SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%';
- 使用 "charset":
SHOW VARIABLES WHERE Variable_name LIKE 'charset\_%';
- 使用 "character set":
以上示例表明,无论是在SQL语句、程序代码还是命令行交互中,您可以根据需要自由选择使用 "character set" 或 "charset"。两者都能准确传达字符编码体系的含义,不会影响其在数据库系统中的功能和效果。
总之,尽管形式上略有差异,但 "character set" 和 "charset" 在实际应用中完全可以互换使用,都表示相同的字符编码体系概念。选择哪一个取决于您的个人偏好、团队约定或特定上下文的要求。