脚本宝典收集整理的这篇文章主要介绍了数据库基础笔记(MySQL)2 —— 基础查询,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
这就要提一提这个 as 关键字,如果一个字段名过长,或者不能很好的表达该字段的含义的时候,我们可以使用 as 关键字用来给字段取别名
例:查询字段的同时,给字段取别名(注意只是改变显示结果,表中的不会被改变) select 字段1 , 字段2 as 字段3 from 表名; (这是字段2被取了别名为字段3,字段1没有变)
其中这个 as 关键字可省略(即只有一个空格) select 字段1 , 字段2 字段3 from 表名;(与上面的功能一样)
那如果名中有空格怎么办(别名中如果有空格相同处理)? 我们用引号将名字包起来,单引号为使用标准,双引号在部分数据库中不可( MySQL 中可用双引号)
字段可以使用数学表达式( +, - ,* , / 等) 注意:只要参与运算中有 NULL ,则结果一定为 NULL 例:select name , age + 1 from table_1;
select 字段1 , 字段2 , from 表名 where 条件; 例:select name , age from table_1 where age >= 18
运算符有:< ,<= ,> ,>= ,and ,or ,<> ,!= ,is null ,in ,not ,like ,= ,between…and… ( <,<=,>,>= ,这四个就不说了,就是你们认为的意思)
运算符之间有优先级,例 and 的优先级要大于 or ,可用 ( ) 来调整执行顺序
order by 字段名 (默认为升序) 指定降序:order by 字段名 desc; 指定升序:order by 字段名 asc; 按多个字段排序:order by 字段1 升或降 , 字段2 升或降 , … ( 先用字段1排,若相同,则按字段2排 ) 也可按照字段的位置排:order by 3 ( 用查询结果的第二列排,但很少这么写,字段的顺序可能会变 )
将查询的结果集只取一部分,可用于分页查询,也可在部分情况代替分组函数 max ,min limit 起始下标(从零开始) , 长度 limit 长度 (下面一种默认其实下标为 0 )
注意:distinct 只能出现在所有字段的前面,否则会有语法错误,当 distinct 出现在多个字段前面,表示多个字段联合起来去重(如果需要对多个字段中的一个去重,需要之后的知识,暂时不提)
例: select distinct name , age from table_1; 对 select name , distinct age from table_1; 错 它会把 distinct 当作字段名,age 当作别名,没法正确匹配
函数分为单行处理函数(数据处理函数)和多行处理函数(分组函数)
data_format 用于 date 转 varchar 类型,通常用于查询
只是在你想让 时间数据 的格式不同的时候使用,不使用一样能查询
datetime 与 date 一样,只不过默认格式不同 ( %Y - %m - %d %H : %i : %s )
十分重要:因为分组函数在使用之前需要先进行分组,然后才能使用,如果没有对数据进行分组,则默认整张表为一组
即先进行分组,然后对分好的进行查询 select…from…group by… (group by 在 where 之后执行,在 select 之前执行)
注意:如果有 group by 语句,则 select 后只能跟参加分组的字段,以及分组函数,select 后跟其他字段是没有意义的,甚至在其他数据库中可能报错
如果想要按 每种…的每种… 分类,则 group by … , … 我们可以把这看成将两个字段合成一个字段来看(两个字段联合分组)
与 where 功能相同,但 having 在 group by 之后执行,where 在 group by 之前执行 having 不能单独使用,必须和group by 搭配使用
可以这么理解,我们先 from 选表,然后用 where 筛选,再 group by 分组,再 having 对分好组的数据进行进一步筛选,再 select 查询,再 order by 对查询的数据进行排序,最后 limit 取一部分结果
(从一张表单独查询称为单表查询)
连接查询根据表连接的方式可以分为三种:内连接, 外连接,全连接 内连接分为:等值连接, 非等值连接,自连接 外连接分为:左外连接(左连接),右外连接(右连接)
表中每一条与其他表的每一条都匹配一次,如果第一个表有 n 个,第二个表有 m 个,则需匹配 n * m 次( 因此尽量降低表连接次数,可以大幅提高效率 )
在连接查询中,我们通常在字段名前都加上了 “表名.” ,这是为了避免混淆,因为有不止一张表连接,并不知道哪个字段在哪张表上,如果不加上,则会在每个表中都找一遍该字段,效率较低。 例:select table_1.name, table_2.sex from table_1 join table_2 on table_1.id = table_2.id 如果表名比较复杂,我们也可以起个别名 例:select t1.name, t2.sex from table_1 t1 join table_2 t2 on t1.id = t2.id
select … from 表1 join 表2 on … = … 例 :select t1.name, t2.sex from table_1 t1 join table_2 t2 on t1.id = t2.id
select … from 表1 join 表2 on …(不是等量关系就行) 例:select t1.money , t2.age from table_1 t1 join table_2 t2 on t2.age >= t1.min;
例:select t.a , tt.a from table_1 t join table_1 tt on t.b = tt.c
外连接相比于内连接,表之间多了主次关系
表示join关键字右边的表为主表,主要为了将主表的数据全部查出来,捎带关联查询左边的表,即左表只会显示符合搜索条件的记录,而右表的记录将会全部表示出来,左表记录不足的地方均为NULL
与右连接一样,把右改为左即可
Oracle数据库支持 full join ,MySQL不支持 full join ,但可以同过 左连接 + union + 右连接 实现 ( union 后面会写 )
即:select … from a join b on a 和 b 的连接条件 join c on a 和 c 的连接条件…
连接查询还可以按照语法的出现时间分类 例 SQL92 :1992年出现的语法, SQL99 :1999年出现的语法 我们上面写的为 SQL99 但是有的文章写的是 SQL92 例:select t1.name, t2.sex from table_1 t1 , table_2 t2 where t1.id = t2.id (SQL92) 其实就是没有 join 与 on,这样并不好,因为表的连接条件和筛选条件都放在where之后,这样语句结构并不清晰
union :对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序; union all :对两个结果集进行并集操作,包括重复行,不进行排序 ( 使用union 比较费时,因为要去掉完全相同的重复行 ) 例: (select id,name from A ) union all (select id,name from B ) 注意: 1.通过 union 进行合并时的列数必须相同 2.不要求合并的表列名称相同,以第一个表的列名为准 3.合并时,列和列的数据类型需要相同,如果不同 MySQL 不会报错,但是 Oracle 会报错
子查询可以出现在 select … , where … , from … 后面
例:select … , (select …) from … ; 注意:对于 select 后面的子查询,该子查询只能范围一条结果,否则就相当于一条数据匹配了多条数据,会报错
可以将子查询结果当作筛选条件 例:我们where中不能出现分组函数,所以我们可以换个思路,利用子查询完成该功能 select name , age from table_1 where age > ( select avg(age) from table_1 )
可以将子查询的结果当作一张临时表 例:select … from table_1 join (select …) table_2 on … 注意:这种派生表必须有别名,或者报错
我们要记住重要的一点,select 永远不会进行修改表内数据的操作,只是查询时显示的不同罢了
以上是脚本宝典为你收集整理的数据库基础笔记(MySQL)2 —— 基础查询全部内容,希望文章能够帮你解决数据库基础笔记(MySQL)2 —— 基础查询所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。