in *** 作符允许我们在 WHERE 子句中规定多个值。
where 字段名 in (值1,值2,值3....)
示例: where age in (20,21,25)
age 字段的值 只要是 20或者21或者25 的数据 都满足条件
where not in (值1,值2,值3....)</pre>
示例: where age in (20,21,25)
age 字段的值 只要 不是 20或者21或者25 的数据 都满足条件
select *
from sc
where score in (70,80,90)
select *
from sc
where score not in (70,80,90)
select *
from student
where birthday in ('1990-01-01','1990-12-21','2017-12-20','2012-06-06')</pre>
select *
from student
where birthday not in ('1990-01-01','1990-12-21','2017-12-20','2012-06-06')
MySQL中的分页查询, limit 通常放在sql 语句的最末尾
limit 4
查询前4条数据
limit 4,3
从第4条数据之后开始,查询3条数据
也就是 第5,6,7条的数据
limit 4 offset 10
offset后面的数字是指记录数
从第10条 之后的数据开始 查询4条数据
也就是 第 11,12,13,14条数据
select * from student limit 5
select * from student limit 9,6
select * from student limit 6 offset 9
查询成绩表中 前7条的数据;
select * from sc limit 7
查询成绩表中 第 5到10 条的数据
select * from sc limit 4,6
查询成绩表中 第 3到8 条的数据
select * from sc limit 2 , 6
如果字段没有要求非空,则字段值 可以为空,就是null值。如果要查询某个 字段 为 null的数据,不能使用 字段名=null,要用 字段名 is null;
where 字段名 is null;
字段名 为空的符合条件
where 字段名 is not null;
字段名 不为空的符合条件
1.查询teacher表,给tid 起别名为 教师编号,tname 起别名为 教师姓名
select tid as 教师编号,tname as 教师姓名 from teacher
2.查询 sc 表, 给 cid 起别名为 课程编号,sid 起别名为 学生编号, score起别名为分数;
select cid 课程编号 ,sid 学生编号,score 分数 from sc
3.查询 course 表,给表起别名为 c,使用 c.字段查询 表数据
select c.* from course as c
起别名是为了后续学习多表联查 做铺垫,语法十分简单
比如查询 student 表的 学生姓名 和 生日 的sql语句:
select sname,birthday from student
给 sname,birthday字段 起别名 ,改为中文
select sname as 姓名,birthday as 生日 from student
起了别名后,查出来的字段会以别名展示。
as 关键字也可以省略,字段名 和 别名之间 用空格隔开即可
select sname 姓名, birthday 生日 from student
例子:
select a.sname, a.birthday from student as a
给表 起别名 同样是 使用 as关键字(可以使用空格隔开代替as关键字), a 就代表 student表,查询字段时,可以 使用 a.sname 代表 student的sname字段。
给表起别名 通常用在 多表查询,本次使用演示,先熟悉语法。
在某些复杂的场景下,可能需要多条sql 才能查询出想要的数据,把多条sql拼接起来 就是嵌套查询
句式1
select XXX from A表 where xx =/in (select XXX from B表)
句式2
select XXX from (select XXX from XXXX)b
句式3
select XXX from A表 a
join (select XXX from B表)b on a.xx = b.xx
select * from sc where sid = (select sid from student where sname = '周梅')
select * from sc where sid in (select sid from student where sex='女')
select a.sname,b.score,c.score from student a
inner join (select sid,score from sc where cid =1) b on a.sid = b.sid
inner join (select sid,score from sc where cid = 2) c on a.sid = c.sid
where b.score › c.score
聚合函数对一组值执行计算,并返回单个值,也被称为组函数。
就是sql提供的一种查询方法,比如查询 最大值,最小值,总数,平均等等。
聚合函数不能写在where的查询条件里面
查询 最小值
select min(字段) from 表;
查询 最大值
select max(字段) from 表;
select max(tid) from teacher
select min(tid) from teacher
select max(a.score) ,b.cname from sc a
inner join course b on a.cid=b.cid
where a.sid =(select sid from student where sname='周梅') group by b.cname limit 1
查询 该字段的 总数
select sum(字段) from 表
查询 该字段的 平均数
select avg(字段) from 表
select avg(score) from sc
select avg(s.score) from student a inner join sc s on a.sid = s.sid
where a.sex ='女'
查询 数据 总条数
count( ) 是查询总共有多少条数据
count(字段) 是查询该字段 不为 null的 总共有多少条数据
例:
select count( ) from 表
去重,查询数据时,相同的数据只展示 一条
语法:
select distinct 字段 from 表
例:去重查询学生表中的生日字段
select distinct birthday from student
因为userid字段限定为不可为空,插入空数据,造成报错。
在数据库表中,查询新列的sql示例如下,
1、创建测试表,createtabletest_num(idnumber,feenumber(10,3))
2、查看表的属性,共包含两列,ID、FEE,
3、执行sql语句,插入新字段,altertabletest_numadd(fee2number(10,3))
4、重新查看表结构,字段已加上,
TABLE 语句
具体语法:TABLE table_name [ORDER BY column_name] [LIMIT number [OFFSET number]]
其实从语法上看,可以排序,也可以过滤记录集,不过比较简单,没有 SELECT 那么强大。
示例 1
简单的建一张很小的表 y1,记录数为 10 条。表 t1,插入 10 条记录
mysql-(ytt/3305)->create table t1 (r1 int,r2 int)
Query OK, 0 rows affected (0.02 sec)
mysql-(ytt/3305)->insert into t1
with recursive aa(a,b) as (
select 1,1
union all
select a+1,ceil(rand()*20) from aa where a <10
) select * from aa
Query OK, 10 rows affected (0.00 sec)
Records: 10 Duplicates: 0 Warnings: 0
简单全表扫描mysql-(ytt/3305)->select * from t1+------+------+| r1 | r2 |+------+------+| 1 | 1 || 2 | 9 || 3 | 9 || 4 | 17 || 5 | 17 || 6 | 16 || 7 | 6 || 8 | 1 || 9 | 10 || 10 | 3 |+------+------+10 rows in set (0.00 sec)TABLE 结果mysql-(ytt/3305)->table t1+------+------+| r1 | r2 |+------+------+| 1 | 1 || 2 | 9 || 3 | 9 || 4 | 17 || 5 | 17 || 6 | 16 || 7 | 6 || 8 | 1 || 9 | 10 || 10 | 3 |+------+------+10 rows in set (0.00 sec)
看下 table 的执行计划mysql-(ytt/3305)->explain table t1 order by r1 limit 2\G*************************** 1. row *************************** id: 1 select_type: SIMPLE table: t1 partitions: NULL type: ALLpossible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 10 filtered: 100.00 Extra: Using filesort1 row in set, 1 warning (0.00 sec)
其实可以看到 TABLE 内部被 MySQL 转换为 SELECT 了。mysql-(ytt/3305)->show warnings\G*************************** 1. row *************************** Level: Note Code: 1003Message: /* select#1 */ select `ytt`.`t1`.`r1` AS `r1`,`ytt`.`t1`.`r2` AS `r2` from `ytt`.`t1` order by `ytt`.`t1`.`r1` limit 21 row in set (0.00 sec)
那其实从上面简单的例子可以看到 TABLE 在内部被转成了普通的 SELECT 来处理。示例 2应用于子查询里的子表。这里要注意,内表的字段数量必须和外表过滤的字段数量一致。克隆表 t1 结构mysql-(ytt/3305)->create table t2 like t1Query OK, 0 rows affected (0.02 sec)
克隆表 t1 数据mysql-(ytt/3305)->insert into t2 table t1Query OK, 10 rows affected (0.00 sec)Records: 10 Duplicates: 0 Warnings: 0
table t1 被当做内表,表 t1 有两个字段,必须同时满足 t2 检索时过滤的字段也是两个。mysql-(ytt/3305)->select * from t2 where (r1,r2) in (table t1)+------+------+| r1 | r2 |+------+------+| 1 | 1 || 2 | 9 || 3 | 9 || 4 | 17 || 5 | 17 || 6 | 16 || 7 | 6 || 8 | 1 || 9 | 10 || 10 | 3 |+------+------+10 rows in set (0.00 sec)
注意:这里如果过滤的字段数量和子表数量不一致,则会报错。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)