Data Query Language : 数据查询语言
-- 查询全部的学生,select 字段 from 表 SELECT * FROM student -- 查询指定字段----起别名 SELECT `SNO` AS 学号,`SNAME` AS 学生姓名 FROM student -- 也可以给字段起别名 SELECT `SNO` AS 学号,`SNAME` AS 学生姓名 FROM student AS S1 -- 函数 Concat(a,b) SELECT CONCAT('姓名: ',SNAME) AS 新名字 FROM student -- 结果展示:如下图
有时候,列明不是那么的见名知意,
我们起别名: 使用AS
- 字段名 AS 别名1
- 表名 AS 别名2
去除SELECT查询出来的结果中重复的数据,重复的数据只显示一条
-- 查询那些同学参加了考试 SELECT * FROM result -- 全部考试成绩 -- 查询成绩 SELECT DISTINCT `GRADE` FROM result
一些自带的可以查询的东西,了解下
SELECT VERSION() -- 查询系统版本(函数) SELECT 100+3-1 AS 计算结果 -- 用来计算(表达式) SELECT @@auto_increment_increment -- 查询自增的步长(变量)
-- 学员的考试成绩 +1 查看 SELECT `SNO`,`result`+1 AS '提分后' FROM result
数据库中的表达式:文本值,列,函数,NULL,计算表达式,系统变量
select 表达式 from 表
作用:检索数据中符合条件的数据
搜索的条件是由一个或者多个表达式组成,结果为布尔值
逻辑运算符
运算符 | 语法 | 描述 |
---|---|---|
&& and | a and b a && b | 逻辑与 |
|| or | a or b a || b | 逻辑或 |
! Not | not a !a | 逻辑非(取反) |
尽量使用英文字母
+++
-- where SELECT `sno` AS '学号',`grade` AS '成绩' FROM SC where grade >= 95 AND grade <= 100 -- 上面的例子尽量使用 AND 不要使用 && -- 模糊查询 SELECT sno,`grade` FROM SC WHERE grade between 95 and 100 -- c除了1000号学生的成绩 SELECT sno,`grade` FROM SC WHERE NOT sno = 1000 -- 或者是下面的这种方式 SELECT sno,`grade` FROM SC WHERE sno != 1000 -- 多个条件查询 -- 成绩在95~100之间且学号不是1002的学生 SELECT sno,`grade` FROM SC WHERE grade between 90 AND 100 AND sno != 1002
运算符 | 语法 | 描述 |
---|---|---|
IS NULL | a is null | 如果操作符为null,结果为真 |
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 `sno`,`sname` FROM `student` WHERE sname LIKE '刘%'; -- 查询姓刘的同学,名字后面只有一个字 SELECT `sno`,`sname` FROM `student` WHERE sname LIKE '刘_'; -- 查询姓刘的同学,名字后面只有2个字 SELECT `sno`,`sname` FROM `student` WHERE sname LIKE '刘__'; -- 查询名字中间有 ‘嘉’字的同学 SELECT `sno`,`sname` FROM `student` WHERE sname LIKE '%嘉%'; -- -----------IN------------------------------------- -- 查询指定的学员信息--1001 1002 1003 SELECT `sno`,`sname` FROM `student` WHERE sno IN ('1001','1002','1003'); -- 查询在北京的人 SELECT sno ,sname FROM `student` WHERE `address` IN ('北京'); -- 查询地址为空的学生 SELECT `sno`,`sname` FROM `student` WHERE `address` = ' ' OR `address` IS NULL -- 查询有出生日期的同学,意思就是出生日期不为空 SELECT `sno`,`sname` FROM `student` WHERE `bornDate` IS NOT NULL
JOIN对比
---------------------联表查询-------------------------- -- 1、分析需求<分析需要的数据来自那几个表> -- 2、确定使用什么查询 上面的7种 -- 3、使用共同的属性来连接属性 -- 查询参加考试的同学信息及成绩 SELECT s.sno,`sname`,`cno`,`grade` FROM student AS 's' INNER JOIN SC AS 'r' -- 连接两个表并取别名 ON s.sno = r.sno -- Right JOIN SELECT s.sno,`sname`,`cno`,`grade` FROM student AS 's' -- 取别名可以 一个空格解决 RIGHT JOIN SC AS 'r' -- 连接两个表并取别名 ON s.sno = r.sno -- LIFT JOIN SELECT s.sno,`sname`,`cno`,`grade` FROM student AS 's' -- 取别名可以 一个空格解决 LEFT JOIN SC AS 'r' -- 连接两个表并取别名 ON s.sno = r.sno -- 左表和右表的位置 -- 是由LIGHT JOIN 前后的位置决定的,join之前的就是左表,后边就是右表
操作 | 描述 |
---|---|
INNER JOIN(并集) | 如果表中至少有一个匹配就返回行<元组>, |
LEFT JOIN | 会从左表中返回所有的值,即使在右表中没有匹配到。-----例子:kuangshen同学没有考试,会有记录,但是成绩为NULL |
RIGHT JOIN | 会从右表中返回所有的值,即使在左表中没有匹配到。 |
-- 查询缺考的同学 SELECT s.sno,`sname`,`cno`,`grade` FROM student AS 's' LEFT JOIN SC AS 'r' ON s.sno = r.sno WHERE grade IS NULL;
join <连接的表>on <判断的条件> 是连接查询
WHERE 等值查询
-- 思考:查询参加考试的同学的所有信息,包括使用科目信息 SELECT s.sno,`sname`,`cname`,`grade` FROM student s Right Join sc r -- 第一次连接 ON r.sno = s.sno Inner JOIN course sub -- 第二次连接 ON r.cno = sub.cno -- 假设存在一种多张表查询,慢慢来,先查询两张表再慢慢增加
自连接: 了解
自己的表和自己的表连接,核心:一张表拆成两个一样的表来即可
父表
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.`categoryid` = b.`pid`; -- 查询学员所属的年级,学号,学生姓名,年级名称 SELECT s.`sno`,`sname`,`gradeName` FROM student s INNER JOIN `SC` g ON S.`GRADEID` = G.`GRADEID`; -- 查询科目所属的年级(科目名称,年级名称) SELECT c.`cno`,`gradeName` FROM Course c INNER JOIN `SC` g ON c.`cno` = g.`cno`; -- 查询参加数据库-1 考试的同学信息,学号,学生姓名,科目名,分数 SELECT FROM student s INNER JOIN `SC` g ON s.sno = g.sno -- 连接学生表和成绩表 INNER JOIN course c ON g.cno = c.cno -- 连接科目表和 前面已经连接的表 WHERE c.cno = '数据库-1';
select完整的语法结构: