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 |
OR | a 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 NULL | a IS NULL | 若操作符为not,则结果为真 |
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.。中的某一个,则结果为真 |
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