顺序很重要
select 去重,要查询的字段 from 表(表和字段可以取别名,后面可直接用别名代替
eg:AVG(`studentresult`)AS 平均分
where 平均分>=80)
xxx.join要连接的表 on 等值判断
where (具体的值,子循环语句)
Group By(通过哪个字段来分组)
Having (过滤分组后的信息,条件和where一样,位置不同)
Order By..(通过哪个字段排序)[升序/降序]asc/desc
Limit startindex,pagesize
业务层面:
查询:跨表,跨数据库,跨地址,本地连接云数据库
-- 查询全部的学生 SELECT(选择) 字段 FROM 表
- SELECT * FROM student
- -- 查询指定字段
- SELECT `StudentNo`,`StudentName` FROM student

-- 别名,AS 可以给字段,表起别名
- SELECT `StudentNo` AS 学号,`StudentName`AS 姓名 FROM student

-- 函数 Concat(a,b)
- SELECT CONCAT('姓名:',StudentName)AS 新名字 FROM student

-- 去重distinct(去除查询到的重复数据,只显示一条)
- SELECT * FROM `result`-- 查询所有考试的成绩
- SELECT `StudentNo` FROM `result`-- 查询那些同学参加了考试
- SELECT DISTINCT `StudentNo` FROM `result`-- 发现重复数据。去重
-- 数据库的列(表达式)
- SELECT VERSION()-- 查询数据库版本(函数)
- SELECT 100*3-1 AS 计算结果 -- 用来计算(表达式)
- SELECT `StudentNo`,`StudentResult`+2 AS '提分后' FROM `result`-- 学员考试成绩+1查看,实际表格数据不变
- 数据库中的表达式:文本值,列,Null,函数,计算表达式,系统变量。。。
-
select 表达式 from 表
-- where条件子句
作用:检索数据中符合条件的值
搜索的条件有一个或者多个表达式组成!结果布尔值
| 运算符 | 语法 | 描述 |
| and && | a and b a&&b | 逻辑与,全真为真 |
| or || | a or b a||b | 逻辑或,有真为真 |
| NOT ! | not a !a | 逻辑非 |
尽量使用英文字母
-- 查询成绩在80到100之间的学生
- SELECT `StudentNo`,`StudentResult`FROM `result`
- WHERE `StudentResult`>80 AND `StudentResult`<100
-- 模糊查询(区间)between
- SELECT `StudentNo`,`StudentResult` FROM `result`
- WHERE `StudentResult` BETWEEN 40 AND 80
-- 除了1000号以外的学生
- SELECT `StudentNo`,`StudentResult` FROM `result`
- WHERE `StudentNo`!=1000;
- SELECT `StudentNo`,`StudentResult` FROM `result`
WHERE NOT `StudentResult`=1000
| 运算符 | 语法 | 描述 |
| IS NULL | a is null | 如果操作符为null,结果为真 |
| IS NOT NULL | a is not null | 如果操作符为not 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.。。。其中一个值之中,结果为真 |
-- 模糊查询 -- 查询 null SELECT `StudentNo` FROM`student` WHERE `Address` IS NULL -- 查询 not null SELECT `StudentNo` FROM`student` WHERE `Address` IS NOT NULL SELECT `StudentNo` FROM`student` WHERE `Address`='' AND`Address` IS NOT NULL -- 查询地址在北京朝阳的人 in 精准查询要全称 SELECT `StudentNo` ,`StudentName`FROM`student` WHERE `Address` IN('北京朝阳') -- 查询性张的同学 like %(%代表0到多个字符)(_代表一个字符),只能在like里面用 SELECT `StudentNo` ,`StudentName`FROM`student` WHERE `StudentName`LIKE '张%' SELECT `StudentNo` ,`StudentName`FROM`student` WHERE `StudentName`LIKE '赵_'
联表查询
/*思路 1.分析需求,分析查询的字段来自哪些表,(连接查询) 2.确定使用哪种连接查询?7种,常用3种 确定交叉点(这两个表中哪个数据是相同) 判断的条件:学生表的中 studentNO = 成绩表 studentNO */ -- join on 连接查询 -- where 等值连接 SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult` FROM`student`AS s INNER JOIN `result`AS r WHERE s.`studentno`= r.`studentno` SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult` FROM`student`AS s INNER JOIN `result`AS r ON s.`studentno`= r.`studentno` SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult` FROM`student` s -- 以right(右表)为基准 RIGHT JOIN `result` r ON s.`studentno`= r.`studentno` SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult` FROM `student` s -- `student`为右表 LEFT JOIN `result` r ON s.`studentno`= r.`studentno` -- 查询缺考的同学 SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult` FROM `student` s LEFT JOIN `result` r ON s.`studentno`= r.`studentno` WHERE `studentresult` IS NULL
| 操作 | 描述 |
| inner join | 如果表中至少有一个匹配,就返回行 |
| left join | 会从左表中返回所有值,即使右表中没有匹配 |
| right join | 会从右表中返回所有值,即使左表中没有匹配 |
会从左表中返回所有值,即使右表中没有匹配(没有匹配则返回 null)

/*我要查哪些数据(`studentno`,`studentname`,`subjectname`,`studentresult`) 使用哪种查询 交叉点(`result`和`student`交叉`studentno`;;;`subject`和`result`交叉`subjectno`) 假设存在一种多张表查询,两张两张慢慢来 */ SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult` FROM `student` s RIGHT JOIN `result` r ON s.`studentno`=r.`studentno` INNER JOIN `subject` sub ON r.`subjectno`=sub.`subjectno`
自连接(了解)
就是把一张表拆成两张
创建一个表(父类就是pid=1)核心 `categoryid` = `pid`
CREATE TABLE `category`( `categoryid` INT(4) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主题id', `pid`INT (10) NOT NULL COMMENT '父类id', `categoryname`VARCHAR(50)NOT NULL COMMENT'主题名字', PRIMARY 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','办公信息');

SELECT a.`categoryname`AS '父栏目',b.`categoryname`AS '子栏目' FROM `category`AS a,`category`AS b WHERE a.`categoryid` = b.`pid`

'软件开发','信息技术','美术设计'pid=1;
'美术设计'的`categoryid`为5 ='ps技术'的`pid`为5
分组及过滤
-- 查询不同课程的平均分,最高分,最低分 -- 核心(不同课程) SELECT `subjectname`,AVG(`studentresult`)AS 平均分,MAX(`studentresult`)AS 最高分,MIN(`studentresult`)AS 最低分 FROM `result`AS r INNER JOIN`subject` AS s ON r.`subjectno`=s.`subjectno` GROUP BY r.`subjectno` HAVING 平均分>=80 -- 本质和where没什么区别,都是过滤,但用了 group by(分组)就只能用having
本文来自博客园,作者:阿霖找BUG,转载请注明原文链接:https://www.cnblogs.com/lin-07/articles/16217505.html
浙公网安备 33010602011771号