学习mysql

main
expressgy 6 months ago
parent 160aec9cf1
commit 63d6ce6470
  1. 261
      docs/MySQL/mysql是怎样使用的.md

@ -512,6 +512,266 @@ SELECT * FROM student_score WHERE score NOT BETWEEN 60 AND 80;
## 8.2 匹配列表中的元素 IN ## 8.2 匹配列表中的元素 IN
| 运算符 | 示例 | 描述 |
|--------|-------------------|----------------|
| IN | a IN (b1, b2) | a是b1和b2中的某一个 |
| NOT IN | a NOT IN (a1, a2) | a不是a1和a2中的任何一个 |
```sql
-- 匹配查询
SELECT * FROM student_info WHERE major IN ('软件工程', '飞行器设计');
SELECT * FROM student_info WHERE major NOT IN ('软件工程', '飞行器设计');
```
## 8.3 匹配NULL
- NULL代表未确认,查找NULL不能简单用= NULL
| 运算符 | 示例 | 描述 |
|-------------|---------------|-----------|
| IS NULL | a IS NULL | a的值是NULL |
| IS NOT NULL | a IS NOT NULL | a的值不为NULL |
```sql
-- NULL
SELECT * FROM student_info WHERE name IS NULL;
SELECT * FROM student_info WHERE name IS NOT NULL;
```
## 8.4 多个搜索条件
### 8.4.1 AND运算符
```sql
-- AND
SELECT * FROM student_info WHERE sex = '男' AND department = '计算机学院';
```
### 8.4.2 OR运算符
```sql
-- OR
SELECT * FROM student_info WHERE sex = '男' OR department = '计算机学院';
```
### 8.4.3 更复杂的搜索条件组合
- AND优先级高于OR
```sql
-- 复杂条件搜索
-- sorce < 60 + subject = 'MySQL是怎样运行的'
-- source > 90
SELECT * FROM student_score WHERE score > 90 OR score < 60 AND student_score.subject = 'MySQL是怎样运行的';
-- source > 90 + sorce < 60
-- subject = 'MySQL是怎样运行的'
SELECT * FROM student_score WHERE (score > 90 OR score < 60) AND student_score.subject = 'MySQL是怎样运行的';
SELECT * FROM student_score WHERE (score > 90 || score < 60) && student_score.subject = 'MySQL是怎样运行的';
```
## 8.5 通配符
- 支持模糊查询的两个运算符
| 运算符 | 示例 | 描述 |
|----------|--------------|-------|
| LIKE | a LIKE b | a匹配b |
| NOT LIKE | a NOT LIKE b | a不匹配b |
- `%`代表任意个字符
- `_`代表一个字符
```sql
-- 通配符
SELECT * FROM student_info WHERE name LIKE '狗%';
SELECT * FROM student_info WHERE name LIKE '%甘%';
SELECT * FROM student_info WHERE name LIKE '狗__';
```
### 8.5.1 转义通配符 \反斜杠
- 内容中包含`%`和`_`用`\%`和`\_`代替
```sql
-- 转义通配符
SELECT * FROM student_info WHERE name LIKE '狗\__';
SELECT * FROM student_info WHERE name LIKE '狗\%_';
```
# 第九章 表达式和函数
## 9.1 表达式
### 9.1.1 操作数
### 9.1.2 运算符
- `/` 是除法
- `DIV` 是除法取整
- `%` 是除法取余
- `AND``&&`
- `OR``||`
- **`XOR`异或**,有且只有一个为真
### 9.1.3 表达式的使用
1. 作为计算字段放在SELECT语句中
- 查成绩并且在原有基础上+100
```sql
-- 放在SELECT中
SELECT number, subject, score + 100 FROM student_score;
SELECT number, subject, score + 100 AS `score` FROM student_score;
-- ``用来装列名,''用来装普通字符串
SELECT name, '我是一个装饰', `sex`, 'sex' FROM student_info;
-- 不能用``将不是列明的内容装起来
SELECT name, `我是一个装饰` FROM student_info;
-- 计算器
SELECT 5 * 6 +128 -32;
```
2. 作为搜索条件放在WHERE子句中
WHERE子句可以不包含列,只要结果为真就可以查出所有数据,不能为NULL和0
```sql
-- 放在WHERE中
-- 假 查不出来数据
SELECT * FROM student_info WHERE 0;
SELECT * FROM student_info WHERE NULL;
SELECT * FROM student_info WHERE 2 - 2;
SELECT * FROM student_info WHERE 2 < 1;
-- 真 查出所有数据
SELECT * FROM student_info WHERE 2 > 1;
SELECT * FROM student_info WHERE 2 + 2;
SELECT * FROM student_info WHERE 2;
```
### 9.1.4 表达式中的NULL
- 操作`NULL`时,所有结果都为`NULL`
- 除了 `<=>`, `IS NULL`, `IS NOT NULL`外的比较结果都为 `NULL`
```sql
-- 查出一行数据 结果全是NULL
SELECT 1>NULL, 2-NULL, NULL IS NULL;
-- 查处结果是一行1
SELECT NULL IS NULL;
```
## 9.2 函数
### 9.2.1 文本处理函数
| 名称 | 调用示例 | 示例结果 | 描述 |
|-----------|-----------------------------|-------------|----------------------|
| LEFT | LEFT('abc123', 3) | abc | 给定字符串从左边取指定长度的子串 |
| RIGHT | RIGHT('abc123', 3) | 123 | 给定字符串从右边取指定长度的子串 |
| LENGTH | LENGTH('abc') | 3 | 给定字符串的长度 |
| LOWER | LOWER('ABC') | abc | 给定字符串的小写格式 |
| UPPER | UPPER('abc') | ABC | 给定字符串的大写格式 |
| LTRIM | LTRIM(' abc') | abc | 给定字符串左边空格去除后的格式 |
| RTRIM | RTRIM('abc ') | abc | 给定字符串右边空格去除后的格式 |
| SUBSTRING | SUBSTRING('abc123', 2, 3) | bc1 | 给定字符串从指定位置截取指定长度的子串 |
| CONCAT | CONCAT('abc', '123', 'xyz') | abc123xyz | 将给定的各个字符串拼接成一个新字符串 |
```sql
-- 字符处理函数
-- LEFT
SELECT LEFT('abc123', 4); -- abc1
-- RIGHT
SELECT RIGHT('abc123',2); -- 23
-- LENGTH
SELECT LENGTH('何先生'); -- 9
-- LOWER
SELECT LOWER('ABCDEF'); -- abcdef
-- UPPER
SELECT UPPER('abcdef'); -- ABCDEF
-- LTRIM
SELECT LTRIM(' ABC'); -- 'ABC'
SELECT ' ABC'; -- ' ABC'
-- RTRIM
SELECT RTRIM(' ABC '); -- ' ABC'
-- TRIM
SELECT TRIM(' A B C '); -- 'A B C'
-- SUBSTRING
SELECT SUBSTRING('何先生abcdefg何先生', 2, 5); -- '先生abc'
-- CONCAT
SELECT CONCAT('a_', 'b', 'CD21', 'AA'); -- 'a_bCD21AA'
-- CHAR_LENGTH
SELECT CHAR_LENGTH('何先生abcdefg何先生'); -- 13
-- 和数据库结合使用
SELECT CONCAT('学号为', number, '的同学在《', subject, '》课程上的成绩是:', score) AS '成绩描述' FROM student_score;
-- 学号为20210101的同学在《MySQL是怎样运行的》课程上的成绩是:88
-- 学号为20210101的同学在《计算机是怎样运行的》课程上的成绩是:78
-- 学号为20210102的同学在《MySQL是怎样运行的》课程上的成绩是:98
-- 学号为20210102的同学在《计算机是怎样运行的》课程上的成绩是:100
-- 学号为20210103的同学在《MySQL是怎样运行的》课程上的成绩是:61
-- 学号为20210103的同学在《计算机是怎样运行的》课程上的成绩是:59
-- 学号为20210104的同学在《MySQL是怎样运行的》课程上的成绩是:46
-- 学号为20210104的同学在《计算机是怎样运行的》课程上的成绩是:55
```
### 9.2.2 日期处理函数
- 常见日期处理函数
| 名称 | 调用示例 | 示例结果 | 描述 |
|--------------|--------------------------------------------------|---------------------|--------------------------------|
| NOW | NOW() | 2019-08-16 17:10:43 | 返回当前日期和时间 |
| CURDATE | CURDATE() | 2019-08-16 | 返回当前日期 |
| CURTIME | CURTIME() | 17:10:43 | 返回当前时间 |
| DATE | DATE('2019-08-16 17:10:43') | 2019-08-16 | 将给定日期和时间值的日期提取出来 |
| DATE_ADD | DATE_ADD('2019-08-16 17:10:43', INTERVAL 2 DAY) | 2019-08-18 17:10:43 | 将给定的日期和时间值添加指定的时间间隔 |
| DATE_SUB | DATE_SUB('2019-08-16 17:10:43', INTERVAL 2 DAY) | 2019-08-14 17:10:43 | 将给定的日期和时间值减去指定的时间间隔 |
| DATEDIFF | DATEDIFF('2019-08-16', '2019-08-17'); | -1 | 返回两个日期之间的天数(负数代表前一个参数代表的日期比较小) |
| DATE_FORMAT | DATE_FORMAT(NOW(),'%m-%d-%Y') | 08-16-2019 | 用给定的格式显示日期和时间 |
- MYSQL支持的时间单位
| 时间单位 | 描述 |
|-------------|------|
| MICROSECOND | 毫秒 |
| SECOND | 秒 |
| MINUTE | 分钟 |
| HOUR | 小时 |
| DAY | 天 |
| WEEK | 星期 |
| MONTH | 月 |
| QUARTER | 季度 |
| YEAR | 年 |
- MYSQL常见日期时间通配符
| 格式符 | 描述 |
|-----|----------------------------------------|
| %b | 简写的月份名称(Jan、Feb、...、Dec) |
| %D | 带有英文后缀的月份中的日期(0th、1st、2nd、...、31st)) |
| %d | 数字格式的月份中的日期(00、01、02、...、31) |
| %f | 微秒(000000-999999) |
| %H | 二十四小时制的小时 (00-23) |
| %h | 十二小时制的小时 (01-12) |
| %i | 数值格式的分钟(00-59) |
| %M | 月份名(January、February、...、December) |
| %m | 数值形式的月份(00-12) |
| %p | 上午或下午(AM代表上午、PM代表下午) |
| %S | 秒(00-59) |
| %s | 秒(00-59) |
| %W | 星期名(Sunday、Monday、...、Saturday) |
| %w | 周内第几天 (0=星期日、1=星期一、 6=星期六) |
| %Y | 4位数字形式的年(例如2019) |
| %y | 2位数字形式的年(例如19) |
@ -523,3 +783,4 @@ SELECT * FROM student_score WHERE score NOT BETWEEN 60 AND 80;
-- --

Loading…
Cancel
Save