顺序很重要

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

 

posted on 2022-05-04 01:48  阿霖找BUG  阅读(33)  评论(0)    收藏  举报