数据查询
一. 简单查询
#创建一个班级
create table empname(
empid int primary key,
ename varchar(20)
sex tinyint,
clas varchar(20)
);
create table emp(
eid int primary key auto_increment,
)
#删除外键的时候要先删emp这个表才行
#添加内容需要先添加到加了外键的另一张表中
#添加数据 (新建一个查询insert)
use shujuku;
insert into empname values(100,"小明",1,"设计部"),(101,"小摆",2,"程序部"),(102,"小留",1,"程序部"),(103,"小小",1,"管理部"),(104,"小金",2,"")
insert into emp values(null,100),(null,101),(null,102),(null,103),(null,104)
- 查询特定的列
select *from emp;
select *from empname;
- 查询所有的列
select ename from empname; #ename是列名 empname是表名
select sex from empname;
#查询其中的几项用,隔开就行了
select ename,sex from empname;
- 给列起别名
select ename as "姓名",clas as "部门",sex as "性别";
#as可以不写,中间用空格隔开即可 select ename "姓名",clas "部门",sex as "性别";
- 合并相同的项
select * from emp;
#查询emp中有多少部门(数据表见最下面)
select distinct deptid from emp;#去掉重复的那些 只看到不重复的
- 查询时执行计算
#查询员工工资
select ename "姓名",salary*12 "年薪" from empname;
- 结果集的排序
#查询员工工资 按照工资排序
select ename "姓名",salary "工资" from empname order by salary asc;#asc默认升序 desc降序
- 条件查询
#查询员工工资大于一千的人
select * from empname where salary>=1000
- 模糊条件查询
select ename from empname where ename like '小_'
#查询带“小”字开头的,并且后面只有一个字符
#%表示有0~n个字符 _表示1个字符
#条件实在 where 关键词的后面写
#like:一种好像的意思
- 分页查询
#关键词:limit
#第一页:
select * from empname limit 0,3;
#查找到第1,2,3条
#第二页:
select * from empname limit 3,3;
#m表示从数据第m条开始查询
#n表示从m条开始的后n条开始查询
#当limit只有一个参数的时候
select * from empname limit 5;
#查询前5条数据
*提示:页码 = (当前页数-1)页码数据量
eg
#来个大练习
#创建数据库
set names utf8;
drop database if exists pra;
create database pra charset=utf8;
#进入数据库
use pra;
#创建数据表
#emp(设置外键) empname deptemp
create table empname(
empid int primary key,
ename varchar(8),
salary decimal(9999999),
brithday date
);
create table deptemp(
deptid int primary key,
dept varchar(8)
);
create table emp(
eid int primary key auto_increment,
#设置外键
empid int,
foreign key(empid) references empname(empid)#第一个empid是emp表里的
deptid int,
foreign key(deptid) references deptemp(deptid)
);
desc emp;#查看外键
insert into empname values(100,"小明",1000,2020-09-03),(101,"小红",2000,2020-09-04),(102,"小蠢",3000),(103,"小憨",4000,2020-09-05),(104,"小玲",5000,2020-09-06),(105,"小明",6000,2020-09-07)
insert into deptemp values(401,"设计部"),(402,"程序部"),(403,"教育部"),(404,"游戏部");
#向emp中插入数据
insert into emp values
(null,100,401),(null,101,402),(null,102,403),(null,103,404),(null,104,401),(null,10,402)
二. 复杂查询
- 聚合查询/分组查询
- 聚合函数
- 获取数量
select count(*) from empname;
#获取这一项有多少个
- 求总和
select sum(salary) from empname;
- 求平均数
select avg(salary) from empname where sex = 1
#求女生的平均工资
- 求最大最小值
select max(salary) as "最高工资",min(salary) as "最低工资" from empname where sex = 0;
#where 是查询男生或者女生
- 获取当前数据中的年份数值
select year(birthday) from empname;
- 获取当前数据中的月份数值
select month(birthday) as
"月份",year(birthday) as "年份" from empname;
- 分组查询
group by
select avg(salary),max(salary),min(salary),sex from empname group by sex;
#分组查询只能查询聚合函数和分组条件
- 子查询
子查询就是把一个sql语句的查询结果作为另一个sql语句的查询条件
#先查询小明的工资
select salary from empname where ename = "小明 "
#查询高于小明工资的员工
select ename,salary from empname where salary> (select salary from empname where ename = "小明 ")
- 多表查询(跨表查询)
- 内连接
#inner join ...on...
select * from emp inner Join empname on empid=empid
#多表查询避免笛卡尔积
select eid,ename from emp,empname where empids =empid
- 左外连接
#left outer join ...on...
select * from emp left outer join empname on empids=empid;
select eid,ename from emp,empname where empid=empid;
- 右外连接
#right outer join ...on...
select * from emp right outer join empname on empids=empid;
select eid,ename from emp,empname where empid=empid;
- 全连接
#mysql 不支持全连接full join...on.. 所以用union合并相同项
(select * from emp left outer join empname on empids=empid)
union #合并相同项
#union all 不合并相同项
(select * from emp right outer join empname on empids=empid);