mysql基础

1.几点小注意

  1. 每条命令以 ; 或 \g 或 \G 结束

  2. 字符串型和日期时间类型的数据用单引号(’ ‘)表示

  3. 列的别名,尽量使用双引号(” “),而且不建议省略as

  4. 建议:

  5. 数据库名、表名、表别名、字段名、字段别名等都小写

  6. SQL 关键字、函数名、绑定变量等都大写

  7. 着重号是`,单引号是’ 这俩不是一个东西

2.命名规则

  1. 数据库、表名不得超过30个字符,变量名限制为29个
  2. 只能包含 A–Z, a–z, 0–9, _共63个字符
  3. 同一个MySQL软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名
  4. 如果命名与保留字、数据库系统或常用方法冲突,使用`(着重号)引起来

3.导入数据

1
source 文件.sql

4.基本SELECT语句

1.基本写法

1
SELECT 列名(可多个,用逗号隔开) FROM 表名;

2.给列起别名

别名紧跟列名,也可以在列名和别名之间加入关键字 AS(可以不加),别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写

1
2
3
SELECT last_name AS name, commission_pct comm,
last_name "Name", salary*12 "Annual Salary"
FROM employees;

3.去重(DISTINCT)

1
2
SELECT DISTINCT department_id
FROM employees;

注意DISTINCT 其实是对后面所有列名的组合进行去重,比如:

1
2
SELECT DISTINCT Chinese_grade,English_grade
FROM grades;

语文99但是英语成绩不一样的有好多人,查询结果就会把语文成绩一样但是英语成绩不一样的全都显示出来

4.空值参与运算结果还是空值

在 MySQL 里面, 空值不等于空字符串。一个空字符串的长度是 0,而一个空值的长度是空。而且,在 MySQL 里面,空值是占用空间的。

5.对常数进行查询

在 SELECT 查询结果中增加一列固定的常数列。这列的值是我们指定的,而不是从数据表中动态取出的。

1
SELECT '蘑菇' as muhe, last_name FROM students;
1
2
3
4
5
6
7
+--------+-------------+
| muhe | last_name |
+--------+-------------+
| 蘑菇 | King |
| 蘑菇 | Kochhar |
| 蘑菇 | De Haan |
+--------+-------------+

6.显示表结构

1
2
3
DESCRIBE employees;

DESC employees;
1
2
3
4
5
6
Field:表示字段名称。
Type:表示字段类型,barcode、goodsname 是文本型的,price 是整数类型的。
Null:表示该列是否可以存储NULL值。
Key:表示该列是否已编制索引。PRI表示该列是表主键的一部分;UNI表示该列是UNIQUE索引的一部分;MUL表示在列中某个给定值允许出现多次。
Default:表示该列是否有默认值,如果有,那么值是多少。
Extra:表示可以获取的与给定列有关的附加信息,例如AUTO_INCREMENT等。

7.过滤语句

WHERE子句紧随FROM子句

1
2
3
SELECT Student_id,Chinese_grades
FROM students
WHERE Chinese_grades = 90;

当后面表达式返回值为1的时候才能显示出来,返回为0或者NULL的都不行(所以有时候要用安全等于)

5.运算符

注意:

除了<=>、IS NULL(为空)或者ISNULLIS NOT NULL、逻辑运算的短路情况,其他运算时只要参与运算的有NULL,结果就是NULL

1.dual表

dual是Oracle与数据字典一起自动创建的一个最小工作表,它只有一列:DUMMY,其数据类型为:VARCHAR2(1)

1
2
mysql> SELECT 100, 100 + 0, 100 - 0, 100 + 50, 100 + 50 -30, 100 + 35.5, 100 - 35.5
FROM dual;
1
2
3
特性:1、Oracle提供的最小的表,不论进行何种操作,它都只有一条记录——‘X’(不要删除记录,如果你往里执行insert、delete、truncate操作,就会导致很多程序出问题)。
例如:执行select * from dual,里面只有一条记录;执行insert into dual values('Y')后,再次查询dual表,仍然显示一条记录。
2、是sys用户下的一张内部表,所有用户都可以使用DUAL名称访问,无论什么时候这个表总是存在。

2.加减运算 + -

  1. 运算结果的数据类型看运算过程中最高级别的那个

    1.一个整数类型的值对整数进行加法和减法操作,结果还是一个整数;

    2.一个整数类型的值对浮点数进行加法和减法操作,结果是一个浮点数;

  2. 与java不同,mysql中 + 只表示数值相加

    1. 如果遇到非数值类型,先尝试转成数值,如果转失败,就按0计算。(MySQL中字符串拼接要使用字符串函数CONCAT()实现)

3.乘除运算 * /或DIV

  1. 一个数乘或者除以浮点数1后变成浮点数,数值与原数相等(但是数据类型变成浮点数);

  2. 一个数除以整数后,不管是否能除尽,结果都为一个浮点数

    一个数除以另一个数,除不尽时,结果为一个浮点数,并保留到小数点后4位

  3. 在数学运算中,0不能用作除数,在MySQL中,一个数除以0为NULL。

4.比较运算符

1.等号运算符 =

  1. 相等则返回1,不相等则返回0。

  2. 等号两边的值、字符串或表达式都为字符串,则MySQL会按照字符串进行比较,其比较的

    是每个字符串中字符的ANSI编码是否相等。

  3. 等号两边的值一个是整数,另一个是字符串,则MySQL会将字符串转化为数字进行比较。

  4. 等号两边的值、字符串或表达式中有一个为NULL,则比较结果为NULL。

  5. 等号两边的值都是整数,则MySQL会按照整数来比较两个值的大小。

(真正的赋值运算符是:=,直接用等号在有的情况下会被优先解释为比较而非赋值,参考[官方文档](MySQL :: MySQL 8.0 Reference Manual :: 14.4.4 Assignment Operators))

2.ISNULL和安全等于运算符<=>

当我们使用 = 来比较 NULL 值的时候会出现返回值为 NULL,而非我们想要的0或1 的情况:

1
2
3
4
5
6
7
8
PLAINTEXT
mysql> SELECT NULL = NULL, NULL = 1;
+-------------+----------+
| NULL = NULL | NULL = 1 |
+-------------+----------+
| NULL | NULL |
+-------------+----------+
1 row in set (0.00 sec)

使用安全等于可以解决这一问题:

1
2
3
4
5
6
7
8
PLAINTEXT
mysql> SELECT NULL <=> NULL, NULL <=> 1;
+---------------+------------+
| NULL <=> NULL | NULL <=> 1 |
+---------------+------------+
| 1 | 0 |
+---------------+------------+
1 row in set (0.00 sec)

事实上,这个运算符使用的不多,当需要比较 NULL 值的时候,还可以通过 IS NULL(为空)或者ISNULLIS NOT NULL (不为空)来实现(判断一个值是否为NULL,如果为NULL则返回1,否则返回0):

1
2
3
4
5
6
7
8
PLAINTEXT
mysql> SELECT NULL IS NULL, 1 IS NULL, NULL IS NOT NULL, 1 IS NOT NULL;
+--------------+-----------+------------------+---------------+
| NULL IS NULL | 1 IS NULL | NULL IS NOT NULL | 1 IS NOT NULL |
+--------------+-----------+------------------+---------------+
| 1 | 0 | 0 | 1 |
+--------------+-----------+------------------+---------------+
1 row in set (0.00 sec)
1
2
3
4
5
6
7
mysql> SELECT NULL IS NULL, ISNULL(NULL), ISNULL('a'), 1 IS NULL;
+--------------+--------------+-------------+-----------+
| NULL IS NULL | ISNULL(NULL) | ISNULL('a') | 1 IS NULL |
+--------------+--------------+-------------+-----------+
| 1 | 1 | 0 | 0 |
+--------------+--------------+-------------+-----------+
1 row in set (0.00 sec)

3.不等于运算符<>!=

符号 意义
<> 不等于的最早用法,可移植性较优,且查询速度更快
!= 后来MySQL添加上的,类似于Java等编程语言中的不等于
  1. 用于判断两边的数字、字符串或者表达式的值是否不相等,如果不相等则返回1,相等则返回0。
  2. 不等于运算符不能判断NULL值。如果两边的值有至少一个为NULL,则结果为NULL。

4.小于等于<=、大于等于>=、大于>、小于<

5.非符号类型的比较运算符(部分)

image-20240310155743908

image-20240310160540754

  1. 最小(大)值
    1
    2
    mysql> SELECT LEAST (1,0,2), LEAST('b','a','c'), LEAST(1,NULL,2);
    mysql> SELECT GREATEST(1,0,2), GREATEST('b','a','c'), GREATEST(1,NULL,2);

    当参数是整数或者浮点数时,LEAST将返回其中最小的值;

    当参数为字符串时,返回字母表中顺序最靠前的字符;

    当比较值列表中有NULL时,不能判断大小,返回值为NULL。

  2. BETWEEN AND
    1
    2
    3
    SELECT last_name, salary
    FROM employees
    WHERE salary BETWEEN 2500 AND 3500;

    在区间内结果为1,否则为0

  3. IN

    用于判断给定的值是否是IN列表中的一个值,如果是则返回1,否则返回0。

    如果给定的值为NULL,或者IN列表中存在NULL,则结果为NULL。

    1
    mysql> SELECT 'a' IN ('a','b','c'), 1 IN (2,3), NULL IN ('a','b'), 'a' IN ('a', NULL);

    (NOT IN与它类似)

  4. LIKE

    用来匹配字符串,通常用于模糊匹配,如果满足条件则返回1,否则返回0。

    如果给定的值或者匹配条件为NULL,则返回结果为NULL。

    通配符

    1
    2
    %”:匹配0个或多个字符。
    “_”:只能匹配一个字符。

    例:

    1
    2
    3
    SELECT last_name 
    FROM employees
    WHERE last_neme LIKE '%a%' AND last_name LIKE '%e%';

    等价于

    1
    2
    3
    SELECT last_name 
    FROM employees
    WHERE last_neme LIKE '%a%e%' OR last_name LIKE '%e%a%';

    要匹配%或者_符号怎么办?用转义字符 \

    拓展:

    不想用\当转义字符?用ESCAPE指定转义字符

    1
    2
    3
    SELECT last_name
    FROM employees
    WHERE last_name LIKE '_$_a%' ESCAPE '$';
  5. 正则表达式 REGEXP 或者 RLIKE

    这个不需要where了

    1
    expr REGEXP 匹配条件 

    如果expr满足匹配条件,返回1;如果不满足,则返回0。

    若expr或匹配条件任意一个为NULL,则结果为NULL。

    REGEXP运算符在进行匹配时,常用的有下面几种通配符:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    (1)‘^’匹配以该字符后面的字符开头的字符串。
    如:mysql> SELECT * FROM fruits WHERE f_name REGEXP '^b';
    (2)‘$’匹配以该字符前面的字符结尾的字符串。
    如:mysql> SELECT * FROM fruits WHERE f_name REGEXP 'y$';
    (3)‘.’匹配任何一个单字符。
    如:mysql> SELECT * FROM fruits WHERE f_name REGEXP 'a.g';
    (包含字母‘a’与‘g’且两个字母之间只有一个字母)
    (4)“[...]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”或“b”或“c”。为了命名字符的范围,使用一
    个‘-’。“[a-z]”匹配任何字母,而“[0-9]”匹配任何数字。
    (5)‘*’匹配零个或多个在它前面的字符。例如,“x*”匹配任何数量的‘x’字符,“[0-9]*”匹配任何数量的数字,
    而“*”匹配任何数量的任何字符。
    mysql> SELECT * FROM fruits WHERE f_name REGEXP '^ba*';
    (以字母‘b’开头且‘b’后面出现字母‘a’)
    mysql> SELECT * FROM fruits WHERE f_name REGEXP '^ba+';
    (以字母‘b’开头且‘b’后面出现字母‘a’至少一次)

正则表达式有很多用法,这里只是很少一部分

5.逻辑运算符

用来判断表达式的真假,返回结果为1、0或者NULL。

参与运算的有NULL,结果一般是NULL,除非发生逻辑与短路

AND的优先级高于OR,同时用的时候会先对AND两边的操作数进行操作,再与OR中的操作数结合

image-20240310165228303

异或:相等为0,不等为1

6.按位运算

(与c语言相似,不再赘述)

(左移右移都是直接空位补0)

image-20240310170144526

7.优先级

image-20240310170330222

6.排序

未完持续