文章目录
SQL规范
MySQL 在 Windows 环境下是大小写不敏感的。
MySQL 在 Linux 环境下是大小写敏感的。
字符串型
和日期时间类型
的数据可以使用单引号
(’ ')表示。
列的别名
,尽量使用双引号
(" "),而且不建议省略AS
。
写的SQL语句全用大写。
root用户密码重置
1: 通过任务管理器或者服务管理,关掉mysqld(服务进程)
2: 通过命令行+特殊参数开启mysqld
mysqld -- defaults-file="D:\ProgramFiles\mysql\MySQLServer5.7Data\my.ini" --skip-grant-tables
3: 此时,mysqld服务进程已经打开。并且不需要权限检查
4: mysql -uroot 无密码登陆服务器。另启动一
个客户端进行
5: 修改权限表
(1)
use mysql;
(2)
update user set authentication_string=password('新密码') where user='root' and Host='localhost';
(3)
flush privileges;
6: 通过任务管理器,关掉mysqld服务进程。
7: 再次通过服务管理,打开mysql服务。
8: 即可用修改后的新密码登陆。
空值参与运算
所有运算符
或列值
遇到null
值,运算的结果都为null。
注意:Mysql中,空值不等于空字符串。
一个空字符串长度是0,一个空值的长度是空。空值是占用空间的。
运算符
1、算数运算符
加(+
)、减(-
)、乘(*
)、除(/
)或(DIV
)和取模(%
)或(MOD
)运算。
整数 +或- 整数 = 整数
整数 +或- 浮点数 = 浮点数
- 只表示两数相加。非数值类型相加,先转数值计算,转失败,按0计算。(字符串拼接用 CONCAT() 函数)
数 *或/ 整数1 = 原数
数 *或/ 浮点数1 = 浮点数
数 / 整数 = 浮点数
数 / 另一个数 当除不尽时 = 浮点数 (保留4位小数)
数 / 0 = NULL
2、比较运算符
比较运算符:为真返回1,为假返回0,其他返回NULL。
3、非符号类型运算符
ESCAPE 和 \(转义符)
回避特殊符号的:使用转义符。
使用\表示转义,要省略ESCAPE。如果不是\,则要加上ESCAPE。
SELECT job_id FROM jobs WHERE job_id LIKE ‘IT$_%‘ ESCAPE '$';
REGEXP运算符
用于匹配字符串。
REGEXP运算符在进行匹配时,常用的有下面几种通配符:
(1)‘^’匹配以该字符后面的字符开头的字符串。
(2)‘$’匹配以该字符前面的字符结尾的字符串。
(3)‘.’匹配任何一个单字符。
(4)“[...]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”或“b”或“c”。为了命名字符的范围,使用一 个‘-’。“[a-z]”匹配任何字母,而“[0-9]”匹配任何数字。
(5)‘*’匹配零个或多个在它前面的字符。例如,“x*”匹配任何数量的‘x’字符,“[0-9]*”匹配任何数量的数字, 而“*”匹配任何数量的任何字符。
SQL语句示例如下:
4、逻辑运算符
注意:AND的优先级高于OR!
5、位运算符
位运算符是在二进制数上进行计算的运算符。
位运算符会先将操作数变成二进制数,然后进行位运算,最后将计算结果从二进制变回十进制数。
排序
使用 ORDER BY 子句排序。
ASC(ascend): 升序(默认)
DESC(descend):降序
分页
第二个参数“行数”指示返回的记录条数。
LIMIT [位置偏移量,] 行数
--前10条记录:
SELECT * FROM 表名 LIMIT 0,10;
或者
SELECT * FROM 表名 LIMIT 10;
--第11至20条记录:
SELECT * FROM 表名 LIMIT 10,10;
--第21至30条记录:
SELECT * FROM 表名 LIMIT 20,10;
MySQL 8.0中,“LIMIT 3 OFFSET 4” = “LIMIT 4,3;”
分页显式公式:*(当前页数-1)每页条数,每页条数。
多表查询
1、等值连接 vs 非等值连接
等值连接:连接条件是 =
。
非等值连接:连接条件是 >
、<
、>=
、<=
等。
2、自连接 vs 非自连接
自连接:自己连接自己。将一张表,以取别名的方式虚拟成两张表以代表不同的意义。进行自连接。
非自连接:自己连接别人。
3、内连接 vs 外连接
内连接
:结果集中,只有符合条件的记录
外连接
:结果集中,有符合条件的记录,还有左表 或 右表中符合条件的记录。
外连接分为:左外连接、右外连接、满(全)外连接。
左外连接
: 返回满足连接条件的行,返回左表中不满足条件的行。没有匹配的行时, 结果表中相应的列为空(NULL)。
右外连接
: 返回满足连接条件的行,返回右表中不满足条件的行。没有匹配的行时, 结果表中相应的列为空(NULL)。
在 SQL92 语法中采用(
+
)代表从表所在的位置。即左或右外连接中,(+) 表示哪个是从表
。
Oracle 对 SQL92 支持较好,而MySQL 则不支持 SQL92 的外连接
。
SQL92 语法中,没有 满(全)外连接。
#左外连接
SELECT last_name,department_name
FROM employees ,departments
WHERE employees.department_id = departments.department_id(+);
SQL92内连接
语法:
SELECT 字段列表
FROM A表 , B表
WHERE 等其他子句;
SQL99内连接
语法:
SELECT 字段列表
FROM A表 INNER JOIN B表
ON 关联条件 WHERE 等其他子句;
关键字
JOIN
、INNER JOIN
、CROSS JOIN
的含义是一样的
,都表示内连接
SQL99 左外连接
:
#实现查询结果是A
SELECT 字段列表
FROM A表 LEFT JOIN B表
ON 关联条件 WHERE 等其他子句;
SQL99 右外连接
:
#实现查询结果是B
SELECT 字段列表
FROM A表 RIGHT JOIN B表
ON 关联条件 WHERE 等其他子句;
SQL99 满外连接
:
MySQL不支持
FULL JOIN
,但是可以用LEFT JOIN UNION RIGHT JOIN
代替。
自然连接
在SQL92标准中:
SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id`
AND e.`manager_id` = d.`manager_id`;
等价于下边的自然连接:
在 SQL99 中你可以写成:
SELECT employee_id,last_name,department_name
FROM employees e NATURAL JOIN departments d;
USING连接
当我们进行连接的时候,SQL99还支持使用 USING 指定数据表里的 同名字段
进行等值连接
。但是只能配合JOIN一起使用。
SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
USING (department_id);
UNION
合并查询结果。
UNION
操作符:返回两个查询的结果集的并集,去除重复记录。
UNION ALL
操作符:返回两个查询的结果集的并集。不去重。
注意:执行UNION ALL语句时所需要的资源比UNION语句少。因为不去重。