查询和筛选数据
- select * from 表名 where 条件;
from关键字后面写表名,表示数据来源于是这张表
select后面写表中的列名,如果是*表示在结果中显示表中所有列
在select后面的列名部分,可以使用as为列起别名,这个别名出现在结果集中
如果要查询多个列,之间使用逗号分隔 - 消除重复行
在select后面列前使用distinct可以消除重复的行
select distinct gender from students; - 比较运算符
等于=
大于>
大于等于>=
小于<
小于等于<=
不等于!=或<> - 逻辑运算符
and //筛选条件更严苛
or //筛选范围变大
not - 范围查询
in表示在一个非连续的范围内:
select * from 表名 where id in(1,3,8);
between … and …表示在一个连续的范围内
select * from 表名 where id between 3 and 8; - 模糊查询
like
%表示任意多个任意字符
_表示一个任意字符
例:where sname like ‘黄%’ ; where sname like ‘黄_’ or sname like ‘%靖%’; - 空判断
null与”是不同的
查询没有填写地址的学生
select * from students where hometown is null;
查询填写了地址的学生
select * from students where hometown is not null; - 优先级
小括号,not,比较运算符,逻辑运算符
聚合函数
count(*)计算总行数, max(列) , min(列), sum(列),avg(列)
例子:select count(*) from 表名 where isdelete=0;
select max(id) from students where isdelete=0 and gender=0;
select sum(id) from 表名 where …
select avg(id) from 表名 where …子查询:将聚合函数与查询语句嵌套
select * from students where id = (select min(id) from students where isdelete = 0);
分组
- 对分组后的数据进行聚合函数统计:
select gender [as 别名] ,count(*) from 表名 group by gender; - having后面的条件运算符与where的相同:
方案一
select count(*)
from students
where gender=1; //对原数据集进行筛选
方案二:
select gender as 性别,count(*)
from students
group by gender
having gender=1; //对筛选之后的数据集进行筛选(增加判断条件)
或:
select gender,count(*) as rs from students group by gender having rs>2;//as 取别名
排序
- select * from 表名
order by 列1 asc|desc,列2 asc|desc,…
将行数据按照列1进行排序,如果某些行列1的值相同时,则按照列2排序,以此类推
默认按照列值从小到大排列
asc从小到大排列,即升序
desc从大到小排序,即降序
例:select * from students where gender=1 and isdelete=0 order by id desc;
分页
- select * from 表名 limit start,count
从start开始,获取count条数据,start索引从0开始
例子:select * from students limit 1,3; 表示从第2个数据开始取3个
外键连接
- 新建一个表格 create table scores(
id int primary key auto_increment,
stuid int, //与外键对应的键
foreign key(stuid) references students(id) //建立连接
); - 在删除students表的数据时,如果这个id值在scores中已经存在,则会抛出异常。
- 级联操作:如果主表的记录删掉,则从表中相关的记录都将被删除。
- 连接查询:select students.name, scores.score from scores inner join students on scores.stuid = students.id; //内连接,查询表的顺序不分
select * from students left join scores on students.id = scores.stuid // 左连接,以left左侧表数据为主数据;
<==>select * from scores right join students on scores.stuid= students.id // 右连接,以right右侧表数据为主数据;
小结
select distinct 列*
from 表1 inner|left|right join 表2 on 表1与表2的关系
where …
group by …having …
order by… asc|dese
limit start,count