mysql学习第一弹——查询基础
目录
- 一.SQL的分类
- 二.注释
- 三.数据的导入
- 四.基本SELECT语句
- 五.运算符
- 算术运算符
- 比较运算符
- 逻辑运算符
- 位运算符
- 六.排序和分页
- 排序
- 分页
- 七. 多表查询
- 为什么要多表查询?
- 多表查询典型错误——笛卡尔积
- 异表存有相同字段查询不明确的问题
- 多表查询的分类
一.SQL的分类
1.DDL(data definition language)数据定义语言
2.DML(data manipulation language) 数据操纵语言
3.DCL(Data Control Language)数据控制语言
SQL在windows环境下对大小写不敏感
还有分类为四种或五种的都大同小异,读者可以自行搜索
二.注释
- 单行注释
- #
- –
- 多行注释 /**/
多行注释可以嵌套单行注释,但不可以嵌套多行注释
三.数据的导入
- 命令行的方式
source sql文件的绝对路径
- 图形化界面以DBeaver为例
ctrl+shift+alt+o快速导入sql脚本
四.基本SELECT语句
- SELECT…FROM
# 良好的书写规范
SELECT 字段1,字段2…
FROM 表名;
- 别名
# AS是alias的缩写
# 别名是多个单词且没有连字符一定要用"",如 "full name"
SELECT 字段1 别名,字段2 AS 别名…
FROM 表名
- 去重
关键字 DISTINCT 用在 SELECT后
- 空值参与运算
# 空值与任何值运算的结果还是空值(null)
解决方法:IFNULL(字段,空值替换的值)
- 显示表的结构
DESCRIBE 表名 或
DES 表名
- 过滤数据
WHERE
五.运算符
算术运算符
+ - * /(div) %(mod)
- 注意SQL的+没有连接符的作用
- /(div)得到的结果肯定是浮点型或null
- 优先级为:先乘除取模再加减
比较运算符
常规:>
、<
、=
、<=
、>=
比较结果为真返回1,为假返回0,其余返回null
值得注意的是:
- 安全等于
<=>
可以对null进行判断,两边都是null返回1,只有一个null返回0 - 不等于运算符
<>或!=
字符串与不同类型比较的时候,会发生隐式转换,转换不成功返回0
如:
select 1='a', 0 = 'a'
结果为 0 1
# 安全等于
select 1<=>'1', null <=> null , null <=> 0
其他与null有关的操作符:
is null
is not null
isNull() #函数
模糊查询:
%
不确定个数的字符_
单个字符\
默认转义字符
# 查询last_name中包含字符'a'的员工信息
SELECT last_name
FROM employees
WHERE last_name LIKE '%a%';# 查询last_name中第二个字符是'a'的员工信息
SELECT last_name
FROM employees
WHERE last_name LIKE '_a%';# 查询last_name中第二个字符是'_'的员工信息
SELECT last_name
FROM employees
WHERE last_name LIKE '_\_%';
# 当然,我们也可以更换默认转义字符
WHERE last_name LIKE '_$_%' ESCAPE '$';
逻辑运算符
- 逻辑与
&&(and)
- 逻辑或
||(or)
- 逻辑非
!(not)
- 逻辑异或
xor
位运算符
~ & | ^ >> <<
和c语言一样
六.排序和分页
排序
用order by实现排序,注:没有指定排序方式默认升序
指定排序方式:
- ascend 升序
- descend 降序
# 按工资降序排列
select last_name,salary,department_id
from employees
order by salary asc
二级排序
在上面例子中会出现一个问题,工资会有相同的情况,那就会自动按照插入先后排序
当然我们也可以多重排序:
# 按工资降序,部门号升序排列
order by salary asc, department_id
分页
limit (pageNum - 1) * size , size #计算与页码的关系
# 每页显示二十条数据 这是第1页
select last_name ,salary
from employees
limit 0,20# 第三页
select last_name ,salary
from employees
limit 40,20
关键字声明顺序要求:
where …
order by …
limit …
从第n条数据后开始查询:
limit 跳过的条目 offset 偏移量#从30条数据后开始查询
select employee_id ,salary
from employees
order by employee_id desc #降序
limit 30 offset 2;
七. 多表查询
为什么要多表查询?
这里有个前置问题就是为什么要分表?
其实还是性能和效率问题,总会有不常使用的字段和可整合的字段,分库分表可以降低数据量,优化储存。
- 可以降低网络远程交互次数
- 减少加载冗余数据
多表查询典型错误——笛卡尔积
# 出现笛卡尔积错误
# 需求:通过员工表,查询工作地址id
/** employees 107条数据
* departments 27条数据* 查询结果 2889条数据 (28889 = 107 * 27)*/
select employee_id ,location_id
from employees ,departments
可以看到上述错误的结果集是employee与departments做笛卡尔积得到的集合
即: result = employees × departments
原因 没有链接条件或链接不正确
添加链接条件后:
select employee_id ,location_id
from employees ,departments
where employees.department_id =departments.department_id
异表存有相同字段查询不明确的问题
select department_id
from employees ,departments
where employees.department_id =departments.department_id
解决方法:指定表名 (为了便于多表查询,我们通常会给表起别名)
select dp.department_id
from employees ep ,departments dp
where ep.department_id = dp.department_id
如果有n表实现多表查询,至少需要n-1个链接条件
多表查询的分类
- 等值链接和不等值链接
- 自链接和非自链接
- 外链接和内链接
- 不等值链接
# 需求:查询员工的工资属于哪个等级
select e.last_name ,e.salary ,jg.grade_level
from employees e ,job_grades jg
where e.salary between jg.lowest_sal and jg.highest_sal
order by jg.grade_level asc
- 自链接
# 需求:查询员工的姓名,员工id,管理者姓名,管理者的员工id
select e.last_name ,e.employee_id,mag.last_name ,mag.employee_id
from employees e,employees mag
where e.manager_id = mag.employee_id
- 内链接与外链接
以下例子均以员工表 (A表)和 部门表 (B表) 为例
- inner join,即A ∩ B ,内链接还分为:
- 隐式内链接
- 显式内链接
# 隐式内链接
select e.last_name ,d.location_id
from employees e , departments d
where e.department_id = d.department_id # 显式内链接
select e.last_name ,d.location_id
from employees e inner join departments d
on e.department_id = d.department_id
inner
可以省略
- left outer join,即( A ∩ B ) ∪ A
select e.last_name ,d.location_id
from employees e left outer join departments d
on e.department_id = d.department_id
outer
可以省略
- right outer join,即( A ∩ B ) ∪ B
select e.last_name ,d.location_id
from employees e right outer join departments d
on e.department_id = d.department_id
- left excluding join,即A - ( A ∩ B )
select e.last_name ,d.location_id
from employees e left outer join departments d
on e.department_id = d.department_id
where d.department_id is null
- right excluding join,即B - ( A ∩ B )
select e.last_name ,d.location_id
from employees e right outer join departments d
on e.department_id = d.department_id
where e.department_id is null
- full outer join, 即A ∪ B
select e.last_name ,d.location_id
from employees e left join departments d
on e.department_id =d.department_id
union all
select e.last_name ,d.location_id
from employees e right join departments d
on e.department_id =d.department_id
where e.department_id is null
- outer excluding join,即(A ∪ B) - ( A ∩ B )
select e.last_name ,d.location_id
from employees e left join departments d
on e.department_id =d.department_id
where d.department_id is null
union all
select e.last_name ,d.location_id
from employees e right join departments d
on e.department_id =d.department_id
where e.department_id is null
上面的代码出现了union all
,我们来介绍其作用:
union all
操作符合并两个或两个以上 SELECT 语句的结果集,相当于 ∪
注意必须保持每条 SELECT 语句中的列的顺序和列的数量相同,也必须拥有相似的数据类型。
如以下使用是错误的:
# 两条 SELECT 语句列顺序不一致
select e.last_name ,d.location_id
from employees e left join departments d
on e.department_id =d.department_id
where d.department_id is null
union all
select ,d.location_id,e.last_name
from employees e right join departments d
on e.department_id =d.department_id
where e.department_id is null
union
操作符合并两个或两个以上 SELECT 语句并进行去重处理
UNION ALL 命令和 UNION 命令几乎是等效的,我们要尽可能的使用UNION ALL,效率更高
用using函数简化等值链接
使用条件:
- 查询必须是等值连接
- 等值连接中的列必须具有相同的名称和数据类型
select e.last_name ,d.department_name
from employees e join departments d
using(department_id,manager_id)
表atguigu的表,文中的练习和答案可以找我拿(不只文中)
mysql学习第一弹——查询基础相关推荐
- 掉进悬崖的小白,捡到python基础秘籍,学习第一周——语法基础,小游戏,无脑循环
掉进悬崖的小白,捡到python基础秘籍,学习第一周--语法基础,小游戏,无脑循环 人生苦短,我用python 语言的种类: 语言的发展: 什么是python 搭建 Python开发环境: 集成开发环 ...
- 大数据HiveSQL学习笔记三-查询基础语法以及常用函数
大数据HiveSQL学习笔记三-查询基础语法以及常用函数 一.基础语法 1.SELECT -列名- FROM -表名- WHERE -筛选条件- 如:需要根据城市,性别找出匹配的10个用户 user_ ...
- 前端学习第一周-计算机基础,html标签的介绍,其中包括列表,表格以及表单的使用
前端学习第一周-HTML基础 文章目录 前端学习第一周-HTML基础 前言 DAY 1 计算机组成 计算机网络 DAY 2 vscode快捷方式 HTML骨架 DAY 3 HTML属性 HTML标签 ...
- MySQL学习笔记-恶补基础篇
目录 概述 1.初识数据库 1.1.DataBase 1.2.数据库分类 1.3.DBMS(数据库管理系统) 1.4.命令行操作数据库 2.操作数据库 2.1.操作数据库 2.2.数据库列类型 2.3 ...
- ubuntu服务器mysql管理 第一弹
2019独角兽企业重金招聘Python工程师标准>>> 第一弹.在Ubuntu服务器上安装MySQL 注:服务器管理通过SecureCRT来管理操作. 由于Linux的强大,对于大多 ...
- MySQL学习笔记一之基础架构
MySQL学习笔记一之架构@TOC 架构图如下 Server层 连接器 负责跟客户端建立连接.获取权限.维持和管理连接 客户端如果太长时间没有动静,连接器会将其自动断开,时间由参数wait_timeo ...
- matlab 邻近度 离群点_Matlab基础学习第一弹!干货来啦!
传说中除了生孩子什么都会的Matlab,客官不考虑学一下嘛!(吐血码字快哭了的必必终于放弃了排版) 做project.参加美赛,写论文必备神器,除了当计算器使用,还可以画图,可以处理数字信号,甚至可以 ...
- 网络爬虫学习第一弹:urllib库使用
小道之前有学过一点爬虫,但是面对越来越严峻的就业形势,为了提高自身竞争力,决定系统的学习一下爬虫.用的是崔庆才大大的书.写博作为自己的学习笔记,方便以后复习.欢迎高人补充赐教!小道感激不尽! 网络爬虫 ...
- Mysql优化第一弹:彻底征服女朋友
人世仙家本自殊,何须相见向中途.惊鸿瞥过游龙去,漫恼陈王一事无. 嗨,大家好,我是洛神,性别男.一个来自快乐星球的程序员. 欢迎大家专注我的公众号[程序员洛神],我会不定期发放福利哟~ 前言 这篇文章 ...
最新文章
- 2021年大数据Hive(一):​​​​​​​Hive基本概念
- 架构设计|异步请求如何同步处理?
- ajax请求返回json实例,Jquery Ajax 学习实例2 向页面发出请求 返回JSon格式数据
- 阿里中间件再获高度肯定,“三位一体”推动技术普惠
- 华为发布《大交通时代》:开启未来数字交通宏图
- java写入carbondata_Carbondata使用过程中遇到的几个问题及解决办法
- amqp rabbitmq_Spring AMQP RabbitMQ示例
- 《圈圈教你玩USB》 第二章 USB 硬件系统设计_测试程序的编写和调试——看书笔记
- python设计程序界面_python图形界面(GUI)设计
- java 服务器程序部署环境搭建
- php条形码宽度,PHP条形码生成封装类
- 网友抽中淘宝大奖,怎料小丑竟是自己
- ictclas分词系统 java_1-Ictclas50分词系统ForJava
- Mysql 5.7 免安装版windows安装完整教程
- java方法案例:判断整数是奇数还是偶数
- renqun_youhua=2004892,竞价推广链接后缀标识都是什么含义?
- RGB图片处理(1)——RGB概念理解
- 基于Android课堂学习系统的文献综述
- 程序员如何从技术岗转为技术管理层
- SOUI视频教程 官方论坛