软件设计之MySQL(2)

软件设计之MySQL(2)

此篇应在JavaSE之后进行学习:
路线图推荐:
【Java学习路线-极速版】【Java架构师技术图谱】
Navicat可以在软件管家下载
使用navicat连接mysql数据库创建数据库、表、转储sql文件,导入sql数据

学习内容:

  1. 基础的SELECT语句
  2. 运算符
  3. 排序与分页
  4. 多表查询
  5. 新特性:自然连接与USING

1、基础的SELECT语句

SELECT 字段1,字段2,…FROM表名
FROM DUAL 其中dual是伪表
SEKECT * FROM 表名 其中*表示所有的字段

列的别名

别名:alias,可以用一对“”引起来
结果集的概念:查询语句返回的结果叫做结果集
举例: SELECT 字段1 AS(可省略) 别名(可以另起一个名字)
结果集中对应的字段1会显示为设置的别名

去除重复行

默认情况下,查询会返回全部行,包括重复行
在SELECT语句中使用关键字DISTINCT去除重复行

SELECT DISTINCT department_id
FROM employees;

空值参与运算

空值:NULL
空值不等同于0,''
当空值参与运算时,结果一定也是空值(null)
commission_pct为null,则annual_sal返回的也是null

SELECT employee_id,salary,commission_pct,
12 * salary * (1 + commission_pct) "annual_sal"
FROM employees;

着重号

``TAB上的`
必须保证你的字段没有和保留字、数据库系统或常用方法冲突
当冲突的时候,在SQL中就需要使用着重号

SELECT * FROM  `order`

查询常数

在 SELECT 查询结果中增加一列固定的常数列
从employees表中查询corporation, last_name,并在结果中返回一列固定的常数列‘尚硅谷’

SELECT '尚硅谷' as corporation, last_name FROM employees;

显示表结构

使用DESCRIBE 或 DESC 命令,表示表结构
显示表中字段的详细信息,比如类型、是否可以写为空等

过滤条件

使用WHERE 子句,将不满足条件的行过滤掉

SELECT employee_id, last_name, job_id, department_id
FROM employees
WHERE department_id = 90 ;

2、运算符

算数运算符

      • (/ 或 div) (% 或mod)
        1、在SQL中 +没有连接的作用,仅表示加法运算,
        2、取模正负结果仅与被模数正负有关,且符号一致
SELECT 100 + '1' 
FROM DUAL;
SELECT 100 + 'a' 
FROM DUAL; # 非数字字符串进行加法运算,作为0处理
SELECT 100 + NULL 
FROM DUAL;# NULL
SELECT 100 DIV 0
FROM DUAL;# NULL

比较运算符

比较结果有三种,真返回1;假返回0,其他情况返回NULL
1、=等于:如果等号两边的值、字符串或表达式都为字符串,则MySQL会按照字符串进行比较,其比较的是每个字符串中字符的ANSI编码是否相等。
2、不等于:!= 或者 <>,此外还有非符号类型运算符
IS NULL:判断是否为空;IS NOT NULL :判断是否不为空 ISNULL(函数形式)
LEAST():返回最小值GREATEST():返回最大值.两字符串比较,不按长度,而是按从左至右的顺序比APP与ABD,ABD小
BETWEEN 条件下界1 AND 条件上界2
数据 IN(数据1,数据2,数据3) #查询数据中是否存在数据1,2,3,
LIKE ‘%a%’ :表示查询不确定有几个字符,但字符包含a或A的数据
LIKE ‘a%’ :表示查询末尾不确定有几个字符,但首个字符包含a或A的数据
3、<=>安全等于:为了处理NULL判断而出现
在这里插入图片描述

SELECT 1 = 1,  1!=2, 1= '1', 0 = 'a'
FROM DUAL;# 1,1,1,1
SELECT 'a' = 'a', 'a' = 'b'
FROM DUAL;# 1,0
SELECT 1 = NULL, NULL = NULL
FROM DUAL;# NULL,NULL
SELECT 1 <=>NULL, NULL<=> NULL
FROM DUAL;# 0,1
SELECT salary
FROM employees;
WHERE salary IS NOT NULL
SELECT salary
FROM employees;
WHERE ISNULL(salary)
SELECT LEAST('g','t'),GREATEST('a','b')
FROM DUAL;# g,b

逻辑运算符

1、四种逻辑运算符:或、与、非、异或
2、三种返回结果:1、0、NULL
3、逻辑非(NOT或!)运算符表示当给定的值为0时返回1;当给定的值为非0值时返回0;当给定的值为NULL时,返回NULL
4、逻辑与(AND或&&)运算符是当给定的所有值均为非0值,并且都不为NULL时,返回
1;当给定的一个值或者多个值为0时则返回0;否则返回NULL。(1 AND NULL 返回NULL)
5、逻辑或(OR或||)运算符是当给定的值都不为NULL,并且任何一个值为非0值时,则返
回1,否则返回0;当一个值为NULL,并且另一个值为非0值时,返回1,否则返回NULL;当两个值都为NULL时,返回NULL。
6、逻辑异或(XOR)运算符是当给定的值中任意一个值为NULL时,则返回NULL;如果
两个非NULL的值都是0或者都不等于0时,则返回0;如果一个值为0,另一个值不为0时,则返回1。
在这里插入图片描述

位运算符

按位与(&)运算符将给定值对应的二进制数逐位进行逻辑与运算。当给定值对应的二
进制位的数值都为1时,则该位返回1,否则返回0。
按位或(|)运算符将给定的值对应的二进制数逐位进行逻辑或运算。当给定值对应的
二进制位的数值有一个或两个为1时,则该位返回1,否则返回0。
按位取反(~)运算符将给定的值的二进制数逐位进行取反操作,即将1变为0,将0变
为1
按位取反(~)运算符将给定的值的二进制数逐位进行取反操作,即将1变为0,将0变
为1
在一定范围内满足:向左移一位,相当于乘2;向右移一位,相当于除以2
按位右移(>>)运算符将给定的值的二进制数的所有位右移指定的位数。右移指定的
位数后,右边低位的数值被移出并丢弃,左边高位空出的位置用0补齐
>按位左移(<<)运算符将给定的值的二进制数的所有位左移指定的位数。左移指定的
位数后,左边高位的数值被移出并丢弃,右边低位空出的位置用0补齐。

3、排序与分页

排序

1、如果没有使用排序操作,默认情况下查询返回的数据是按照添加的顺序显示的
2、使用ORDER BY 对查询到的数据进行排序操作[默认升序排列,从低到高]
3、升序操作:ASC(ascend)
4、降序操作:DESC(descend)
5、列的别名只能在ORDER BY中使用,却不能在WHERE中使用
解释:执行顺序是先从FROM选取表,再通过WHERE筛选,接着SELECT(这里才出现别名)
格式:WHERE需要声明在FROM后,ORDER BY之前

#以salary的降序排列,从高到低
SELECT employee_id,last_name,salary
FROM employees
ORDER BY salary DESC;

二级排序

当第一次排序有相同数值的情况下需要二级排序
先department_id降序,在基于此,对salary升序排列

SELECT employee_id,department_id,salary
FROM employees
ORDER BY department_id DESC,salary ASC;

分页

LIMIT关键字
顺序:WHERE>ORDER BY>LIMIT
公式:LIMIT (pageNo-1) * pageSize,pageSize;
8.0新特性: LIMIT pageSize OFFSET (pageNo-1) * pageSize

SELECT employee_id,last_name
FROM employees
LIMIT 0,20;# 0表示偏移量(从第一条数据开始),20表示每一页20条记录
SELECT employee_id,last_name
FROM employees
LIMIT 20,20;# 20表示偏移量(从第20条数据开始),20表示每一页20条记录

4、多表查询

笛卡尔积错误:是指当你在查询中没有使用适当的连接条件时,两个表的所有行的组合。这个错误通常会导致返回的结果集非常大,因为每一行都与另一个表中的每一行组合。例如,如果有两个表 A 和 B,表 A 有 10 行,表 B 有 20 行,那么没有任何连接条件的查询将返回 10 × 20 = 200 行的结果集。这种情况通常不是你想要的结果。
出错原因:省略多个表的连接条件(或关联条件)、连接条件(或关联条件)无效、所有表中的所有行互相连接
正确方式:需要有连接条件
注意点
1、如果查询语句中出现多个表都存在的字段,必须指明此字段所在的表
2、从SQL优化角度,建议多表查询时,每个字段前都指明其所在的表
3、可以给表起别名,在SELECT和WHERE中使用表的别名(使用了就得都用)
4、如果有n个表实现多表查询,则需要n-1个连接条件

#别名
SELECT emp.employee_id
FROM employees emp
WHERE emp.'department_id'=10;

多表查询分类

角度1:等值连接 vs非等值连接
角度2:自连接vs非自连接
角度3:内连接vs外连接

非等值连接

表1的值并非等于表2的值,而是处于表2值的某个范围

SELECT e.last_name, e.salary, j.grade_level
FROM employees e, job_grades j
WHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal;

自连接

自连接(Self-Join)是一种特殊类型的连接操作,其中一个表与自身进行连接。自连接通常用于在同一个表中比较记录或找出相关数据。它的主要用途是处理表中存在父子关系或相似记录的情况。

#每个员工ID对应了一个领导的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

UNION相关操作符

假设A有107条数据,B有108条数据,两人交集部分是106条数据
UNION操作符:返回两个查询结果的并集,去除重复记录,即1+106+2条数据
UNION ALL操作符,返回两个查询结果的并集,不去重,即1+106+106+2条数据
如果明确知道合并数据不存在重复,优先用UNION ALL

内连接与外连接

1、内连接返回两个表中符合连接条件的记录。也就是说,它只返回在所有表中都存在的匹配记录。如果某些记录在其中一个表中找不到匹配项,那么这些记录将不会出现在结果中。
2、外连接返回符合连接条件的记录以及在一个表中存在但在另一个表中没有匹配的记录。外连接分为三种类型:
(1)左外连接:返回左表中的所有记录以及右表中匹配的记录。如果右表中没有匹配项,结果中会显示左表的记录以及右表的空值(NULL)。
(2)右外连接:返回右表中的所有记录以及左表中匹配的记录。如果左表中没有匹配项,结果中会显示右表的记录以及左表的空值(NULL)。
(3)全外连接:返回两个表中所有记录。当一个表中的记录在另一个表中找不到匹配时,结果中会显示两个表的记录,并且没有匹配项的列显示 NULL。[MySQL不支持FULL OUTER JOIN]

#内连接,添加一个表join一下,再ON后加条件
SELECT last_name,department_name,city
FROM employees e 
JOIN departments d
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 d
ON e.department_id = d.department_id
#右外连接
SELECT last_name,department_name
FROM employees e 
RIGHT JOIN departments d
ON e.department_id = d.department_id

外连接解决方案

1、利用左上图和右中图UNION ALL连接
2、利用左中图和右上图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 e.department_id IS NULL

5、新特性:自然连接与USING

自然连接

它会帮你自动查询两张连接表中所有的相同字段,进行等值连接

USING

使用JOIN…USING可以简化JOIN ON的等值连接

SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id`
#使用USING
SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
USING (department_id);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值