查询数据(重点)select
1.1:查询所有字段
select * from student;
1.2:查询指定的字段
select id,name from student;
1.3:查询时指定别名
select id as 别名,name as 别名 from student; // 在这里as是可以不写
1.4:查询时添加常量列
---需求:查询学生数据时添加一个“年级”列,值为“java就业班”
alter table student add column '年级' ;// 在这样的话就时永久的添加到啦student表中,但我们现在的需求是在查询中去添加,并不时真的要去
添加一个列到student表中,动态的加,临时使用
select id '编号',name '姓名',’java就业班‘ ’年级‘ from student;
1.5:查询时合并列:需求:查询两个学生的总分:
select * from student;
----比如我想合并servlet mysql 这两个列
先:alter table student add column servlet int;
alter table student add column mysql int;
然后:更新他的值
update student set servlet=75,mysql=80 where id=1;
update student set servlet=85,mysql=90 where id=2;
需求:查询两个学生的总分:
select name '姓名',(servlet+mysql)'总分' from student;
---注意:使用合并列的字段必须是数值类型的字段,非数值类型的合并是没有合并效果的
1.6:查询去除重复记录
alter table student add column addrese varchar(20); //我们再 去添加字段
update student set addrese='广州天河' where id=1;
update student set addrese='广州越秀' where id=2;
再添加数据:
insert into student values(3,‘旺旺’, 30,85,89,'广州天河');
----需求:查询出有哪些地区的学生;
select addrese from student; //查询地区的学生
select distinct addrese from student; // distance 可以排除有重复记录的这里是用distinct关键字
select distinct(addrese)from student; //也可以这样写,只是这样写的话就是用distinct()函数
1.7:条件查询(where)
----1)逻辑条件:and or
需求:查询学生id为1,且姓名为’张三‘的学生
select * from student where id=1 and name='张三';
需求:查询学生的id为1,或姓名为张三的学生
select * from student where id=1or name='张三';
----2)比较条件:大于,小于,大于等于,小于等于,(between and )
需求:查询servlet分数大于80的学生
select * from student where servlet >80;
需求:查询mysql分小于或等于85的学生
select * from student where mysql<=85;
需求:查询servlet分大于或等于80且小于或等于85
select *from student where servlet>=80 and servlet<=85;
select * from student where servlet between 80 and 85; // between and 等价于上面的,包括80 和包括85;
需求:查询年龄不等于30的
select * from student where age<>30; // 尖括号为不等。
----3)判空条件:is null, is not null ,
----null :表示没有数据
----空字符:有数据,但他的值是空字符
需求:查询出没有性别数据的学生(在这里有可能是没有性别的,也可能是空字符)
select * from student where gender is null or gender=' ';
需求: 查出有性别数据的
select * from student where gender is not null and gender<>' ';
-----模糊查询:like
需求: 查询出李姓的学生
select * from student where name like '李%';
select * from student where name like ’%四%‘; // 这里是查询出名字中包含有四的
select * from student where name like ’李_‘;// 这里是表示只有两个字符
1.8:聚合查询
---聚合函数:max(),//最大 min(),// 最小 avg(),// 平均 count() //共计几条记录
select max(servlet) from student;
select min(servlet) from student ;
select avg(servlet) from student;
select count(*) from student; 、、、、..、、// 统计studnet表有几条记录
select count(id)from student;// 统计id这个字段有值的
1.9:分页查询
mysql的分页查询关键字是limit
limit后跟2个数字第一个是起始位置,第二个是查询条数
select * from student limit n-1,数据条数
需求:有20条数据分5页,共计每页4条数据
查询第数据1到4条数据第一页(n为页数)
select * from student limit 0,4;
select * from student limit n-1,4;
1.10:查询后排序order by
desc:降序 asc :升序
1.11:分组查询
需求:查询每个地区有多少人;
假如:预期结果是:
地区有两个:人有4个
广州天河 3
广州越秀 1
select address, count(*) from student group by address;
对address 分组,分组后在统计的是每一组的数据
需求:统计男女的人数;
select gender ,count(*) from student group by gender;// 但这样的话,假如数据库中性别那一字段,有可能一没有录默认是null ,或者是
直接录的是空字符。查询来的结果就有可能有【男 人数 ;】【女 人数】 ,【null 人数】【空字符 人数】
select gender, count(*) from student group by gender where gender is not null and gender<>' '; 错误的sql
因为where条件应该在分组之前
select gender, count(*) from student where gender is not null and gender<>' ' group by gender;
这是分组前筛选,还有就是分组后筛选
1.12:分组查询后筛选(having)
需求: 查询那些地区的人数是大于2个的
select address,count(*) from student group by address having coun(*)>2;
第一步:首先查出有哪些地区,(分组) 第二步:然后查询每一个地区的人数
第三步:再查询出那个地区的人数大于2;
(这是我们正常的思维逻辑)
select address from student group by address
select address, count(*) from student group by address;
select address,count(*) from student group by address having coun(*)>2;
(select address,count(*) from student where count(*)>2 group by address ;) // 为什么这里不行?因为count(*)是分组后产生的,而上题是gender 这个字段是本来就有的字段
我们只是去先选择再分组,而count(*)是因为分组后产生的;