MySQL数据库的DQL(数据查询语言)使用---指定查询字段、去重(distinct)、where条件子句、联表查询(xxx join)、分页(order by)和排序(limit)

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 --过滤条件

猜你喜欢

转载自blog.csdn.net/insist_to_learn/article/details/111935288