【MySQL】总结

mysql的注释

mysql的注释有4 种 : 

“#”  : # 开头到行尾的都为注释,只能注释一行
  “-- ” (2个减号 一个空格) : -- 开头到行尾都为注释 , 只能注释一行
 “/*   xxx */"   :  可以注释多行,但是一定要闭合,不然出错
  ”/*!  数字    代码  */"  :  可以跨行注释,但是一定要闭合,不然出错。

其中 ,   ”/*!  数字    代码  */" 是有特殊含义的 
例如: /*!40101 SET NAMES gbk */;  代表的是  如果mysql 版本大于4.0.1.01  ,就执行后面的 set names gbk 这句代码。
这就有一个好处,这样就可以把mysql 特有的功能用这种注释,给注释掉,对于非mysql数据库可以正常运行,不需要修改,
而对于mysql 数据库,就可以利用这些特性。

来源: mysql的注释 - mxking - 博客园 (cnblogs.com)

SELECT

# 1
SELECT 1
FROM DUAL; #dual: 伪表
# 2
SELECT * FROM employee; #*:表中所有的字段(或者列)
# 3
# 列的别名 
# 空格 AS:alias(别名) "" 
SELECT employee_id emp_id,last_name AS lname,department_id "部门"
FROM employees;
# 4
# 去除重复行
SELECT DISTINCT department_id
FROM employee;
# 语法不错,但没有实际意义
SELECT DISTINCT department_id,salary
FROM employee;
# 5
# 空值:null
# null 不等同于0,‘’,‘null'
# 空值参与运算 : 其结果也为 空
# IFNULl( ,0)
# 6
# 着重号 ``
# 
# 7
# 查询常数 
SELECT 123,'查询常数',department_id
FROM employee;
# 8
DESCRIBE employees; # 显示了表中字段的详细信息
DESC employee;
# 9
# 过滤
# WHERE 需要跟在 FROM 后面
SELECT *
FROM employee;
WHERE department_id = 90;


SQL在windows 下除了 字符串 不区分大小写

MySQL 都不区分 也不区分 "" ''

运算符

#算数运算符
+ - * / div % mod

SELECT 100 + '1' #将字符串转换成数值(隐式转换) 
FROM DUAL;
# 101
SELECT 100 + 'a' #将'a' 看作 0 处理
FROM DUAL;
SELECT 100 + NULL #null值参与运算,结果为null
FROM DUAL;

/ DIV
100/2 => 50.0000
100 DIV 0 => null

% mod
结果的符号与被模数 有关 , 与模数无关
比较运算符
符号
= <=>  <> !=  > =>

SELECT 1 = 'a' # 'a' 看作 0 
FROM DUAL;
SELECT 'a'='b' # =>0 本身的ANSI码比较
FROM DUAL;
# 只要有NULL参与 结果都为 NULL
SELECT lase_name,commission_pct
FROM employees;
WHERE commission_pct = NULL; #此时执行 ,都为NULL 不会有任何结果

<=> 安全等于
null <=> null => 1
null <=>      => 0

两边有NULL参与的 都是 NULL

关键字
IS NULL  \  IS NOT NULL  \  ISNULL
SELECT last_name,salary,commission_pct
FROM employees
WHERE commission_pct IS NULL;
SELECT last_name,salary,commission_pct
FROM employees
WHERE commission_pct IS NOT NULL;
SELECT last_name,salary,commission_pct
FROM employees
WHERE ISNULL(commission_pct);  # <=> null  \  commission_pct IS NULL

NOT 可以把结果0=》1 1=》0
e.g.
SELECT last_name,salary,commission_pct
FROM employees
WHERE NOT commission_pct <=> null;

# LEAST()  \  GREATEST()
# 字典序
# 如果要比字符串的长短  LEAST(LENGTH(字符串),LENGTH(字符串))
# 最后的结果是 字符串的长度


# BETWEEN 条件下界 AND 条件上界 (包含边界)
等价于  >= and <=  &&
NOT BETWEEN AND 
等级与  >= or <=

# in (set) \ not in (set)  离散的 
SELECT last_name,salary,department_id
FROM employees
WHERE department_id = 10 OR 20 OR 30   返回值为1 ,所以将所有的都显示出来了
WHERE department_id = 10 OR department_id = 20 OR department_id = 30;
WHERE department_id IN (10,20,30);

# LIKE :模糊查询
SELECT last_name
FROM employees
WHERE last_name LIKE '%a%'; 
% 代表 不确定个数的字符  'a%' 代表以a开头的字符串
_ 代表 一个不确定的字符
last_name LIKE '%a%e%' OR last_name last_name '%e%a%'
last_name LIKE '%a%' AND last_name LIKE '%e%'
\_ 转义字符 就是个_
如果让 & 其他符号 充当转义字符前面的标志 可以
'_&_' ESCAPE '&'

# REGEXP  \  RLIKE 正则表达式
逻辑运算符
NOT !
AND &&
OR ||
XOR 异或 同为假,异为真

AND 优先级高于 OR
位运算符
& | ^ ~ << >>

排序 分页 

ORDED BY
ASC    (ascend)
DESC	(descend)
若 没有显示指明 ,默认升序

# 可以用列的别名,进行排序 
列 的别名,只能在ORDER BY中使用,不能再WHERE 中使用

#
SELECT employee_id,salary			//2	//3别名
FROM employees				//1
WHERE department_id IN(50,60,70)		//1
ORDER BY department_id DESC;		//4排序

#二级排序
 ORDER BY department_id,salary ASC ; #默认就是升序

分页
LIMIT
SELECT employee_id,salary		
FROM employees	
LIMIT 0,20;   	//第一个为 偏移量 ,第二个为 每页有多少条记录

LIMIT (pageNO-1)*pageSize,pageSize;
LIMIT	位置偏移量,条目数
LIMIT 	0,条目数  等价于  LIMIT  条目数 

声明顺序
WHERE	ORDER BY	LIMIT

8.0新特性
LIMIT 31 , 2;
LIMIT 2 OFFSET  31	(在OFFSET前后相反)

LIMIT 可以使用在 MySQL pgsql    

多表查询

笛卡尔积

缺少了 多表连接的条件 

两个表的连接条件

WHERE employees.'department_id=departments.'department_id';

NULL 

从sql优化角度,每个字段前都指明其所在的表

WHERE中可以用表的别名 ,表的别名在FROM中声明

表的别名声明后,原先出现表明的地方只能用别名(覆盖)

列 的别名 定义后 也可以使用原名

FROM中的字段最先执行

有n个表至少需要n-1个连接条件

多表查询的分类

1.等价连接  非等价连接

2. 自连接 非自连接

3. 内连接 外连接

#1 非等价连接
SELECT last_name,salary,grade_level
FROM employees e,job_grades j
#WHERE e.`salary` between j.`lowest_sal` AND j.`highest_sal`;
WHERE e.`salary`>=j.`lowest_sal`AND e.`salary`<=j.`highest_sal`;

#自连接
SELECT emp.employee_id,emp.last_name,mgr.employee_id,mgr.last_name
FROM employees emp,employees mgr
WHERE emp.`manager_id`=mgr.`employee_id`;

# 内连接 
#外连接  合并具有同一列的两个以上的表 
# 左外连接 右外连接 满外连接

SQL92
MySQL不支持
内连接:
SELECT emp.employee_id,emp.last_name,mgr.employee_id,mgr.last_name
FROM employees emp,employees mgr
WHERE emp.`manager_id`=mgr.`employee_id`;
外连接: 
先找到是左外连接 还是 右 连接
SELECT emp.employee_id,emp.last_name,mgr.employee_id,mgr.last_name
FROM employees emp,employees mgr
WHERE emp.`manager_id`=mgr.employee_id(+);
#WHERE mgr.employee_id(+) = emp.`manager_id`;

SQL99
JOIN ON
内连接
SELECT last_name,department_name,city
FROM employees e JOIN departments d    #INNER JOIN
ON e.department_id = d.department_id
JOIN locations l
ON d.location_id = l.location_id;
外连接
SELECT last_name,department_name
FROM employees e LEFT JOIN departments #LEFT OUTER JOIN
ON e.department_id = d.department_id 
#满外链接 FULL OUTER JOIN 但MySQL不支持

UNION  
UNION ALL
能用UNION ALL 不用 UNION

# 中图:内连接
SELECT employee_id,department_name
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id`

# 左上图:左外连接
SELECT employee_id,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`;

# 右上图:右外连接
SELECT employee_id,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`;

# 左中图:
SELECT employee_id,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL;

# 右中图
SELECT employee_id,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL;

# 左下图 满外连接
# UNION ALL 列数要一样 列的类型也要一样
SELECT employee_id,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
UNION ALL
SELECT employee_id,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL;

#右下图 
SELECT employee_id,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL 
SELECT employee_id,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL;
# SQL99 新特性

# 1.自然连接
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`;
# 自动将所有相同的字段,进行 邓加连接
SELECT employee_id,last_name,department_name
FROM employees e NATURAL JOIN departments d;

#2. USING
SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id`    #这句等价于 USING
#当两个表的连接 的条件 是相同的字段时
USING (department_id);

连接约束 

WHERE ON USING

单行函数
MySQL 
数值类型
字符串
日期时间
流程控制
加密与解密
信息函数
LENGTH() 与字节数有关 一个汉字占三个字节 
INSERT() 字符串索引从1开始
CURDATE(),CURDATE()+0
2022-7-16  20220716

格式化:日期 =》字符串

解析: 字符串=》日期

SELECT *
FROM employees
WHERE hire_date = '2022-7-16';
隐式解析
PASSWORD()
ENCODE()
DECODE
在MySQL8.0中已弃用
AVG=SUM/COUNT
都忽略了NULL

 

来源:MySQL数据库教程天花板,mysql安装到mysql高级,强!硬!_哔哩哔哩_bilibili 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

返返返

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值