04表记录查询

04表记录查询

DQL:Data Query Language 数据查询语言

[ ] ---> 表示可选 < > ---> 表示必写 | ---> 可供选择

一、概括

1、查询不但能实现数据检索,而且可以在查询过程中进行计算、合并不同数据源的数据

2、通过select语句查询是检索数据库中信息的唯一方式,是SQL语句中使用频率最高的语句

  • 启动服务器: net start mysql (管理员身份运行)

  • 关闭服务器 : net stop mysql

  • 登录MySQL服务器: mysql -u 登陆账号 -p

  • 断开服务器连接: quit

  • 显示所有数据库名称: show databases;

  • 使用该数据库: use 数据库名称;

  • 显示当前数据库中的表名称: show tables;

  • 显示表结构: desc 表名称;

二、语句格式:

  • SELECT [ALL | DISTINCT] <目标列表达式> [,<目标列表达式>]

  • FROM <表名或视图名>[, <表名或视图名> ]

  • [ WHERE <条件表达式> ]

  • [ GROUP BY <列名1> [ HAVING <条件表达式> ] ]

  • [ ORDER BY <列名2> [ ASC | DESC ] ];

三、简单介绍:

  • SELECT子句:指定要显示的属性列

  • FROM子句:指定查询对象(基本表或视图)

  • WHERE子句:指定查询条件

  • GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用聚合函数。

  • HAVING短语:筛选出只有满足指定条件的组

  • ORDER BY子句:对查询结果表按指定列值进行升序或降序排序

四、表查询具体操作:

  • 查询列: select 列名1 [as 别名],列名2 [as 别名 ] .. from 表名

  • 查询表中全部字段的信息:select * from 表名 (* 为通配符)

  • 查询表中指定的字段信息:

    select 字段名 from 表名 where 查询条件 ;

  • 在查询结果中去掉重复的行:

    select distinct 字段名 from 表名 ;

  • 查询表中的某几行数据:

    select 字段名 from 表名 limit [start] ,length

    start 表示从第几行记录开始检索,默认为0

    length 表示检索多少行记录

    放在查询语句的后面

  • WHERE子句设置过滤条件

    1. 指出查询范围:expression [NOT] between expression1 and expression2

      注意:expression1 不能大于expression2的值

      between包含边界值,not between 不包含边界值

    2. 指定一个集合:expression IN (expression....)

      值表中列出所有可能的值,当表达式与集合中的任意一个值匹配时,即返回true,否则返回false

    3. 模糊查询,字符匹配like:字段名 [ NOT ] like ...

      如果条件不确定,必须使用LIKE关键字进行模糊查询

      用like进行字符串匹配,将该字符串叫做匹配串,用它与属性值进行比较,

      匹配串中的通配符为:_ 任意单个字符;% 零个或多个任意字符串

    4. 转义:_ 被转移为_;\\被转移为\; \被转移为%;

    5. 空值查询:is null ; is not null 表示非空

    6. 逻辑运算符:AND(连接两个条件,仅当条件都为真才返回);OR(连接两个条件,只有任意一个条件为真就返回); NOT(否定一个条件,只有条件不成立时才返回)

      注意:语句中有多个逻辑运算符时:先求NOT,再求AND,最后OR

  • 查询语句中对进行排序:select 字段名 form 表名 order by 字段名1 [ASC(升序)、DESC(降序)]

    查询到的记录按照字段名1进行排序

    排序默认为升序,即默认使用ASC;如果按照降序排序,必须换成DESC

  • 查询语句中进行多行排序:

    select 字段名 form 表名 order by 字段名1 ,字段名2...[ASC(升序)、DESC(降序)]

    系统会先按照order by 子句中的第一个字段进行排序,当该字段出现相同值时,再按照第二个字段名进行排序,依此类推

  • 对查询结果进行分组:select 字段名 from 表名 group by <分组依据> [having <组中提取的条件表达式>]

    注意:HAVING <条件表达式> :作用的对象是组,即对分组后的记录进行筛选

  • 将集中的字符串连接起来: group_concat(需要集中显示的字段名,简单点就是需要一行显示的字段名) 函数

五、聚合函数

在<目标列表达式>中常使用的聚合函数:
Count([distinct|all]*)      统计元组个数
Count([distinct|all]<列名>)  统计一列中值的个数
sum([distinct|all]<列名>)    求一列值的总和
avg([distinct|all]<列名>)    求一列值的平均值
max([distinct|all]<列名>)    求一列值中的最大值
min([distinct|all]<列名>)    求一列值中的最小值
Distinct:表示在计算时要取消指定列中的重复值。
All:缺省值,不取消重复值。
上述函数,除count(*)外,其他函数均忽略null值。
注意:
    group_concat()函数--将集合中的字符串连接起来;还可以按照分组字段连接起来,用逗号隔开
    集合函数中 汇总记录:在group by 分组依据  with rollup
​

多表查询

DQL:Data Query Language 数据查询语言

一、概念

同时涉及多个表的查询称为连接查询

用来连接两个表的条件称为连接条件或连接谓词

一般格式:[<表名1>.] <列名1> <比较运算符> [<表名2>.]<列名2>

比较运算符:=、>、<、>=、<=、 !=

连接谓词中的列名 称为连接字段

连接条件中的各连接字段类型必须是可比的,但不必是相同的

二、连接查询的分类

  • 按照连接的运算符分类:

    1. 等值连接

    2. 非等值连接

  • 按连接的类型分类

    1. 内连接

    2. 外连接

    3. 交叉连接

三、连接查询的表示方法

将连接条件放在from子句的后面,基本格式为:

from R {连接类型} join S {on 条件} where {条件}

连接类型:

  • Cross交叉连接(笛卡尔积)

  • inner:内连接

  • left outer join :左外连接

  • right outer join : 右外连接

  • full outer join : 全外连接

四、内连接

内连接,只返回与连接条件相匹配的元组

在内连接中,参与连接的表是平等关系,会从两个表中提取满足条件的记录并组合成新的记录

内连接的基本格式:

  • 格式1:select 字段名 from 表1 [inner] join 表2 连接条件

  • 格式2:select 字段名 from 表1,表2 where 连接条件

注意:

  • 多表查询时,任何子句中引用同名属性时,都必须加表名前缀,引用唯一属性名时可以加也可以省略表名前缀

  • 可以使用表的别名,一旦使用别名代替某一个表名,则在查询时必须用表的别名,不能再用表的原名

五、条件转换--CASE函数

CASE函数分为简单case函数和搜索case函数

简单case函数 -- 只做数据匹配,不进行比较运算和逻辑运算

基本格式:

CASE 字段名 
    WHEN  值1  THEN 转换值1 
    WHEN  值2  THEN 转换值2  
    ELSE  转换值n  
    END

搜索case函数--可以完成更为复杂的数据转换

与简单case函数的区别:

  • 搜索CASE后无字段名

  • WHEN后是布尔表达式

基本格式:

CASE
    WHEN    布尔表达式1  THEN    转换值1
    WHEN    布尔表达式2  THEN    转换值2
    ELSE    转换值n
    END

六、外连接

外连接--不但返回与连接条件相匹配的记录,而且还会根据外连接类型的不同返回与连接条件不匹配的记录

  • 左外连接

  • 右外连接

  • 全连接(MySQL不支持)

左外连接

只过滤右表,左表中的信息全部显示

语法格式:from 表1 left [ outer] join 表2 on <连接条件>

结果为:包含表1中的所有记录,不能包含表2中不满足连接条件的记录

右外连接

只过滤左表,右表的信息全部显示

语法格式:from 表1 right [ outer ] join 表2 on <连接条件>

结果为:包含表2中的所有记录,不能包含表1中不满足连接条件的记录

七、自连接

一个表与自己进行连接,称为表的自身连接

注意:需要给表起别名来区别;由于所有属性名都是同名属性,因此必须使用别名前缀

例如:
查询与“张宏”同学出生日期相同的学生的学号、姓名。
SELECT X.StudentID,X.studentName,X.Birth   FROM student AS X,student AS Y  where X.Birth=Y.Birth  and  Y.studentName='张宏‘
​

八、合并结果集

使用union将多个select语句的查询结果集组合成一个结果集

语法:select 字段列表1 from table1 UNOIN [all] select 字段列表2 from table2

注意:

  • 字段列表1和字段列表2的字段个数必须相同,且具有相同的数据类型

  • union与union all的区别:union 会筛选掉select结果集中重复记录,union all 会直接合并两个结果集

交集 intersect 和 差集 except 在SQL Server中支持,MySQL不支持

嵌套查询

一、概述

  • 一个select - from - where 语句称为一个查询块

  • 将一个查询块嵌套在另外一个查询块的where子句或having短语的条件中的查询称之为嵌套查询

二、子查询

  • 子查询和父查询的关系:子查询的查询结果是作为父查询的查询条件

  • 子查询的限制:不能使用order by

  • 子查询要加括号

  • 特点:SQL语句允许多层嵌套查询;层层嵌套方式反映了SQL语句的结构化;部分嵌套查询可以用连接运算代替

三、不相关子查询

  • 子查询的查询条件 不依赖 于父查询

  • 执行过程:是由里向外逐层处理。即先执行子查询(只执行一次),然后将子查询的结果用于建立其父查询的查找条件

四、相关子查询

  • 子查询的查询条件 依赖 于父查询

  • 内层的条件涉及到外层属性的子查询称为相关子查询

  • 执行过程:

    1. 首先取外层查询中的表的第一个元组,根据它与内层查询相关的属性值处理内层查询,执行内层查询后将查询结果带入外层查询进行查询,就能得到结果;

    2. 然后再取外层查询的下一个元组;

    3. 重复这一过程,直至外层表全部检查完为止

五、子查询的谓词

  • 子查询的结果可以是单个属性值,也可以是一个集合

  • 子查询只返回一个值时:用比较符 或者IN/NOT IN

  • 当只查询返回多个值时:

    1. IN 或者 NOT IN :是或者不是集合中的一个值

    2. (<>,>,<)ALL :不等于,大于或小于集合中所有的值

    3. (=,>,<)ANY :至少等于,大于或小于集合中的一个值

  • 子查询返回逻辑值时:用exists/ not exists

六、相关子查询与不相关子查询比较

相关子查询:

  • 子查询的查询条件依赖父查询的属性值,需执行多次;

  • 处理方式:由外向里!小括号不能少!

不相关子查询:

  • 子查询的查询条件 不依赖于 父查询的属性值,只需执行一次;

  • 处理方式:由里向外!小括号不能少!

注意:

不同形式的查询间的替换:

  • 所有带in谓词、比较运算符、ANY和ALL谓词的子查询都能用带exists谓词的子查询等价替换

  • 一些带exists或not exists 谓词的子查询不能被其他形式的子查询等价替换

猜你喜欢

转载自blog.csdn.net/weixin_42248871/article/details/109910488
今日推荐