查询限定
select *from rzdata;
这里指定了一个完全限定的列名,同样,我们也可以完全限定表名
select * from ruozedata.rzdata;
前提是user表在ruozedata数据库中存在
总结:列名前用表名限定,表名前用数据库名来限定
按条件查询 where语句
根据范围查询
< 、>、<=、>=、!=
小于、大于、小于等于、大于等于、不等于
例如
select * from ruozedata.rzdata where age<20;
若要大于某些数值的最大值,用all;大于最小值,用any
where e.sal+ifnull(comm,0) > all(select sal+ifnull(comm,0) from emp;
where e.sal+ifnull(comm,0) > any(select sal+ifnull(comm,0) from emp
根据名称查询
! 表示 非
select * from ruozedata.rzdata where name='djh';
按范围查询
where (e.sal+ifnull(e.comm,0)) between s.losal and s.hisal
多重条件同时筛选查询
and 表示 且;or 表示 或
select * from ruozedata.rzdata where age<20 and name='djh';
多重条件依次筛选查询
select * from emp order by sal desc,hiredate asc;
用逗号隔开,表示先后顺序
select * from emp order by sal desc,hiredate asc;
根据关键字模糊查询
% 表示模糊查询; _ 表示一个字符;
select * from ruozedata.rzdata where name like '%o%';
select * from ruozedata.rzdata where name like 'o%';
select * from ruozedata.rzdata where name like '%o';
select * from ruozedata.rzdata where name like '__o%';
select * from ruozedata.rzdata where name not like '__o%';
查询多项内容
select * from emp where (deptno=10 and job='manager') or (deptno=20 and job='salesman');
每个括号代表一项内容的条件,内容之间用or
合并查询 union join
create table a(id int,aname varchar(200),age int);
create table b(id int,bname varchar(200),address varchar(200));
insert into a values(1,'jy',45);
insert into a values(2,'ju',30);
insert into a values(3,'ji',65);
insert into b values(1,'jy','bj');
insert into b values(2,'ju','sh');
insert into b values(5,'jk','ty');
建立a表,项目为:id、名称、年龄
建立b表,项目为:id、名称、地址
查询ab表所有的用户 union
(重复) select id,aname from a union select all id,bname from b;
(不重复)select id,aname from a union select d,bname from b;
查询ab表重复的用户join
例:左连接,以左边的表为主体,右边的表只显示与左表重复的项目,不重复的用null表示
左连接select a.*,b.* from a left join b on a.id=b.id;
右连接select a.*,b.* from a right join b on a.id=b.id;
内连接select a.*,b.* from a inner join b on a.id=b.id;
若要排除null,可以在左连接中加入
where bname is not null;
排除右表中为null的数据,结果与内连接相同
与之相反,想要查看为null的数据,加上
where bname is null;
如果查询某些数据需要用到多个表格,则使用join函数
聚合函数
求数值之和 sum( )
select sun(age) from rzdata;
求数值的平均数
select avg(age) from rzdata;
注意:null+任意数值=null
如果有null,则用ifnull(xxx,0)来解决
select * from emp where (sal+ifnull(comm,0))>1500;
求行数之和 count( )
0 也可以表示第一列的项目名称
select count(id) from rzdata;
count ( distinct ) 去重
当项目id有重复时,要查寻项目个数
select count(distinct id) from rzdata;
求各个名称(group by)的年龄和
select name,sum(age) from rzdata group by name;
group by的用法:group by name 将数据按照name字段分组,然后再进行操作
当group by 与聚合函数配合使用时,功能为分组后计算
当group by 与having配合使用时,功能为分组后过滤
当group by 与聚合函数,同时非聚合字段同时使用时,非聚合字段的取值是第一个匹配到的字段内容,即id小的条目对应的字段内容。
select xxx,yyy,sum(age) from rzdata group by xxx,yyy
group by后边要加什么,在select后也要加上什么
子查询
先进行括号内的
①
select name,sum(age) from rzdata where age>20 group by name;
②
select t.name,sum(t.age) from
(
select*from rzdata where age>20
) as t
group by t.name;
对结果再进行筛选
求各个名称的年龄和 大于25的项目
①
select name,sum(age) from rzdata group by name having sum(age)>25;
②
select *from
(
select name,sum(age) as sumage from rzdata group by name
)as t
where t.sumage>25;
排序
从大到小排列 desc 倒序
select * from a order by age desc;
从小到大排列 asc 顺序 默认为顺序
select * from a order by age asc;
排序后只查两条数据
select * from a order by age desc limit 2;
语法顺序
select * from rzdata
(查看rzdata中的内容)
where age>20
(筛选年龄大于20的)
group by name having xxx
(将姓名分类,从来进行以上筛选,如果对筛选结果还有后续操作,用having语法)
order by age
(按照年龄大小从小到大排序)
limit xxx;
(限制查询行数)