a3使用DQL命令查询数据(一)

使用DQL命令查询数据(一)

DQL语言

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

​ 查询数据库数据,如SELECT语句

​ 简单的单表查询或多表的复杂查询和嵌套查询

​ 数据库语言中最核心、最重要的语句

​ 使用频率最高的语句

SELECT语法

SELECT  [ALL | DISTINCT] 
{  * |  table.* | [ table.field1 [ as  alias1] [, table.field2 [as  alias2]][,]] }
FROM  table_name  [ as  table_ alias ]
    [ left|out|inner  join  table_name2 ]    #联合查询
	[ WHERE]   	#指定结果需满足的条件
	[ GROUP BY]	#指定结果按照哪几个字段来分组
	[ HAVING]		#过滤分组的记录必须满足的次要条件
	[ ORDER BY]	#指定查询记录按一个或者多个条件排序
	[ LIMIT  { [ offset,] row_count | row_count OFFSET offset }] ;  #指定查询的记录从哪条至哪条

[] 括号代表可选的;

{} 括号代表必须的;

井号 MySQL语句中的注释符,也可以用 /* 该处为注释 */

@where条件语句:
[ WHERE]   	#指定结果需满足的条件
  1. 用于检索数据表中符合条件的记录

  2. 搜索条件可由一个或多个逻辑表达式组成,结果一般为真或假

  3. 搜索条件的组成:逻辑操作符、比较操作符

逻辑操作符
操作符名称语法描述
AND或&&a AND b 或 a && b逻辑与,同时为真,结果才为真
OR或||a OR b 或 a||b逻辑或,只要一个为真,则结果为真
NOT或!NOT a 或 !a逻辑非,若操作数为假,结果则为真
比较运算符:
操作符名称语法描述
IS NULLa IS NULL若操作符为NULL,则结果为真
IS NOT NULLa IS NOT NULL若操作符不为NULL,则结果为真
BETWEENa BETWEEN b AND c若a范围在b与c之间则结果为真
LIKEa LIKE bSQL模式匹配,若a匹配b,则结果为真
INa IN (a1,a2,a3,….)若a等于a1,a2…中的某一个,则结果为真

注意:1、数值数据类型的记录之间才能进行算术运算

2、相同数据类型的数据之间才能进行比较

  • (1)BETWEEN AND范围查询

    • 根据一个范围值来检索
    SELECT  字段列1, 字段2 ,FROM 表名 WHERE 字段x BETWEEN1 AND2  
    
    • 等同于 >=和 <= 联合使用
    #查询课程表中课时在110和120之间的所有记录
    SELECT  *  FROM  subject  WHERE ClassHour   BETWEEN  110  AND 120;
    等同于:
     SELECT  * FROM  subject  WHERE ClassHour >= 110  AND  ClassHour <=120;
    
  • (2)LIK模糊查询

    在WHERE子句中,使用LIKE关键字进行模糊查询

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

    • 与“_”一起使用,表示匹配单个字符

    #查询包含“数学”的所有课程
    SELECT  *  FROM subject WHERE SubjectName  LIKE  "%数学%";
    
    #查询所有姓名为“李某某”三个字的学生信息
    SELECT StudentNo,StudentName FROM student  
    WHERE StudentName LIKE "李__";
    
  • (3)使用IN进行范围查询

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

    SELECT 字段列1,字段2 ,FROM 表名 WHERE 字段x  IN  (1,2,3)  
    
    • 查询的字段x的值,至少与括号中的一个值相同
    • 多个值之间用英文逗号隔开
    #普通处理方式
    SELECT  *  FROM  subject  where  ClassHour = 100  OR ClassHour =110 OR ClassHour  = 120;  
    
    #使用IN进行查询方式,更为简洁,效率更高
    SELECT  *  FROM  subject  where  ClassHour  IN ( 100, 110, 120 );
    
  • (4)NULL空值条件查询

    NULL

    • NULL代表“无值”
    • 区别于零值0和空符串“”
    • 只能出现在定义允许为NULL的字段
    • 须使用 IS NULL 或者 IS NOT NULL 比较操作符去比较
@连接查询(多表查询):

如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询

分类包括:

  • 内连接 ( inner join)

    1.等值和非等值的连接查询

    2.自身连接查询

  • 外连接 ( out join )

    3.左连接(LEFT JOIN)

    4.右连接 ( RIGHT JOIN)

1.内连接查询:

INNER JOIN内连接:在表中至少一个匹配时,则返回记录

SELECT  字段1,字段2,FROM  table_1 
INNER  JOIN   table_2   ON  table_1.字段x  =  table_2.字段y;
/*
INNER JOIN 与 JOIN 是相同的;
如table_1中的行在table_2中没有匹配,则不返回;
*/

示例: 要求:从subject和grade数据表查询课程名称和所属年级名称

SELECT SubjectName,GradeName FROM subject INNER JOIN grade ON   subject.GradeID= grade.GradeID;  
2.等值和非等值的连接查询:
  1. 与单表查询类似,都是SELECT语句

  2. 把多个表放到FROM后,并用逗号隔开

  3. 可使用AS关键字取别名,便于引用

  4. 如无重名查询字段则可省略数据表的指定

示例: 从subject和grade数据表查询课程名称和所属年级名称

#非等值连接查询
SELECT  SubjectName, GradeName  FROM  subject,  grade;  /*返回记录数为两表记录数的乘积*/
#等值查询
SELECT  SubjectName, GradeName  FROM  subject,  grade 
WHERE  subject.GradeID = grade.GradeID;  	/*等效于内连接*/

3.自连接查询

数据表与自身进行连接:从一个包含栏目ID,栏目名称和父栏目ID的表中,查询父栏目名称和其子栏目名称,表结构如下:

#表结构语句
CREATE TABLE IF NOT EXISTS category(
     categoryId int(10) auto_increment  primary key,
     categoryName varchar(32) not null ,
     pid int(10)
);
SELECT  c1.categoryName AS "父栏目名称", c2.categoryName AS "子栏目名称" 
FROM category AS c1,category AS c2 
WHERE c1.categoryId = c2.pid; 

SELECT  c1.categoryName AS "父栏目名称", c2.categoryName AS "子栏目名称" 
FROM category AS c1 LEFT JOIN category AS c2 
ON c1.categoryId = c2.pid WHERE c1.pid = 1; 
4.外连接
  • 左外连接(LEFT JOIN)

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

    SELECT 字段1,字段2,FROM table_1 
    LEFT  [ OUTER ]  JOIN table_2  ON table_1.字段x  =  table_2.字段y;
    
  • 右外连接(RIGHT JOIN)

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

    SELECT  字段1,字段2,FROM table_1 
    RIGHT   [ OUTER ]  JOIN  table_2 ON  table_1.字段x = table_2.字段y;
    
    
5.不同的SQL JOIN对比
操作符名称描述
INNER JOIN ( JOIN )如果表中有至少一个匹配,则返回行
LEFT JOIN不论右表是否有匹配,都会返回左表的所有行
RIGHT JOIN不论左表是否有匹配,都会返回右表的所有行
指定查询字段
  • 查询表中所有的数据列结果,采用 “ * ” 符号
SELECT * from 表名
  • 可指定查询的结果数据列

    • ​ 如只查询student表中的学号、姓名、电话:

      SELECT  StudentNo, StudentName, Phone  FROM  student;
      
    • 如区分连接查询时两个表有同名的字段

      SELECT student.StudentNo, StudentName
      FROM student, result;
      /*student.StudentNo指定该字段属于哪个类*/
      
AS子句

AS子句作用:

  • 可给数据列取一个新别名

  • 可给表取一个新别名

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

**AS子句用法:**as可省略

SELECT   StudentNo  AS "学号"  FROM   student;
SELECT   a.StudentNo  FROM  student AS  a;
SELECT   Phone+1  AS  Tel  FROM   student;
DISTINCT关键字的使用

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

ALL 关键字是默认的,返回所有的记录,与之相反。

SELECT  DISTINCT  字段名1, 字段名2...  FROM 表名

示例:查询成绩表中的所包含的课程ID

SELECT  DISTINCT  SubjectNo  FROM  result
使用表达式的列
  • 表达式一般由文本值、列值、NULL、函数和操作符等组成

  • 应用场景

    1. SELECT语句返回结果列中使用

    2. SELECT语句的ORDER BY、HAVING等子句中使用

    3. DML语句中的where条件语句中使用表达式

在SQL语句中使用表达式:

  • 返回的列中使用

    #给返回结果中的课时都加10个课时
    SELECT  version() ,   100*3        #返回MySQL版本和计算结果
    SELECT  SubjectName "课程名称", ClassHour+10  AS "新学时"  FROM subject;
    
  • 避免SQL返回结果中包含“ . ”,“ * ” 和括号等干扰开发语言程序,如

    SELECT  version() as MySQL_V , 123.44*100  AS  EXPRESSION;
    #返回结果不会与后台开发程序发生混淆
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱尔斯Jules

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值