本人个人学习笔记 未经授权不允许转发
MySQL笔记(四) ---- DQL查询数据
目录
1. DQL
2. 指定查询字段
3. where语句的使用
4. 联表查询
5. 自连接
6. 分页和排序
7. 子查询
8. 分组与过滤
1. DQL
- Data Query Language:
所有查询都用它 SELECT
数据库中最核心的语言
使用频率最高的语句
SELECT 语法
SELECT [ALL|DISTINCT]
{*|table.*|[table.字段1 [as alias1],table.字段2 [as alias2],...}
FROM 表名1 [as table alias]
[LEFT|RIGHT|INNER JOIN 表名2] --联合查询
[WHERE ....] --指定结果需满足条件
[GROUP BY..] --指定结果按照那几个字段分组
[HAVING..] --过滤分组的记录必须满足的条件
[ORDER BY..] --按照一个或多个条件排序
[LIMIT 起始条,条数] --分页
2. 指定查询字段
- 查询全部学生
SELECT * FROM `表名`
- 查询指定学生
SELECT `字段`,`字段`,... FROM `表名`
- 别名
SELECT `字段` AS `字段别名`,`字段字段` AS `别名`,... FROM `表名` AS `表别名`
- 拼接
SELECT CONCAT('追加的字符串',`字段`) AS `别名` FROM `表名`
-- 该字段下所有值前都会加上'追加的字符串'
- 删除重复数据
SELECT DISTINCT `字段` FROM `表名`
-- 该字段下所有值前都会加上'追加的字符串'
- 计算结果
SELECT 100*2-1 AS `计算结果`
SELECT `StudentNum`,`StudentGrade`+1 AS `提分后成绩` FROM `result`
-- 该字段下所有值前都会加上'追加的字符串'
3. where语句的使用
- 逻辑运算符的使用
SELECT `StudentNum`,`StudentGrade` FROM `result`
WHERE `StudentGrade`<95 and `StudentGrade`>92
SELECT `StudentNum`,`StudentGrade` FROM `result`
WHERE `StudentGrade`<95 && `StudentGrade`>92
-- 该字段下所有值前都会加上'追加的字符串'
模糊查询
运算符 | 语法 | 描述 |
---|---|---|
IS NULL | a is null | 如果操作符为NULL则为真 |
IS NOT NULL | a is not null | 如果操作符不为NULL则为真 |
BETWEEN | a is between b and c | 若a在b和c之间为真 |
LIKE | a like b | SQL匹配 如果a匹配b为真 |
IN | a in (a1,a2,a3…) | 若a在(a1,a2,a3…)其中一个值中为真 |
- LIKE的使用
SELECT `StudentNum`,`StudentName` FROM `student`
WHERE `StudentName` LIKE '刘%'
-- %代表0-n个字符 _代表一个字符
- IN的使用
SELECT `StudentNum`,`StudentName` FROM `student`
WHERE `StudentNum` IN (1001,1002,1003)
4. 联表查询
- Inner Join
只会返回相匹配的元素项,即不会返回结果为NULL的数据项
-- INNER JOIN
SELECT s.studentno,`studentname`,`subjectno`,`studentresult`
FROM `student` AS s
INNER JOIN `result` AS r
ON s.studentno = r.studentno;
- Left Join
关键字从左表(A)返回所有的行,即使右表(B)中没有匹配。如果右表中没有匹配,则结果为NULL。
-- LEFT JOIN
SELECT s.studentno,`studentname`,`subjectno`,`studentresult`
FROM `student` AS s
LEFT JOIN `result` AS r
ON s.studentno = r.studentno;
- Right Join
关键字从右表(B)返回所有的行,即使左表(A)中没有匹配。如果左表(A)中没有匹配,则结果为 NULL。
-- RIGHT JOIN
SELECT s.studentno,`studentname`,`subjectno`,`studentresult`
FROM `student` AS s
RIGHT JOIN `result` AS r
ON s.studentno = r.studentno;
- 单独获取A或者B
- JOIN … ON … 和where的区别
JOIN连接的表
ON判断条件
连接查询
WHERE 是等值查询
5. 自连接
- 建表 1代表父类
CREATE TABLE `category`(
`categoryid` INT(10) NOT NULL AUTO_INCERMENT COMMENT '主题id',
`pid` INT(10) NOT NULL COMMENT '父id',
`categoryName` VARCHAR(50) NOT NULL COMMENT '主题名字',
PIRMARY KEY(`categoryid`)
)ENGINE=INNODB, AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
INSERT INTO `category` (`categoryid`,`pid`,`categoryName`)
VALUES ('2','1','信息技术'),
('3','1','软件开发'),
('4','3','数据库'),
('5','1','美术设计'),
('6','3','web开发'),
('7','5','ps技术'),
('8','2','办公信息'),
- 父类
categoryid | categoryName |
---|---|
2 | 信息技术 |
3 | 软件开发 |
5 | 美术设计 |
- 子类
pid | categoryid | categoryName |
---|---|---|
3 | 4 | 数据库 |
2 | 8 | 办公信息 |
3 | 6 | web开发 |
5 | 7 | ps技术 |
父类 | 子类 |
---|---|
信息技术 | 办公信息 |
软件开发 | 数据库 |
软件开发 | Web开发 |
美术设计 | ps技术 |
SELECT a.categoryName AS '父栏目' b.categoryName AS '子栏目'
FROM `category` AS a `category` AS b
WHERE a.`category` = b.`category`
6. 分页和排序
- 排序
SELECT a.categoryName AS '父栏目' b.categoryName AS '子栏目'
FROM `category` AS a `category` AS b
WHERE a.`category` = b.`category`
ORDER BY `字段` ASC(升序)/DEC(降序)
- 分页
SELECT a.categoryName AS '父栏目' b.categoryName AS '子栏目'
FROM `category` AS a `category` AS b
WHERE a.`category` = b.`category`
ORDER BY `字段` ASC(升序)/DEC(降序)
LIMIT 0,5 -- 第一个数字代表起始记录 从第零条开始 每页五条记录
7. 子查询
SELECT *
FROM CUSTOMERS
WHERE ID IN (SELECT ID
FROM CUSTOMERS
WHERE SALARY > 4500) ;
8. 分组与过滤
SELECT `subjectName`, AVG(`StudentResult`) AS 平均分, MAX(`StudentResult`), MIN(`StudentResult`)
FROM `result` as r
INNER JOIN `subject` AS sub
on r.`SubjectNo` = sub.`SubjectNo`
GROUP BY r.`SubjectNo`
HAVING 平均分 > 80