JAVA 中SQL 查询语句⼤全,select 多表查询,各种查询
以员⼯表:emp 为例
id
name gender birthday dept job sal bonus 编号姓名性别⽣⽇部门职位薪资奖⾦
1. 基本查询
– 查询emp表中的所有员⼯信息
– 查询emp表中的所有员⼯的姓名、薪资、奖⾦
– 查询emp表中的所有部门, 剔除重复的记录, 提⽰: distinct⽤于剔除重复值
2. where⼦句查询
对表中的所有记录进⾏筛选、过滤使⽤where⼦句,下⾯的运算符可以在 WHERE ⼦句中使⽤:
(1) between x and y //(在x~y之间的值)。 (2) like // 模糊搜索,可配合 “%” 和 “_” 等符号。 (3) “%” //表⽰
通配,表⽰0或多个字符。 (4) 下划线 //表⽰⼀个字符串。 (5) and //表⽰并的关系,当两边的条件都为true时结果才为true, (6) or //表⽰或的关系,当两边只要有⼀边为true,结果就为true (7) not //表⽰对条件取反。 (8) > ⼤于 <⼩于 =等于 <>不等于或!= >=⼤于等于<=⼩于等于 (9) in //指定针对某个列的多个可能值 (10)as //定义别名
– 查询emp表中薪资⼤于3000的所有员⼯,显⽰姓名、薪资
– 查询emp表中总薪资(薪资+奖⾦)⼤于3500的所有员⼯,显⽰姓名、总薪资
提⽰:as⽤于定义别名(仅在查询的结果中作为列的表头显⽰)
– 查询emp表中薪资在3000和4500之间的员⼯,显⽰姓名和薪资
– 查询emp表中薪资为1400、1600、1800的员⼯,显⽰姓名和薪资
– 查询emp表中姓名中以"刘"开头的员⼯,显⽰姓名。
– 查询emp表中姓名以"刘"开头并且不超过2个字的员⼯,显⽰姓名。select * from emp;
1 select name,sal,bonus from emp;
1 select distinct dept from emp;
1select name,sal from emp where sal>3000;
1select name, sal+bonus from emp where (sal+bonus)>3000; -- 或select name, sal+bonus as 总薪资 from emp where (sal+bonus)>3000;
1
23select name,sal from emp where sal between 3000 and 4500;
1select name,sal from emp where sal in(1400,1600,1800);
1select name  from emp where name like '刘%';
1select  name  from emp where name like '刘_';
1
– 查询emp表中姓名中包含"涛"员⼯,显⽰所有字段。
“%” 表⽰通配,表⽰0或多个字符。"_"表⽰⼀个字符串
– 查询emp表中薪资⼤于4000和薪资⼩于2000的员⼯,显⽰姓名、薪资。
– 查询emp表中薪资⼤于3000并且奖⾦⼩于600的员⼯,显⽰姓名、薪资、奖⾦。
4. 排序查询
对查询的结果进⾏排序使⽤ order by关键字。
order by 排序的列 XXX asc 升序 order by 排序的列 XXX desc 降序 – 对emp表中所有员⼯的薪资进⾏升序(从低到⾼)排序,显⽰姓名、薪资。
– 对emp表中所有员⼯的总薪资进⾏降序(从⾼到低)排序,显⽰姓名、总薪资。
5. 分组查询
对所查询的记录可以根据某⼀列进⾏分组, 分组使⽤group by。
– 将员⼯按照部门进⾏分组
– 对emp表按照部门进⾏分组, 并统计每个部门的⼈数, 显⽰部门和对应⼈数
– 对emp表按照部门进⾏分组, 求每个部门的最⾼薪资(不包含奖⾦)
6. 聚合函数查询
1、max()或min() – 求所查询记录中指定列的最⼤值或最⼩值
2、count() – 求所查询记录中指定列的记录数
3、sum() – 求所查询记录中指定列的总和
4、avg() – 求所查询记录中指定列的平均值
– 查询emp表中最⾼薪资
– 查询emp表中最⾼总薪资
– 统计emp表中薪资⼤于3000的员⼯个数select * from emp where name like '%涛%';1select name,sal from emp where sal<2000 or sal >4000;1select name,sal,bonus from emp where sal>3000 and bonus<600;1 select name ,sal  from  emp  order  by  sal  asc;
1select name, sal+bonus as 总薪资 from emp order by (sal+bonus) desc;1 select * from emp group by dept;
1select dept 部门名称, count(*) 部门⼈数 from emp group by dept;1select max(sal) 总薪资 from emp group by dept;1select max(sal) as 最⾼薪资 from emp;1select max(sal+bonus) as 最⾼总薪资 from emp;
1select count(*) from emp where sal>3000;
1
– 统计emp表中所有员⼯的总薪资(不包含奖⾦)
– 统计emp表员⼯的平均薪资(不包含奖⾦)
!!重要提⽰:
a) 可以使⽤count(*)统计记录⾏数
b) 多个聚合函数可以⼀起查询
sql语句查询不包含
– 例如:根据部门进⾏分组,统计每个部门员⼯⼈数和平均薪资
c) 聚合函数不能⽤在where⼦句中
d) 在没有分组的情况下,聚合函数不能和其他普通字段⼀起查询
– 例如: 查询emp表中薪资最⾼的员⼯姓名, 下⾯的写法是错的:
name, max(sal) from emp;–结果是错的
– 正确的查询:
7. 其他函数
数值函数 (1)ceil(数值) – 向上取整 (2)floor(数值) – 向下取整 (3)round(数值) – 向下取整 (4)rand(数值) – 随机数 – emp表中所有员⼯薪资上涨15.47%, 向上取整。
⽇期函数 (1)curdate() – 返回当前⽇期(年⽉⽇) (2)curtime() – 返回当前时间(时分秒) (3)now() – 返回当前⽇期+时间(年⽉⽇ 时分秒)
(4)date_add()、date_sub() – 增加/减少⽇期 (5)year()、month()、day()、hour()、minute()、second(),分别⽤来获取⽇期中的年、⽉、⽇、时、分、秒
– 查询系统当前时间。
– 查询emp表中所有员⼯的年龄,显⽰姓名、年龄。
– 查询emp表中所有在1993和1995年出⽣的,显⽰姓名、出⽣⽇期。
8. 外键和表关系
**外键:**唯⼀标识其他表中的⼀条记录,⽤来通知数据库两张表列与列之间的对应关系, 并让数据库帮我们维护这样关系的键就叫做外键。
例如:员⼯表的部门id列(dept_id)和部门表的id列具有⼀ ⼀对应的关系, 其中dept_id就是外键。
外键作⽤: 确保数据库数据的完整性和⼀致性
添加外键: 例如:foreign key(dept_id) references dept(id)select sum(sal) as 员⼯总薪资 from emp;
1select avg(sal) as 员⼯平均薪资 from emp;
1select dept, count(*) 员⼯⼈数, avg(sal) 平均薪资 from emp group by dept;
1select name, sal from emp where sal=( select max(sal) from emp );-- ⼦查询1
2
3  select name,sal, ceil(sal*1.1547) from emp;
1select now();1select name,year(curdate()) - year(birthday) 年龄 from emp;
1select name,birthday from emp where year(birthday) between 1993 and 1995;
1
表关系: ⼀对多(多对⼀) (1)⼀个班级中可能会有多个学⽣(1~) (2)⼀个学⽣只能属于⼀个班级(11),两者合并结果还是1 因此,班级表和学⽣表是⼀对多的关系 对于⼀对多的两张表,可以在多的⼀⽅添加列,保存⼀的⼀⽅的主键,从⽽保存两张表之间的关系 ⼀对⼀ (1)⼀个班级对应⼀个教室(1~1) (2)⼀个教室也只对应⼀个班级(11),两者合并结果还是11 因此,班级表和教室表是⼀对⼀的关系 对于⼀对⼀关系的两张表,可以在任意⼀张表中添加列,保存另⼀张表的主键,从⽽保存两张表之间的关系 多对多 (1)⼀个学⽣对应多个⽼师(1~) (2)⼀个⽼师也对应多个学⽣(1*),两者合并结果是* 因此,学⽣表和⽼师表是多对多的关系 对于多对多的关系,可以拆分成两张⼀对多的关系,⽆法在两张表中添加列保存关系,但我们可以添加⼀张第三⽅的表(专门保存两张表的关系),保存两张表的主键,从⽽保存两张表的关系。 多表连接查询 连接查询:将两张或者两张以上的表,按照指定条件查询,将结果显⽰在⼀张表中。 多张表查询的语法:
如果表名过长,可以为表添加别名以⽅便书写
上⾯⼩写的a和b就是A和B表的别名:
– 查询部门和员⼯两张表
上⾯查询的结果中存在⼤量错误的数据, 如果想正确显⽰部门及部门对应的员⼯,可以通过where⼦句从中筛选正确的数据.
– 查询部门和部门下的员⼯。
上⾯的查询(inner join…on…)⽅式也叫做内连接查询
外连接查询 1.左外连接查询 显⽰左侧表中的所有记录,如果在右侧表中没有对应的记录,则显⽰为null 语法:
– 查询所有部门和部门下的员⼯,如果部门下没有员⼯,显⽰null
以上结果会显⽰(左侧表)所有部门,如果某部门下没有员⼯,(右侧表)则显⽰为null
2. 右外连接查询 显⽰右侧表中的所有记录,如果在左侧表中没有对应的记录,则显⽰为null 语法:
– 查询部门和所有员⼯,如果员⼯没有所属部门,显⽰ from A, B...
1
2
< from A a,
1
23select * from dept,emp;
1
2select * from dept d,emp e where d.id=e.dept_id;或select * from dept d inner join emp e on d.id=e.dept_id;1
2
3
4
5
6select ...from a left join b on(a.id=b.xid)
1
2select * from dept d left join emp e on d.id=e.dept_id;
1
2select ...from a right join b on(a.id=b.xid)
1
2select * from dept d right join emp e on d.id=e.dept_id;
1
2
以上结果会显⽰(右侧表)所有员⼯,如果员⼯没有所属部门,(左侧表)则显⽰为null
3. ⼦查询 所谓的⼦查询,其实就是将⼀个查询得出的结果,作为另外⼀个查询的条件。 格式:
(1)列出薪资⽐’王⼩⼆’⾼的所有员⼯,显⽰姓名、薪资
– 先查询出’王⼩⼆’的薪资
– 再查询⽐王⼩⼆薪资(2450)⾼的员⼯
(2)列出与’赵六’从事相同职位的所有员⼯,显⽰姓名、职位、部门。
– 先关联, 查询员⼯及员⼯对应的部门
– 再查询’赵六’的职位
– 最后筛选, 筛选出和’赵六’相同职位的员⼯
(3)列出薪资⾼于在’⼤数据部’(已知部门编号为30)就职的所有员⼯的薪资的员⼯姓名和薪资、部门名称。– 查询出’⼤数据部’的最⾼薪资
– 关联查询, 查询员⼯的姓名,薪资, 部门名称
多表查询 1、**(左外连接)**列出所有部门和部门下的员⼯,如果部门下没有员⼯, 显⽰为null。
2、**(关联查询)**列出在’销售部’任职的员⼯,假定不知道’销售部’的部门编号。
– 先查询员⼯及员⼯所属部门
– 再筛选过滤,查询部门名称为’销售部’的员⼯()
1
23select sal from emp where name='王⼩⼆';
1select name, sal from emp where sal>( select sal from emp where name='王⼩⼆');
1
2
3select e.name, e.job, d.name from emp e, dept d where e.dept_id=d.id;
1select name, job from emp where name='赵六';
1select e.name, e.job, d.name from emp e, dept d where e.dept_id=d.id and job=(select job from emp where name='赵六');
1select max(sal) from emp where dept_id=30;
1select e.name, e.sal, d.name from emp e, dept d where e.dept_id=d.id and sal>(select max(sal) from emp where dept_id=30);1select d.id, d.name, e.name, e.dept_id from dept d left join emp e on e.dept_id=d.id;
12select e.name, e.dept_id, d.id, d.name from emp e, dept d where e.dept_id=d.id;
1
2
3select e.name, d.id, d.name from emp e, dept d where e.dept_id=d.id and d.name='销售部';1
2
3

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。