DQL查询数据数据
DQL(Data Query Language:数据查询语言)
-
所有的查询操作都用它 select
-
数据库中最核心的语言
-
使用频率最高的语句
-
select完整的语法
select [AA|distinct]
{*|table.*|[table.field1 [as alias1][table.field2 [as alias2]][...]]}
from table_name [as table_alias]
[left join|inner join|right join table_name2 [as table_alias2]]--联合查询
[where ...] --指定结果需满足的条件
[group by ...] --指定结果按照那几个字段分组
[having] --过滤分组的记录必须满足的次要条件
[order by ...] --指定查询记录按一个或多个条件排序
[limit {[offset,]row_count | row_countOFFSET offset}];--指定查询的记录从那条至那条
- 注:[ ]括号代表可选的,{ }括号代表必须的
指定查询字段
--查询全部的表中数据
--select 字段 from 表
SELECT * FROM student1
--查询指定字段
SELECT `name`,`psd`FROM `student1`
--别名,给结果起一个名字:AS 可以给字段名起别名,也可以给表起别名
SELECT `name` as '姓名',`psd` as '密码' FROM `student1` as s
--函数 concat(a,b):拼接
SELECT CONCAT('姓名:',name) as '学生姓名'FROM `student1`as s
-
语法:select 字段,…from 表
-
去重(distinct)
- 作用:去除select查询出来的结果中重复的数据,重复的数据只显示一条
SELECT `name` from `student1` --查询学生表中所有学生的姓名
SELECT DISTINCT `name` FROM `student1` --去重姓名重复的学生,名字重复的只显示一条
- 数据库的列(表达式)
SELECT VERSION() --查询系统版本(函数)
SELECT 100*3-3 as '计算结果' --用来计算 (表达式)
SELECT @@auto_increment_increment --查询自增的步长(变量)
--年级+1查看
SELECT `name`,`grade_id`+1 as '升级后' FROM `student1`
--语法:select 表达式 from 表
where条件子句
- 作用:检索数据中符合条件的值
- 搜索的条件由一个或者多个表达式组成,结果为布尔值
- 逻辑运算符
运算符 | 语法 | 描述 |
---|---|---|
and && | a and b a&&b | 逻辑与,都为真时为真 |
or || | a or b a||b | 逻辑或,一个为真时为真 |
not ! | not a ! a | 逻辑非,真为假,假为真 |
--创建一个表
CREATE TABLE `student`(
`id` int(5) not NULL auto_increment COMMENT 'ID',
`name` VARCHAR(11) COMMENT '姓名',
`age` int(5)COMMENT'年龄',
`birthday` datetime COMMENT'生日',
`gender`VARCHAR(5) DEFAULT'男' COMMENT'性别',
PRIMARY key (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='基本信息表';
--添加数据
INSERT into `student`(`name`,`age`)VALUES('xiaom',18)
INSERT into `student`(`name`,`age`)VALUES('xiaon',15)
INSERT into `student`(`name`,`age`)VALUES('xiaob',5)
INSERT into `student`(`name`,`age`)VALUES('xiaoc',30)
--查询
SELECT `name`,`age` FROM `student`
--查询年龄在5-20之间的
SELECT`name`,`age`FROM`student` WHERE `age`>=5 AND `age`<=20
--&&
SELECT`name`,`age`FROM `student` WHERE `age`>=5 && `age`<=20
--模糊查询(区间)
SELECT`name`,`age`from `student`WHERE `age` BETWEEN 5 and 18
--查询年龄为5以外的
SELECT`name`,`age`from `student`WHERE `age`!=5
--not
SELECT`name`,`age`FROM `student`WHERE not `age`=5
- 模糊查询:比较运算法
运算法 | 语法 | 描述 |
---|---|---|
is null | a is null | 如果操作符为null,结果为真 |
is not null | a is not null | 如果操作符不为null,结果为真 |
between | a between b and c | 若a在b和c之间,则结果为真 |
like | a like b | sql匹配,如果a匹配b,则结果为真 |
in | a in(a1,a2,a3…) | a在a1,或者a2…中的某一个值时结果为真 |
--like结合(%:代表0到任意个字符)(_:代表一个字符)
SELECT `name`,`age` from `student` WHERE `name` like 'x%'
--查询年龄为1后面有一个数字的
SELECT `name`,`age`from `student`WHERE `age`like'1_'
--查询年龄为1后面有两个数字的
select `name`,`age`, from `student` where `sge` like '1__'
--in:具体的一个或者多个值
--查询年龄为15,18,5的学生
SELECT`name`,`age`from`student`where`age`in (15,18,5)
--null not null
--查询生日为空的学生
SELECT`name`,`age`from`student`where`birthday`is null or `birthday`=''
--查询生日不为空的学生
SELECT`name`,`age`from`student`where`birthday`is not null
联表查询(xxx join)
/*
步骤:
1.分析需求,分析查询的字段来自哪些表
2.确定使用哪种连接查询(一共有7种,一般使用的有:left join、inner join、right join)
3.确定交叉点:两个表中哪些数据时相同的,即确定判断的条件
*/
--语法:
--查的字段:select...
--从那几个表中查:from 表1 as 别名1 left(或 inner、right) join 表2 as 别名2 on 交叉条件
自连接
- 自己的表和自己的表连接,核心:一张表拆为两张一样的表即可
分页(order by)和排序(limit)
-
排序(order by)
- 升序:ASC,降序:DESC
- ORDER BY 通过那个字段排序,怎么排
--结果按年龄降序排 SELECT `name`,`age`from `student` ORDER BY `age` desc
-
分页(limit)
--limit 0,5 1~5条数据 --limit 1,5 2~6条数据 --limit 6,5 7~11条数据
--第一页 limit 0,5 (1-1)*5 --第二页 limit 5,5 (2-1)*5 --第三页 limit 10,5 (3-1)*5 --第N页 limit (n-1)*pagesize,pagesize --pagesize:页面大小 --(n-1*pagesize:起始值 --n:当前页 --数据总数/页面大小=总页数
分组(group by)和过滤(having)
--查询不同课程的平均分、最高分、最低分,平均分大于80
--核心:根据不同的课程分组
select subject_name,AVG(student_result)as 平均分,MAX(student_result),MIN(student_result)as最低分 from result r inner join subject sub on r.subject_no=sub.subject_no group by r.subject_no --通过什么字段分组
having 平均分>80 --过滤条件