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子句设置过滤条件
-
指出查询范围:expression [NOT] between expression1 and expression2
注意:expression1 不能大于expression2的值
between包含边界值,not between 不包含边界值
-
指定一个集合:expression IN (expression....)
值表中列出所有可能的值,当表达式与集合中的任意一个值匹配时,即返回true,否则返回false
-
模糊查询,字符匹配like:字段名 [ NOT ] like ...
如果条件不确定,必须使用LIKE关键字进行模糊查询
用like进行字符串匹配,将该字符串叫做匹配串,用它与属性值进行比较,
匹配串中的通配符为:_ 任意单个字符;% 零个或多个任意字符串
-
转义:_ 被转移为_;\\被转移为\; \被转移为%;
-
空值查询:is null ; is not null 表示非空
-
逻辑运算符: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>
比较运算符:=、>、<、>=、<=、 !=
连接谓词中的列名 称为连接字段
连接条件中的各连接字段类型必须是可比的,但不必是相同的
二、连接查询的分类
-
按照连接的运算符分类:
-
等值连接
-
非等值连接
-
-
按连接的类型分类
-
内连接
-
外连接
-
交叉连接
-
三、连接查询的表示方法
将连接条件放在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语句的结构化;部分嵌套查询可以用连接运算代替
三、不相关子查询
-
子查询的查询条件 不依赖 于父查询
-
执行过程:是由里向外逐层处理。即先执行子查询(只执行一次),然后将子查询的结果用于建立其父查询的查找条件
四、相关子查询
-
子查询的查询条件 依赖 于父查询
-
内层的条件涉及到外层属性的子查询称为相关子查询
-
执行过程:
-
首先取外层查询中的表的第一个元组,根据它与内层查询相关的属性值处理内层查询,执行内层查询后将查询结果带入外层查询进行查询,就能得到结果;
-
然后再取外层查询的下一个元组;
-
重复这一过程,直至外层表全部检查完为止
-
五、子查询的谓词
-
子查询的结果可以是单个属性值,也可以是一个集合
-
子查询只返回一个值时:用比较符 或者IN/NOT IN
-
当只查询返回多个值时:
-
IN 或者 NOT IN :是或者不是集合中的一个值
-
(<>,>,<)ALL :不等于,大于或小于集合中所有的值
-
(=,>,<)ANY :至少等于,大于或小于集合中的一个值
-
-
子查询返回逻辑值时:用exists/ not exists
六、相关子查询与不相关子查询比较
相关子查询:
-
子查询的查询条件依赖父查询的属性值,需执行多次;
-
处理方式:由外向里!小括号不能少!
不相关子查询:
-
子查询的查询条件 不依赖于 父查询的属性值,只需执行一次;
-
处理方式:由里向外!小括号不能少!
注意:
不同形式的查询间的替换:
-
所有带in谓词、比较运算符、ANY和ALL谓词的子查询都能用带exists谓词的子查询等价替换
-
一些带exists或not exists 谓词的子查询不能被其他形式的子查询等价替换