03-MySQL查询数据

目录

DQL语言

单表查询

 AS子句

DISTINCT关键字的使用

WHERE条件语句

逻辑操作符

 比较操作符

BETWEEN范围查询

 LIKE模糊查询

 使用IN进行范围查询

 NULL空值条件查询

连接查询(多表查询)

 INNER JOIN内连接

等值和非等值的连接查询

外连接

JOIN对比


DQL语言

 DQL(Data Query Language,数据查询语言)

  1. 用于查询数据库数据
  2. 简单的单表查询或多表的复杂查询和嵌套查询
  3. 是数据库语言中最核心、最重要的语句
  4. 使用频率最高的语句

单表查询

指定查询字段

查询表中的所有的数据列结果,采用  "*" 符号 

select * from student;

指定查询结果的数据列

如只查询student表中的学号,姓名和性别;各数据列用逗号 "," 隔开

select id , name , sex from student;

查询时如有两个表有同名的字段,可以使用 "表名.数据列" 来区分 

select id , student.`name` , sex from student;

 AS子句

AS子句作用

  • 可以给数据列取一个新别名
  • 可以给表取一个新别名
  • 可以把经过计算或总结的结果用另外一个新名称来代替
  • 可以省略AS关键字直接在数据列后取新别名                ·        

AS子句的用法

 1、给数据列取一个新别名

查询student表中的学号,姓名、性别和年纪并给数据列取别名

select id as '学号' , name as '姓名' , sex as '性别' , grade as '年级' from student; 

2、给表取一个新别名

使用student表新别名,查询student表中的学号,姓名和手机号

select stu.`id` , stu.`name` , stu.`phoneNumber` from student as stu;

 3、把经过计算或总结的结果用另外一个新名称来代替

把grade加1后的结果用新别名“年纪代替”

select grade+1 as '年纪' from student;

 4、省略AS关键字直接在数据列后取新别名

查询student表中的学号、姓名、手机号和身份证号并用别名表示

select id '学号' , name '姓名' , phoneNumber '手机号' , identityCard '身份证号' from student;

DISTINCT关键字的使用

作用:

        去掉SELECT查询返回的记录结果中重复的记录,所有列的值都相同)只返回一条。

语法:

        SELECT DISTINCT 字段名1,字段名2,…… from 表名;

查询student表中的所包含的年级grade

SELECT DISTINCT grade '年级' FROM student;

WHERE条件语句

  • 用于检索数据表中符合条件的记录
  • 搜索条件可有一个或多个逻辑表达式组成,结果一般为真或假
  • 搜索条件的组成
    • 逻辑操作符
    • 比较操作符

逻辑操作符

操作符名称

语法

描述

AND或&& 

a AND b 或 a && b

逻辑与,同时为真,结果才为真

OR或||

a OR b 或 a||b

逻辑或,只要一个为真,则结果为真

NOT或!

NOT a 或 !a

逻辑非,若操作数为假,结果则为真

创建数据表subject并添加数据

#创建课程表subject
create table if not exists `subject`(
`subjectNo` int not null,
`subjectName` varchar(15) not null,
`classHour` int(6) not null,
`gradeID` int(4) not null
);

#添加数据
insert into `subject` values (1,'高等数学-1',120,1);
INSERT INTO `subject` VALUES (2,'高等数学-2',110,2) , (3,'高等数学-3',100,3);
insert into `subject` values (4,'高等数学-4',130,4);

查询在课时为“100”并且年级编号为“3”的所有课程名称

#使用AND操作符,条件1 AND 条件2 ,两个条件同时满足才为真,否则为假

SELECT subjectName '课程名称' FROM `subject` WHERE classHour = 100 and gradeId = 3;
#使用&&操作符,条件1 &&条件2 ,两个条件同时满足才为真,否则为假

SELECT subjectName '课程名称' FROM `subject` WHERE classHour = 100 && gradeId = 3;

查询课时为"110"或者年级编号为"4"的课程名称

#使用OR操作符,条件1 OR条件2 ,OR左右两边的表达式有一个为真则表示为真,否则为假
SELECT subjectName '课程名称' FROM `subject` WHERE classHour = 100 OR gradeId = 1;

#使用 “||” 操作符,条件1 || 条件2 ,”||“ 左右两边的表达式有一个为真则表示为真,否则为假
SELECT subjectName '课程名称' FROM `subject` WHERE classHour = 100 || gradeId = 1;

查询年级编号不为 "1" 的所有结果

逻辑非 ”not“

SELECT subjectNO '课程编号' , subjectName '课程名称' , classHour '课时' FROM SUBJECT WHERE NOT gradeID = 1;

逻辑非 ”!“

SELECT subjectNO '课程编号' , subjectName '课程名称' , classHour '课时' FROM subject WHERE gradeID != 1;

 

 比较操作符

操作符名称

语法

描述

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…中的某一个,则结果为真

注意:

  1. 数值数据类型的记录之间才能进行算数运算。
  2. 相同数据类型的数据之间进行比较

BETWEEN范围查询

BETWEEN等同于>=和<=联合使用

语法:

SELECT 字段1,字段2,…… FROM 表名 字段x BETWEEN 数值1 AND 数值2;

查询subject表中课时在110和130之间的所有记录

SELECT * FROM SUBJECT WHERE classHour BETWEEN 110 AND 130;

等同于

SELECT * FROM SUBJECT WHEREclassHour >= 110 AND classHour <= 130;

 LIKE模糊查询

在WHERE句子中,使用LINK关键字进行模糊查询,LIKE关键字与“%",“-"一起使用

  • LIKE与 “%” 一起使用,表示匹配0个或任意多个字符
  • LIKE与“-”一起使用,表示匹配单个字符

查询包含“数学”的所有课程

SELECT * FROM subject WHERE subjectName LIKE "%数学%";
或者

SELECT * FROM subject WHERE subjectName LIKE "%数学__";

 使用IN进行范围查询

在WHERE子句中使用IN进行范围查询

  • 查询的字段的值,至少与括号中的一个值相同
  • 多个值之间用英文逗号隔开

查询课时为100,110,120的所有课程

select * from subject where classHour in(100 , 110 , 120);

 NULL空值条件查询

NULL

  • NULL代表 “无值” 
  • 区别于零值0和空字符“”
  • 只能出现在定义允许为NULL的字段
  • 须使用IS NULL 或 IS NOT NULL 比较操作符取比较

连接查询(多表查询)

连接查询

  • 如需要多张数据表的数据进行查询,则可以通过连接运算符实现多个查询
  • 分类包括:
    • 内连接(inner join)
      • 等值和非等值的连接查询
      • 自身连接查询
    • 外连接(our join)
      • 左连接(left join)
      • 右连接(right join)

创建数据表

创建年纪表 “grade”

#创建年级表grade
create table if not exists `grade`(
`gradeID` int not null,
`gradeName` varchar(20) not null
);

#添加数据
insert into grade values (1,'大一') , (2,'大二') , (3,'大三') , (4,'大四');

 INNER JOIN内连接

在表中至少一个匹配时,则返回记录

语法

SECLET 字段1 , 字段2 ,…… FROM 表1 INNER JOIN 表2 ON 表1.字段x = 表2.字段x;

#INNER JOIN 与 JOIN 是相同的;

#如表1中的行在表2中没有匹配,则不返回

从“subject” 和 “grade” 数据表查询课程名称和所属年级名称

SELECT subject.`subjectName` , grade.`gradeName` FROM subject INNER JOIN grade ON subject.`gradeID` = grade.`gradeID`;

#INNER JOIN 与 JOIN 是相同的,可以省略INNER;

SELECT subject.`subjectName` , grade.`gradeName` FROM subject JOIN grade ON subject.`gradeID` = grade.`gradeID`;

 

 

等值和非等值的连接查询

  • 与表单查询类似,都是SELECT语句
  • 把多个表放在FROM后,各个数据表用逗号隔开
  • 可以使用AS关键字取别名,便于引用
  • 如无重名查询字段则可省略数据表的指定

从 “subject” 和 “grade” 数据表查询课程名称,课时和所属年纪名称

select subject.`subjectName` , .`classHour`, grade.`gradeName` from subject , grade where subject.`gradeID` = grade.`gradeID`;
 

#AS关键字取别名

select su.`subjectName` , su.`classHour`, gr.`gradeName` from subject as `su` , grade as `gr` where su.`gradeID` = gr.`gradeID`;
 

 

外连接

左连接(LEFT JOIN)       

        从左表(表1)中返回所有的记录,即便在右(表1)中没有匹配的行

语法:

SELECT 字段1 ,字段2,…… FROM 表1 LEFT JOIN 表2 ON 表1.字段x = 表2.字段x;

右连接(RIGHT JOIN)

        从右表(表2)中返回所有的记录,即便在左(表1)中没有匹配的行

语法:

SELECT 字段1 ,字段2,…… FROM 表1 RIGHT JOIN 表2 ON 表1.字段x = 表2.字段x;

查询“subject”表中的所有信息和“grade”表中的年级信息

#左连接

SELECT subject.* , grade.`gradeName` from subject left join grade on subject.`gradeID` = grade.`gradeID`;


#左连接,使用AS别名

SELECT su.* , gr.`gradeName` from subject AS `su` left join grade AS `gr` on su.`gradeID` = gr.`gradeID`;

#右连接

SELECT subject.* , grade.`gradeName` from subject right join grade on subject.`gradeID` = grade.`gradeID`;
 

#右连接 ,使用AS别名

SELECT su.* , gr.`gradeName` from subject AS `su` right join grade AS `gr` on su.`gradeID` = gr.`gradeID`;
 

 

JOIN对比

  • INNER JOIN:如果表中有至少一个匹配,则返回行
  • LEFT JOIN:不论右表是否有匹配,都会返回左表的所有行
  • RIGHT JOIN:不论左表是否有匹配,都会返回右表的所有行
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值