- 熟悉关键字用法,掌握多表查询思路
文章目录
- 今日学习目标
- 学习内容
- 一、查询关键字
- 查询关键字之having过滤
- 查询关键字之distinct去重
- 查询关键字之order by排序
- 查询关键字之limit分页
- 查询关键字之regexp正则
- 二、多表查询思路
- 多表查询的思路
- 三、可视化软件navicat
学习内容
- 查询关键字
- 多表查询思路
- 可视化软件navicat
一、查询关键字
关键字功能讲解依靠例题讲解,争取做到通俗易懂。
例题数据
create table emp(
id int primary key auto_increment,
name varchar(20) not null,
sex enum('male','female') not null default 'male', #大部分是男的
age int(3) unsigned not null default 28,
hire_date date not null,
post varchar(50),
post_comment varchar(100),
salary double(15,2),
office int, #一个部门一个屋子
depart_id int
);
create table emp(
id int primary key auto_increment,
name varchar(20) not null,
sex enum('male','female') not null default 'male', #大部分是男的
age int(3) unsigned not null default 28,
hire_date date not null,
post varchar(50),
post_comment varchar(100),
salary double(15,2),
office int, #一个部门一个屋子
depart_id int
);
#插入记录
#三个部门:教学,销售,运营
insert into emp(name,sex,age,hire_date,post,salary,office,depart_id) values
('jason','male',18,'20170301','张江第一帅形象代言',7300.33,401,1), #以下是教学部
('tom','male',78,'20150302','teacher',1000000.31,401,1),
('kevin','male',81,'20130305','teacher',8300,401,1),
('tony','male',73,'20140701','teacher',3500,401,1),
('owen','male',28,'20121101','teacher',2100,401,1),
('jack','female',18,'20110211','teacher',9000,401,1),
('jenny','male',18,'19000301','teacher',30000,401,1),
('sank','male',48,'20101111','teacher',10000,401,1),
('哈哈','female',48,'20150311','sale',3000.13,402,2),#以下是销售部门
('呵呵','female',38,'20101101','sale',2000.35,402,2),
('西西','female',18,'20110312','sale',1000.37,402,2),
('乐乐','female',18,'20160513','sale',3000.29,402,2),
('拉拉','female',28,'20170127','sale',4000.33,402,2),
('僧龙','male',28,'20160311','operation',10000.13,403,3), #以下是运营部门
('程咬金','male',18,'19970312','operation',20000,403,3),
('程咬银','female',18,'20130311','operation',19000,403,3),
('程咬铜','male',18,'20150411','operation',18000,403,3),
('程咬铁','female',18,'20140512','operation',17000,403,3);
查询关键字之having过滤
where 和 having都是用来筛选数据的,
但是where 用于分组之前的筛选、having用于分组之后的筛选
eg:
统计各部门年龄在30岁以上的员工平均薪资,并保留平均工资大于10000的部门
select post,avg(salary) from emp where age > 30 group by post having avg(salary)>100000;
查询关键字之distinct去重
去重的前提是存在一模一样的数据
如果存在主键无法去重
#对有重复的展示数据进行去重 *** 作
select distinct id,age from emp;
select distinct post from emp;
查询关键字之order by排序
order by 默认是升序 默认关键字是asc
select * from emp order by salary asc;
select * from emp order by salary desc;
order by 排序支持多个字段组合
select * from emp order by age,salary;
select * from emp order by age asc,salary desc;
查询关键字之limit分页
#只跟一个数字
select * from emp limit 5; #从头开始展示几行数据
#求薪资最高的员工所有数据
1、先按照薪资降序排序
2、再使用limit限制取一行
select * from emp order by salary desc limit 1;
查询关键字之regexp正则
select * from emp where name regexp '^j.*(n|y)$';
#以j开头的所有任意字符,以n和y结尾的名字
二、多表查询思路
多表查询的思路
-
子查询
就相当于是我们日常生活中解决问题的方式(一步步解决)
将一条SQL语句的查询结果加括号当做另外一条SQL语句的查询条件eg:以昨天的员工表和部门表为例 查询jason所在的部门名称
子查询的步骤
1.先查jason所在的部门编号
2.根据部门编号去部门表中查找部门名称 -
连表 *** 作
先将多张表拼接到一起 形成一张大表 然后基于单表查询获取数据
eg:以昨天的员工表和部门表为例 查询jason所在的部门名称
连表 *** 作
1.先将员工表和部门表按照某个字段拼接到一起
2.基于单表查询
-
实际演练
create table dep( id int primary key auto_increment, name varchar(32) ); create table emp( id int primary key auto_increment, name varchar(32), gender enum('male','female','others') default 'male', age int, dep_id int ); insert into dep values(200,'技术'),(201,'人力资源'),(202,'销售'),(203,'运营'),(205,'安保'); insert into emp(name,age,dep_id) values('jason',18,200),('tony',28,201),('oscar',38,201),('jerry',29,202),('kevin',39,203),('jack',48,204);
-
使用子查询 获取jason所在的部门名称
-
先获取jason的部门编号
select dep_id from emp where name='jason';
-
将结果加括号作为查询条件
select name from dep where id=(select dep_id from emp where name='jason');
-
-
使用连表 *** 作 获取jason所在的部门名称
select dep.name from emp inner join dep on emp.dep_id=dep.id where emp.name='jason'
笛卡尔积(了解知识)
select * from emp,dep; # 会讲所有的数据全部对应一遍
select * from emp,dep where emp.dep_id=dep.id; # 效率低下
1.一条SQL语句的查询结果 我们也可以看成是一张虚拟表
2.如果一条SQL语句中设计到多张表的字段名称编写 建议使用表名前缀做区分
连表 *** 作有四个关键字
-
inner join 内连接
select * from emp inner join dep on emp.dep_id=dep.id;
只连接两张表中有对应关系的数据
-
left join 左连接
select * from emp left join dep on emp.dep_id=dep.id;
以左表为基准 展示所有的数据 没有对应项则用NULL填充
-
right join 右连接
select * from emp right join dep on emp.dep_id=dep.id;
以右表为基准 展示所有的数据 没有对应项则用NULL填充
-
union 全连接
select * from emp left join dep on emp.dep_id=dep.id union select * from emp right join dep on emp.dep_id=dep.id;
左右两表数据全部展示 没有对应项则用NULL填充
分析总结:
我们学会了连表 *** 作之后 其实就可以将N多张表拼接到一起
思路:我们可以将两张表拼接之后的结果起别名当做一张表使用然后再去跟另外一张表拼接
Navicat可以充当很多数据库软件的客户端 提供了图形化界面能够让我们更加快速的 *** 作数据库
内部封装了SQL语句 用户只需要鼠标点点点就可以快速 *** 作
连接数据库 创建库和表 录入数据 *** 作数据
外键 SQL文件 逆向数据库到模型 查询(自己写SQL语句)
使用navicat编写SQL 如果自动补全语句 那么关键字都会变大写
对于基础使用个人比较推荐看一下这篇博客
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)