mysql DQL查询数据(重点)

  
DQL查询数据
  
  
首先在我们学习之前先做一些准备工作

  • 我们创建一个数据库4个表 给表添加一些数据,你可以选择在SQLyog,navicat,可视化操作,也可以自己写或复制粘贴我的,前提你要理解这是干嘛的,不懂的话可以学习上一章,数据库操作/DML语言再来学习DQL查询数据
create database if not exists `school`;
-- 创建一个school数据库
use `school`;-- 创建学生表
drop table if exists `student`;
create table `student`(
	`studentno` int(4) not null comment '学号',
    `loginpwd` varchar(20) default null,
    `studentname` varchar(20) default null comment '学生姓名',
    `sex` tinyint(1) default null comment '性别,0或1',
    `gradeid` int(11) default null comment '年级编号',
    `phone` varchar(50) not null comment '联系电话,允许为空',
    `address` varchar(255) not null comment '地址,允许为空',
    `borndate` datetime default null comment '出生时间',
    `email` varchar (50) not null comment '邮箱账号允许为空',
    `identitycard` varchar(18) default null comment '身份证号',
    primary key (`studentno`),
    unique key `identitycard`(`identitycard`),
    key `email` (`email`)
)engine=myisam default charset=utf8;
-- 创建年级表
drop table if exists `grade`;
create table `grade`(
	`gradeid` int(11) not null auto_increment comment '年级编号',
  `gradename` varchar(50) not null comment '年级名称',
    primary key (`gradeid`)
) engine=innodb auto_increment = 6 default charset = utf8;

-- 创建科目表
drop table if exists `subject`;
create table `subject`(
	`subjectno`int(11) not null auto_increment comment '课程编号',
    `subjectname` varchar(50) default null comment '课程名称',
    `classhour` int(4) default null comment '学时',
    `gradeid` int(4) default null comment '年级编号',
    primary key (`subjectno`)
)engine = innodb auto_increment = 19 default charset = utf8;

-- 创建成绩表
drop table if exists `result`;
create table `result`(
	`studentno` int(4) not null comment '学号',
    `subjectno` int(4) not null comment '课程编号',
    `examdate` datetime not null comment '考试日期',
    `studentresult` int (4) not null comment '考试成绩',
    key `subjectno` (`subjectno`)
)engine = innodb default charset = utf8;
-- 插入学生数据 其余自行添加 这里只添加了2行
insert into `student` (`studentno`,`loginpwd`,`studentname`,`sex`,`gradeid`,`phone`,`address`,`borndate`,`email`,`identitycard`)
values
(1000,'123456','张伟',0,2,'13800001234','北京朝阳','1980-1-1','text123@qq.com','123456198001011234'),
(1001,'123456','赵强',1,3,'13800002222','广东深圳','1990-1-1','text111@qq.com','123456199001011233');

-- 插入成绩数据  这里仅插入了一组,其余自行添加
insert into `result`(`studentno`,`subjectno`,`examdate`,`studentresult`)
values
(1000,1,'2013-11-11 16:00:00',85),
(1000,2,'2013-11-12 16:00:00',70),
(1000,3,'2013-11-11 09:00:00',68),
(1000,4,'2013-11-13 16:00:00',98),
(1000,5,'2013-11-14 16:00:00',58);

-- 插入年级数据
insert into `grade` (`gradeid`,`gradename`) values(1,'大一'),(2,'大二'),(3,'大三'),(4,'大四'),(5,'预科班');
-- 插入科目数据
insert into `subject`(`subjectno`,`subjectname`,`classhour`,`gradeid`)values
(1,'高等数学-1',110,1),
(2,'高等数学-2',110,2),
(3,'高等数学-3',100,3),
(4,'高等数学-4',130,4),
(5,'C语言-1',110,1),
(6,'C语言-2',110,2),
(7,'C语言-3',100,3),
(8,'C语言-4',130,4),
(9,'Java程序设计-1',110,1),
(10,'Java程序设计-2',110,2),
(11,'Java程序设计-3',100,3),
(12,'Java程序设计-4',130,4),
(13,'数据库结构-1',110,1),
(14,'数据库结构-2',110,2),
(15,'数据库结构-3',100,3),
(16,'数据库结构-4',130,4),
(17,'C#基础',130,1);

1, 指定查询字段
  

  • select语句和别名使用
SELECT * FROM student   // 查询student表的所有字段

演示
在这里插入图片描述

SELECT `studentno`,`studentname` FROM student   // 查询student的 studentno,studentname字段



SELECT `studentno` AS 学号,`studentname` AS 姓名 FROM student    //查询student的 studentno,studentname字段 
//  并加上别名   字段后 + AS + 你起的别名

演示
在这里插入图片描述

SELECT `StudentNO` FROM result
SELECT DISTINCT `StudentNO` FROM result  // 查询结果不重复 (默认all)

  
  

  • 使用表达式
SELECT VERSION()        // 查询版本号
SELECT 100*3+1-5 AS 计算结果    // 表达式       
SELECT @@auto_increment_increment       // 查询自增步长
SELECT `StudentNO`,`studentresult`+1 AS 新成绩 FROM result    //查询考试成绩集体增加1分
SELECT `studentno`,`studentresult` FROM result        //    where语句
操作符名称语法
AND或&&a AND b 或 a && b
ORa or b
NOT 或 !not a 或 ! a
WHERE studentresult>=80 AND studentresult<=100         //and操作符

SELECT `studentno`,`studentresult` FROM result       //or操作符
WHERE studentresult>=80 OR studentresult>=70

SELECT `studentno`,`studentresult` FROM result
WHERE studentno!=1000 AND `studentno`=1002 AND studentresult>100;

SELECT `studentno`,`studentresult` FROM result        //not 操作符
WHERE NOT `studentno`= 1002;

  
  

  • 模糊查询:比较操作符
操作符名称语法描述
IS NULLa IS NULL若操作符为not,则结果为真
IS NOT NULLa IS NOT NULL若操作符不为NULL,则结果为真
BETWEENa BETWEEN b AND c若a的范围在b与c 之间 ,则结果为真
LIKEa LIKE bSQL模式匹配,诺a匹配b,这结果为真
INa IN (a1,a2,a3…)若a等于 a1,a2.。中的某一个,则结果为真
SELECT `studentno` ,`studentname` FROM student      //  查询结果为所有性 张 的学生
WHERE `studentname` LIKE '张%';

SELECT `studentno` ,`studentname` FROM student        //   查询结果为所有性 张 的 后面只有一个字的学生
WHERE `studentname` LIKE '张_';

SELECT `studentno` ,`studentname` FROM student     //   查询结果为所有性 张 的 后面只有两个字的学生
WHERE `studentname` LIKE '张__';

SELECT `studentno` ,`studentname` FROM student     //   查询结果为所有性 张 的 后面只有两个字的学生
WHERE `studentname` LIKE '%含%';       //  查询结果姓名中有  含  的学生

演示
在这里插入图片描述

在这里插入图片描述

SELECT `studentno` ,`studentname`,`address` FROM student
WHERE `address` IN ('北京朝阳','苏州');        // 查询地址为北京朝阳 苏州 的学生学号地址

SELECT `studentname` FROM student        // 查询 日期 为null 的学生
WHERE `borndate` IS NULL;

SELECT `studentname` FROM student      // 查询 日期 不为null 的学生
WHERE `borndate` IS NOT NULL;

  
  

  • 联表查询
操作符名称描述
inner join如果表中至少一个匹配,则返回行
left join即使右表中没有匹配,也从左表中返回所有行
right join即使左表中没有匹配,也从右表中返回所有行

其实就是3种联表,剩下的是这3种演变出来的,下面7种

在这里插入图片描述
student表 和 result表 联表查询

SELECT s.studentNO,studentName,SubjectNo,StudentResult     // 注意 这里s.studentNO,用那个表里的studentNO。直接写studentNO会报不明确错误  
FROM student AS s   
INNER JOIN result  AS r
ON s.studentNO = r.studentNO    // 两个表有相同的字段

在这里插入图片描述
student,Subject,gradeid,result 4个表 联表查询 学号,性别,姓名,学科,分数,年纪

SELECT s.studentNO,sex,studentName,SubjectName,StudentResult,gradename
FROM student AS s
LEFT JOIN result AS r
ON s.studentNO = r.studentNO
LEFT JOIN `subject` AS b
ON r.SubjectNo = b.SubjectNo
LEFT JOIN `grade` AS c
ON b.gradeid = c.gradeid

在这里插入图片描述
分页

LIMIT 初始从哪里开始 ,页面内容大小
SELECT `studentname` 姓名,`gradename` 年纪,`classhour`
FROM student AS s
LEFT JOIN `grade` AS g
ON s.gradeid = g.gradeid
INNER JOIN `subject` AS t
ON g.gradeid = t.gradeid
LIMIT 0,5                           // 从第一个 到 第五个 ,一页有五条内容

在这里插入图片描述

排序
语法:

SELECT field1, field2,...fieldN FROM table_name1, table_name2...
ORDER BY field1 [ASC [DESC][默认 ASC]], [field2...] [ASC [DESC][默认 ASC]]
  • 你可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。
  • 你可以设定多个字段来排序。
  • 你可以添加 WHERE…LIKE 子句来设置条件。
  • 你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。

演示

SELECT s.studentNO,sex,studentName,SubjectName,StudentResult,gradename
FROM student AS s
LEFT JOIN result AS r
ON s.studentNO = r.studentNO
LEFT JOIN `subject` AS b
ON r.SubjectNo = b.SubjectNo
LEFT JOIN `grade` AS c
ON b.gradeid = c.gradeid
ORDER BY StudentResult DESC        //  降序排序

在这里插入图片描述

成绩从大到小排序了

90后最后一批小哥,及有魅力,又有趣,做地铁还碰头的我 放弃出道 自学前端。加油!!! QQ 1485731520

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值