Mysql的指定查询、模糊查询、SELECT结构

4、DQL查询数据(重点)

Data Query Language : 数据查询语言

  • 使用频率高

4.2 指定查询字段

-- 查询全部的学生,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
-- 结果展示:如下图

Mysql的指定查询、模糊查询、SELECT结构

有时候,列明不是那么的见名知意,

我们起别名: 使用AS

  • 字段名 AS 别名1
  • 表名 AS 别名2
去重 DISTINCT

去除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 表

4.3、where条件子句

作用:检索数据中符合条件的数据

搜索的条件是由一个或者多个表达式组成,结果为布尔值

逻辑运算符

运算符 语法 描述
&& 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

4.4、 联表查询

JOIN对比

Mysql的指定查询、模糊查询、SELECT结构

---------------------联表查询--------------------------
-- 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

-- 假设存在一种多张表查询,慢慢来,先查询两张表再慢慢增加

4.6、自连接以及联表查询

自连接: 了解

自己的表和自己的表连接,核心:一张表拆成两个一样的表来即可

父表

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完整的语法结构:

Mysql的指定查询、模糊查询、SELECT结构

Mysql的指定查询、模糊查询、SELECT结构

上一篇:druid和hikariCP 数据库连接池


下一篇:[转]MySQL 前缀索引--------mysql索引指定指定一个前缀长度