mysql基础
mysql基础
1.几点小注意
每条命令以 ; 或 \g 或 \G 结束
字符串型和日期时间类型的数据用单引号(’ ‘)表示
列的别名,尽量使用双引号(” “),而且不建议省略as
建议:
数据库名、表名、表别名、字段名、字段别名等都小写
SQL 关键字、函数名、绑定变量等都大写
着重号是`,单引号是’ 这俩不是一个东西
2.命名规则
- 数据库、表名不得超过30个字符,变量名限制为29个
- 只能包含 A–Z, a–z, 0–9, _共63个字符
- 同一个MySQL软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名
- 如果命名与保留字、数据库系统或常用方法冲突,使用`(着重号)引起来
3.导入数据
1 | source 文件.sql |
4.基本SELECT语句
1.基本写法
1 | SELECT 列名(可多个,用逗号隔开) FROM 表名; |
2.给列起别名
别名紧跟列名,也可以在列名和别名之间加入关键字 AS(可以不加),别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写
1 | SELECT last_name AS name, commission_pct comm, |
3.去重(DISTINCT)
1 | SELECT DISTINCT department_id |
注意DISTINCT 其实是对后面所有列名的组合进行去重,比如:
1 | SELECT DISTINCT Chinese_grade,English_grade |
语文99但是英语成绩不一样的有好多人,查询结果就会把语文成绩一样但是英语成绩不一样的全都显示出来
4.空值参与运算结果还是空值
在 MySQL 里面, 空值不等于空字符串。一个空字符串的长度是 0,而一个空值的长度是空。而且,在 MySQL 里面,空值是占用空间的。
5.对常数进行查询
在 SELECT 查询结果中增加一列固定的常数列。这列的值是我们指定的,而不是从数据表中动态取出的。
1 | SELECT '蘑菇' as muhe, last_name FROM students; |
1 | +--------+-------------+ |
6.显示表结构
1 | DESCRIBE employees; |
1 | Field:表示字段名称。 |
7.过滤语句
WHERE子句紧随FROM子句
1 | SELECT Student_id,Chinese_grades |
当后面表达式返回值为1的时候才能显示出来,返回为0或者NULL的都不行(所以有时候要用安全等于)
5.运算符
注意:
除了<=>、IS NULL(为空)
或者ISNULL
、 IS NOT NULL
、逻辑运算的短路情况,其他运算时只要参与运算的有NULL,结果就是NULL
1.dual表
dual是Oracle与数据字典一起自动创建的一个最小工作表,它只有一列:DUMMY
,其数据类型为:VARCHAR2(1)
。
1 | mysql> SELECT 100, 100 + 0, 100 - 0, 100 + 50, 100 + 50 -30, 100 + 35.5, 100 - 35.5 |
1 | 特性:1、Oracle提供的最小的表,不论进行何种操作,它都只有一条记录——‘X’(不要删除记录,如果你往里执行insert、delete、truncate操作,就会导致很多程序出问题)。 |
2.加减运算 +
-
运算结果的数据类型看运算过程中最高级别的那个
1.一个整数类型的值对整数进行加法和减法操作,结果还是一个整数;
2.一个整数类型的值对浮点数进行加法和减法操作,结果是一个浮点数;
与java不同,mysql中 + 只表示数值相加
- 如果遇到非数值类型,先尝试转成数值,如果转失败,就按0计算。(MySQL中字符串拼接要使用字符串函数
CONCAT()
实现)
- 如果遇到非数值类型,先尝试转成数值,如果转失败,就按0计算。(MySQL中字符串拼接要使用字符串函数
3.乘除运算 *
/或DIV
一个数乘或者除以浮点数1后变成浮点数,数值与原数相等(但是数据类型变成浮点数);
一个数除以整数后,不管是否能除尽,结果都为一个浮点数;
一个数除以另一个数,除不尽时,结果为一个浮点数,并保留到小数点后4位;
在数学运算中,0不能用作除数,在MySQL中,一个数除以0为NULL。
4.比较运算符
1.等号运算符 =
相等则返回1,不相等则返回0。
等号两边的值、字符串或表达式都为字符串,则MySQL会按照字符串进行比较,其比较的
是每个字符串中字符的ANSI编码是否相等。
等号两边的值一个是整数,另一个是字符串,则MySQL会将字符串转化为数字进行比较。
等号两边的值、字符串或表达式中有一个为NULL,则比较结果为NULL。
等号两边的值都是整数,则MySQL会按照整数来比较两个值的大小。
(真正的赋值运算符是:=
,直接用等号在有的情况下会被优先解释为比较而非赋值,参考[官方文档](MySQL :: MySQL 8.0 Reference Manual :: 14.4.4 Assignment Operators))
2.ISNULL和安全等于运算符<=>
当我们使用 =
来比较 NULL 值的时候会出现返回值为 NULL,而非我们想要的0或1 的情况:
1 | PLAINTEXT |
使用安全等于可以解决这一问题:
1 | PLAINTEXT |
事实上,这个运算符使用的不多,当需要比较 NULL 值的时候,还可以通过 IS NULL
(为空)或者ISNULL
和 IS NOT NULL
(不为空)来实现(判断一个值是否为NULL,如果为NULL则返回1,否则返回0):
1 | PLAINTEXT |
1 | mysql> SELECT NULL IS NULL, ISNULL(NULL), ISNULL('a'), 1 IS NULL; |
3.不等于运算符<>
、!=
符号 | 意义 |
---|---|
<> | 不等于的最早用法,可移植性较优,且查询速度更快 |
!= | 后来MySQL添加上的,类似于Java等编程语言中的不等于 |
- 用于判断两边的数字、字符串或者表达式的值是否不相等,如果不相等则返回1,相等则返回0。
- 不等于运算符不能判断NULL值。如果两边的值有至少一个为NULL,则结果为NULL。
4.小于等于<=
、大于等于>=
、大于>
、小于<
5.非符号类型的比较运算符(部分)
最小(大)值
1
2mysql> 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。
BETWEEN AND
1
2
3SELECT last_name, salary
FROM employees
WHERE salary BETWEEN 2500 AND 3500;在区间内结果为1,否则为0
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与它类似)
LIKE
用来匹配字符串,通常用于模糊匹配,如果满足条件则返回1,否则返回0。
如果给定的值或者匹配条件为NULL,则返回结果为NULL。
通配符
1
2“%”:匹配0个或多个字符。
“_”:只能匹配一个字符。例:
1
2
3SELECT last_name
FROM employees
WHERE last_neme LIKE '%a%' AND last_name LIKE '%e%';等价于
1
2
3SELECT last_name
FROM employees
WHERE last_neme LIKE '%a%e%' OR last_name LIKE '%e%a%';要匹配%或者_符号怎么办?用转义字符
\
拓展:
不想用
\
当转义字符?用ESCAPE指定转义字符1
2
3SELECT last_name
FROM employees
WHERE last_name LIKE '_$_a%' ESCAPE '$';正则表达式 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中的操作数结合
异或:相等为0,不等为1
6.按位运算
(与c语言相似,不再赘述)
(左移右移都是直接空位补0)