Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)(上):https://developer.aliyun.com/article/1580541
8 子查询【重要】
- 子查询将查询结果放在where 从句 和 from 从句后使用
8.1 子查询作为where条件
SELECT 列名 FROM 表名 Where 条件 (子查询结果)
多个: in(子查询)
高于最高: >all
高于最低: >any
-- 1、查询工资大于bruce的员工信息 -- 第一步:查询bruce的工资 select salary from t_employees where first_name = 'bruce'; -- 第二步:查询大于上面结果的员工信息 select * from t_employees where salary > 6000; -- 子查询写法 select * from t_employees where salary > ( select salary from t_employees where first_name = 'bruce') -- 2、查询与bruce同一个部门的员工信息(单个) -- 3、查询与king同一个部门的员工信息(多个) -- 第一步:查询king所在的部门 select department_id from t_employees where last_name = 'king'; -- 第二步:查询80、90部门的员工信息 select * from t_employees where department_id in (80,90) -- 子查询写法 select * from t_employees where department_id in (select department_id from t_employees where last_name = 'king') -- 4、查询工资高于60部门所有员工的员工信息(高于最高) select salary from t_employees where department_id = 60 select * from t_employees where salary >all (select salary from t_employees where department_id = 60) -- 5、查询工资高于60部门员工的员工信息(高于最低) select * from t_employees where salary >any (select salary from t_employees where department_id = 60)
8.2 子查询作为from查询
SELECT 列名 FROM**(子查询的结果集)**WHERE 条件;
-- 6、查询工资前五的员工信息 select * from t_employees order by salary desc -- 子查询写法 select * from (select * from t_employees order by salary desc) temp limit 0,5
总结:
- 子查询可用在from从句或者where从句后面使用
- 单行单列结果:一般用于where后面,直接做判断
- 多行单列结果:一般用于where后面,in、>all、>any
- 多行多列结果:一般用于from后面 注意:必须要给子查询取别名
9 连接查询【重要】
当需要查询的字段在不同的表中,那么需要进行连接查询
- 连接查询分类:
- 内连接
- 外连接
- 全连接(mysql不支持)
注意:如果对表直接进行连接查询,会产生笛卡尔积
/* 当查询数据不在同一张表中,那么需要使用连表查询 1、确定关联表 2、确定表的关系(消除笛卡尔积) 注意:多表连接查询的时候,会产生笛卡尔积(多张表的数据的乘积) 等值连接 连表查询 内连接 只有左表和右表中的数据之间互相的关联的数据才会被查询出来 语法1: select 列名,..... from 左表,右表 where 左表.关联字段 = 右表.关联字段 语法2: select 列名,..... from 左表 [inner] join 右表 on 左表.关联字段 = 右表.关联字段 外连接 左外连接 左表中所有的数据都会被查询出来 左表如果没有与右表与之关联,也会被查询出来,右表的数据使用null填充 语法:select 列名,..... from 左表 left join 右表 on 左表.关联字段 = 右表.关联字段 右外连接 右表中所有的数据都会被查询出来 右表如果没有与左表与之关联,也会被查询出来,左表的数据使用null填充 语法:select 列名,..... from 左表 right join 右表 on 左表.关联字段 = 右表.关联字段 全连接(mysql不支持) 合并查询: union:将多个查询结果进行合并,并且去重 union all:将多个查询结果进行合并 使用合并查询注意的地方: 1、两个结果集合并,要保证列数一致 2、两个结果集合并,类型要兼容 非等值连接 自连接 */
9.1 内连接
-- 查询员工的姓名、工资、入职日期、部门名称、部门位置、 -- 内连接查询 select ename,sal,hiredate,dname,location from emp,dept where emp.deptno = dept.dept no select ename,sal,hiredate,dname,location from emp join dept on emp.deptno = dept.deptno
9.2 左外连接
-- 左外连接查询 select ename,sal,hiredate,dname,location from emp left join dept on emp.deptno = dept.deptno
9.3 右外连接
-- 右外连接查询 select ename,sal,hiredate,dname,location from emp right join dept on emp.deptno = dept.deptno
9.4 全连接(不支持)
9.5 合并查询
-- 合并查询 select ename,sal,hiredate,dname,location from emp left join dept on emp.deptno = dept.deptno union select ename,sal,hiredate,dname,location from emp right join dept on emp.deptno = dept.deptno
- Union作用
- union 合并两个查询子集,且会去重
- union all 合并两个查询子集,不会去重
- 注意:合并的要保证列数相同,类型兼容
9.6 非等值连接
-- 非等值连接 -- 查询员工姓名、职位、工资等级 select ename,job,grade from emp left join salgrade on sal >= losal and sal <= hisal
9.7 表的自连接
-- 自连接 -- 查询员工姓名,以及经理的姓名 select e1.ename,e2.ename from emp e1 left join emp e2 on e1.mgr = e2.empno
10 DML 操作【重要】
10.1 新增
- 语法1:insert into 表名 (字段名1,…) values (值1,…)
- 语法2:insert into 表名 values(值1,值2,…);
要求:每一个字段都必须给值,且顺序要与表中的顺序一致
- 语法3:insert into 表名 (字段名1,…) values (值1,…),(值1,…),(值1,…),…
-- 增加 -- 语法1:insert into 表名 (字段名1,...) values (值1,...) -- 增加一个员工 insert into emp (empno,ename,job,sal) values (7778,'尼古拉斯','php开发',10000); -- 语法2:insert into 表名 values(值1,...) -- 要求:每一个字段都必须给值,且顺序要与表中的顺序一致 -- 增加一个员工 insert into emp values (7779,'尼古拉斯','php开发',7777,now(),10000,200,20); -- 语法3:insert into 表名 (字段名1,...) values (值1,...),(值1,...),(值1,...),.... -- 添加3个员工 insert into emp (empno,ename,job,sal) values (8881,'李雷','英语',8000),(8882,'韩梅梅','数学',8000),(8883,'马冬梅','体育',6000)
10.3 删除
- 语法:delete from 表名 [where 过滤条件]
注意:如果不写where条件那么就是全表删除(谨慎操作!!!)
-- 删除(逻辑删除) -- 语法:delete from 表名 [where 过滤条件] -- 注意:如果不写where条件那么就是全表删除(谨慎操作!!!) -- 删除编号为7778的员工信息 delete from emp where empno = 7778; -- 批量删除8881 8882 8883 8884 delete from emp where empno in(8881,8882,8883,8884); delete from emp -- 跑,别回头
11 数据类型 【了解】
11.1 数据类型
11.1.1 数值类型
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
INT | 4 字节 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
DOUBLE | 8 字节 | (-1.797E+308,-2.22E-308) | (0,2.22E-308,1.797E+308) | 双精度浮点数值 |
DOUBLE(M,D) | 8个字节,M表示长度,D表示小数位数 | 同上,受M和D的约束 DOUBLE(5,2) -999.99-999.99 | 同上,受M和D的约束 | 双精度浮点数值 |
DECIMAL(M,D) | DECIMAL(M,D) | 依赖于M和D的值,M最大值为65 | 依赖于M和D的值,M最大值为65 | 小数值 |
1.1.2 日期类型
类型 | 大小 | 范围 | 格式 | 用途 |
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | ‘-838:59:59’/‘838:59:59’ | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
1.1.3 字符串类型
/* 数值类型 整数型 int long 浮点型 float double double(n,m) 可以表示数字的位数 n:表示总位数(整数位数+小数位数) m:表示小数位数 举例:double(7,2) dicmal(n,m) 字符串类型 char 定长字符串 char(5) 最大只能储存5个字节,不满5个字节占5个字节空间 最大范围:0~255个字节 varchar 可变长字符串 varchar(10) 最大只能储存10个字节,不满10个字节占实际字节数的空间 最大范围:0~65535个字节 text 大型文本,最大范围:0~65535个字节 blob 以二进制的形式存储 最大范围:0~65535个字节 在以后的开发:视频、音频、图片 只在数据库存地址 日期时间类型 date 表示日期 time 表示时间 datetime 表示日期时间 timestamp 表示日期时间(时间戳) */
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)(下):https://developer.aliyun.com/article/1580558