这个SQL语句属于什么查询语句?


  
  1. 先从from字句一个表或多个表创建工作表
  2. 将where条件应用于1)的工作表,保留满足条件的行
  3. GroupBy 将2)的结果分成多个组
  4. Having 将条件应用于3)组合的条件过滤,只保留符合要求的组。

FROM子句是SELECT语句中必不可少的子句,可以使用FROM子句指定查询所需要的数据源名称。语法如下:

 
 
其中,table_source指定要在SQL语句中使用的表,视图。虽然语句中可用的表源个数的限值可以用内存和查询中其他表达式的复杂性而有所不同,但一个语句中可最多使用256个表源。
注:如果查询中引用了很多表,查询性能会受到影响,编译和优化时间也受到其他因素的影响。

 
在数据库中查询数据时,有时只希望查询所需要的数据,而非数据表中的所有数据,那么就可以使用SELECT语句中的WHERE子句来实现。
WHERE子句通过条件表达式描述关系中元组的选择条件。数据库系统处理该语句时,按行为单位,逐个检查每个行是否满足条件,将不满足条件的行筛选掉。WHERE子句的基本格式如下:
 
 
其中,search_conditions为用户所选所需要查询数据行的条件,即查询返回行记录的满足条件。对于用户所需要的所有行,search_conditions条件为true;而对于其他行,search_conditions条件为false或未知。
WHERE子句使用的条件
组合两个表达式的运算结果或取反
查询值是否属于列表值之一
 

下面两张表将在后面使用到

 

 
 
 

 
有时,在查询时指定一个查询条件也很难满足用户需求,需要同时指定多个查询条件,那么久可以使用逻辑运算符将多个查询条件连接起来。
 
 
只有所有条件满足时才会返回结果结果
只要其中一个条件满足就会返回查询结果
条件不成立时返回查询结果
 

 
在WHERE子句中使用BETWEEN关键字查询在一定某个范围内的数据,使用NOT BETWEEN关键字查找不在某一范围内的数据。
 
 

 
在WHERE子句中,使用IN关键字可以确定表达式的取值是否属于某一列表值,同样,如果查询表达式不属于某一列值时可以使用NOT IN 关键字。
 
 
value_list为列表值,当值不止一个时需要将这些值用括号起来,各列表值之间使用逗号隔开。

 
在WHERE子句中 使用字符匹配符LIKE或NOT LIKE 可以把表达式与字符串进行比较,从而实现对字符串的模糊查询。语法如下:
 
 
其中,[NOT]为可选项,‘string’表示进行比较的字符串。WHERE子句实现对字符串的模糊匹配,进行模糊匹配是在string字符串中使用通配符。
H% 表示查询以H开头的任意字符串,如Hello —– %h 表示查询以h结尾的任意字符串,如Growth —— %h% 表示查询在任何位置包含字母的h的所有字–符串,如hui,zhi
H_ 表示查询以H开头,后面跟任意一个字符的两位字符串,如Hi,He
H[ea]% 表示查询以H开头,第二个字符是e或a的所有字符串,如:Health,Hand ———- [A-G]% 表示查询以A到G之间的任意字符开头的所有字符串,如:Apple,Banana,Guide
不在指定范围的单个字符 H[^ea]% 表示查询以H开头,的一个字符不是e或a的所有字符串,如:Hope,Hub ——— [^A_G]% 表示查询不是以A到G之间的任意字符开头的字符串,如;Job,Zoo
 
例如:查找【图书表】中【图书名】还有【人】的所有图书

 
当查询数据库中的值为NULL时,可以使用包含IS NULL关键字的WHERE子句进行查询。反之要查询数据库中的值不为NULL时,可以使用IS NOT NULL关键字。
 
 
例如:在【图书表】中查询还关键字不为NULL的数据

 
有些时候,在使用SELECT语句进行数据查询后,想先看到众多数据中最新的信息或某列的最大值,就可以使用ORDER BY子句对生成的结果集进行排序。ORDER BY子句在SELECT语句中的语法格式:
 
 
其中,order_experssion表示用于排序的列或列名及表达式。当有多个排序列时,每个排序了列用逗号隔开,而且列后都可以跟一个排序要求。
  • ASC—–升序排序(默认值)
  • 例如:将【图书表】中的信息按【BookName】倒序排序

 

例如:将【图书表】中的信息按【BookName】倒序排序和【BookID】倒序排序

 
使用GROUP BY 子句可以将查询结果按照某一列数据值进行分类,换句话说,就是对查询结果的信息进行归纳,以汇总相关数据。
 
 
其中 ,group_by_expression表示分组所依据的列,ROLLUP表示只返回第一个分组条件指定的列的统计行,若改变列的顺序就会使返回的结果行数据发生变化。CUBE是ROLLUP的扩展,表示除了返回由GROUP BY子句指定的列外,还返回按组统计的行。GROUP BY 子句通常与统计函数联合使用。如下表:
 
在使用GROUP BY子句时,将GROUP BY子句中的列称为分割列或分组列,而且必须保证SELECT语句中列是可计算的值并且GROUP BY列表中。
例如:查找【图书表】中,相同书名的书籍存在多少本

 
HAVING子句的用法类似WHERE子句,它指定了组或集合的搜索条件。HAVING子句通常与GROUP BY子句一起使用。HAVING子句的语法格式为:
 
 
其中search_conditions为查询所需的条件,即返回查询结果的满足条件。在使用GROUP BY 子句时,HAVING子句将限定整个GROUP BY子句创建的组。其具体规则如下:
  1. 如果指定了GROUP BY 子句,则HAVING 子句的查询条件应用于GROUP BY子句创建的组
  2. 如果指定了WHERE子句而没有指定GROUP BY子句,则HAVING子句的查询条件将应用于WHERE子句的输出结果集
  3. 如果既没有指定WHERE子句又没有指定GROUP BY子句,则HAVING子句的查询条件将用于FROM子句的输出结果集

 
在此查询语句中。HAVING自己与WHERE子句一样,可以使用各种运算符。

二:SELECT操作多表数据

 
在实际查询应用中,用户所需要的数据并不都是在一个表或视图中,而是多个表中,这时就要使用多表查询。多表查询把多个表中数据组合,再从中获取所需要的数据信息。多表查询首先要在这些表中建立连接, 表之间的连接就是查询的结果集,而实现连接的好处是在向数据库添加新类型数据时没有限制的,具有很大的灵活性。通常总是通过连接创建一个新表,以包含不同表中的数据。如果新表有合适的域,就可以把它连接到现有的表中。

 
在进行多表操作时,最简单的连接方式就是在SELECT语句中引用多个表的字段,在其FROM子句中用逗号将不同的基本表隔开。如果使用WHERE子句创建一个同等连接则能使查询结果集更加丰富。同等连接是指第一个或多个列值与第二个基表中对应一个或多个列值相等的连接。通常情况下使用键码建立连接,即一个基表中的主键码与第二个基表中的外键码保持一致,以保持整个数据库的参照完整性。
用户在进行基本连接操作时,可以遵循以下基本原则。
  • SELECT子句列表中,每个目标列都要加上基表名称
  • FROM子句应包括所有使用的基表
  • WHERE子句应定义一个同等连接
 
例子:查询【图书表】和【关键字表】,通过BookCode相关联

使用JOIN连接查询和基本连接查询一样都是通过连接 多个表进行操作。其连接条件主要是通过以下方法定义。
  • 指定每个表中用于连接的目标列。即在一个基本表中指定外键,在另一个基本表中指定与其关联的键
  • 指定在比较各目标列的值时要使用的比较运算符

    连接可以在SELECT语句的FROM子句或WHERE子句中创建。连接条件WHERE子句和HAVING子句组合,用于控制在FROM子句引用的基表中所选定的行。JOIN连接查询的语法格式为:

 
 
 
上诉语法中,table1hetable2为基表,join_type指定连接类型,join_conditions指定连接条件。其中类型分为内连接,外连接,交叉连接和自连接。

 
内连接是一种比较常用的数据连接查询方式,它使用比较运算符进行多个基表间数据的比较操作,并列出这些基表中与连接条件相匹配的所有数据行。一般用INNER JOIN或JOIN关键字来指定内连接,它是连接查询默认的连接方式。

内连接返回的条件是:当且仅当至少有一个同属于两个表的行符合连接条件。内连接从第一个表中消除与另一个表中任何不匹配的行。(2张表都存在的行数据)

 
外连接与内连接不同,内连接消除与另一个表任何不匹配的行,外连接会返回From子句中提到的至少一个表或视图所有的行,只要这些行符合任何搜索条件。因为在外链接中参与连接的表中有主次之分,以主表的数据行去匹配从表中的数据行如果符合连接条件则直接返回查询结果中,如果主表中的行在从表中没有找到匹配的行,主表的行任然保留返回查询结果中,相应地表中的行被填上空值后也返回到查询结果中。
返回所有匹配行并从关键字JOIN左表中返回所有不匹配发行
返回所有匹配行并从关键字JOIN右表中返回所有不匹配发行
返回两个表中所有匹配行和不匹配行
 




 
当对两个基表使用交叉连接查询时,将生成来自这两个基表各行所有可能的组合。即在结果集中,两个基表中每两个可能成对的行占一行。在交叉连接中,查询条件一般限定在WHERE子句中,查询生成的结果集分为以下两种情况:

 
当交叉连接查询语句中没有使用WHERE子句时,返回的结果集是被连接的两个基表所有行的笛卡尔积,即返回到结果集中的行数等于一个基表中符合查询条件的行数乘以另一个基表中的符合条件的行数。

 
当交叉连接查询语句中使用WHERE子句时,返回的结果集是被连接的两个基表所有的行的笛卡尔积减去WHERE子句条件搜索到的数据的行数。

 
自连接是指一个表与自身相连接的查询。自连接操作通过给基表定义别名的方式来实现。

 
联合查询是指将多个不同的查询结果连接在一起组成一组数据的查询方式。联合查询使用UNION关键字连接SELECT子句,将两个或多个查询结果集组合为单个结果集,该集包含了所有查询结果集汇总的全部行数据。

注:在使用UNION关键字进行联合查询时,应保证每个联合查询语句的选择列表中具有相同数量的表达式,并且每个查询选择表达式应具有相同的数据类型,或者可以自动将它们转化为相同的数据类型。在自动转换时,对于数值类型,系统将低精度的数据类型转换为高精度的数据类型

 
子查询和连接查询一样提供了使用单个查询操作多个表中的数据的方法。子查询在其他查询结果的基础上提供了一种有效的方式来表示WHERE子句的条件。子查询可以分为返回多行的子查询,返回单值和嵌套子查询3种。

 
返回多行子查询是指查询语句获得的结果集中返回了多行数据的子查询。在子查询中可以使用IN,EXISTS和比较运算符来连接表。
  • IN关键字 用来判断一个表中指定列的值是否包含在已定义的列表或另一个表中。通过使用IN关键字把原表中目标列的值和子查询的返回结果进行比较,如果列值与子查询的结果一致或存在与之匹配的数据行,则查询结果集中就包含该数据行。
  • EXISTS关键字 表示子查询不需要返回多行数据,而只需要返回一个真值或假值。也就是说,它的作用是在WHERE子句中测试子查询返回的行是否存在。如果存在则返回真值,如果不返回则返回假值。
  • 比较运算符 与使用IN关键字引入的子查询一样,由比较运算符与一些关键字(ANY|ALL|SOME)引入的子查询返回一个值列表。
 

 

 
在SQL中子查询是可以嵌套使用的,并且用户可以在一个查询中嵌套任意多个子查询,即一个子查询中还可以包含另一个子查询。

SQL查询:基础知识点

1、左连接、右连接、内连接、外连接

  • 内连接(INNER JOIN),用于返回两个表中满足连接条件的数据行。

  • 左外连接(LEFT OUTER JOIN),返回左表中所有的数据行;对于右表中数据,如果没有匹配的值,返回空值。

  • 右外连接(RIGHT OUTER JOIN),返回右表中所有的数据行;对于左表中数据,若没有匹配的值,返回空值。

  • 全外连接(FULL OUTER JOIN),等价于左外连接加上右外连接,返回左表和右表中所有的数据行。MySQL 不支持全外连接。

  • 交叉连接(CROSS JOIN),也称为笛卡尔积(Cartesian product),两个表的笛卡尔积相当于一个表的所有行和另一个表的所有行两两组合,结果的数量为两个表的行数相乘。

  • 自连接(Self Join),是指连接操作符的两边都是同一个表,即把一个表和它自己进行连接。自连接主要用于处理那些对自己进行了外键引用的表

2、SQL支持三种注释:

3、LIKE支持两个通配符匹配选项:% 和 _

  • DISTINCT:在映射之后对数据进行去重;

  • UNION(并集运算:将两个子查询拼接起来并去重;

  • UNION ALL并集运算:将两个子查询拼接起来但不去重;

  • INTERSECT(交集运算):保留两个子查询中都有的结果并去重;MySQL 不支持 INTERSECT。

5、SQL查询语句执行顺序:

  • 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。如电话列可进行拆分---家庭电话、公司电话

  • 第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。

  • 第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)

7、数据库常见对象有哪些?

  表(Table)、视图(View)、序列(Sequence)、索引(Index)、存储过程(Stored Procedure)、触发器(Trigger)、用户(User)以及同义词(Synonym)等等。其中,表是关系数据库中存储数据的主要形式。

  • 避免在WHERE子句中使用in、not in (会导致全表扫描),对于连续的数值,能用between 就不要用 in 了。

  • 将对于同一个表格的多个字段的操作写到同一个sql中, 而不是分开成两个sql语句实现。

  • 最好不要使用“ * ”。

  • 尽量使用“>=”,不要使用“>”。

  • 提高GROUP BY语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉.下面两个查询返回相同结果,但第二个明显就快了许多。

  • 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。

  • 不要有超过5个以上的表连接(JOIN),考虑使用临时表或表变量存放中间结果。少用子查询,视图嵌套不要过深,一般视图嵌套不要超过2个为宜。

  • 使用别名,别名是大型数据库的应用技巧,就是表名、列名在查询中以一个字母为别名,查询速度要比建连接表快1.5倍。

  • 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。

  • 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。

  • 应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。

  • 如果已知只有一个查询结果,推荐使用limit 1。

  • 优化limit分页:通常用limits来实现日常分页,但当偏移量特别大时,查询效率便会降低。因为Mysql不会跳过偏移量,而是直接获取数据。

  • 谨慎使用distinct关键词:Distinct关键词通常用于过滤重复记录以返回唯一记录。当其被用于查询一个或几个字段时,Distinct关键词将为查询带来优化效果。然而,在字段过多的情况下,Distinct关键词将大大降低查询效率。

SQL约束用于规定表中的数据规则。

  • 如果存在违反约束的数据行为,行为会被约束终止。

  • 约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。

  • 非空约束NOT NULL:指某列不能存储 NULL 值。比如员工姓名不能为空。

  • 唯一约束UNIQUE:保证某列的每行必须有唯一的值。例如每个员工的电子邮箱不能重复。每个表可以有多个唯一约束。

  • 主键约束PRIMARY KEY :NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。例如员工编号,部门编号等。

  • 外键约束FOREIGN KEY:保证一个表中的数据匹配另一个表中的值的参照完整性,用于表示两个表之间的引用关系。例如,员工属于部门,因此员工表中的部门编号字段可以定义为外键,它引用了部门信息表中的主键。

  • 检查约束CHECK:保证列中的值符合指定的条件。例如,薪水必须大于 0 ,性别只能是男和女等。

  • 默认值DEFAULT:规定没有给列赋值时的默认值。

  • PrimaryKey(主键)——是表中的一个或多个字段的集合。它们不接受空值和重复值。并且表中只存在一个主键。

  • ForeignKey(外键)——在一个表中定义主键并在另一个表中定义字段的键被标识为外键。

  • UniqueKey(唯一键)——除了主键之外,表中还有更多键,它们只标识记录,但唯一的区别是它们只接受一个空值但不接受重复值。

  • CandidateKey(候选密钥)——在任何情况下,如果需要,任何候选密钥都可以作为主键。

  • CompoundKey(复合键)——此键是候选键和主键的组合。

  • SuperKey(超级密钥)——一个或多个密钥的集合被定义为超级密钥,它用于唯一地标识表中的记录。主键,唯一键和备用键是超级键的子集。

  • AlternateKey(备用密钥)——在任何情况下,如果需要,任何备用密钥都可以作为主键或候选键。

  • 主键索引: 主键是一种唯一性索引,但它必须指定为PRIMARY KEY,每个表只能有一个主键。

  • 唯一索引: 索引列的所有值都只能出现一次,即必须唯一,值可以为空。

  • 普通索引 : 基本的索引类型,值可以为空,没有唯一性的限制。 

  • INDEX)命令创建全文索引要比把记录插入带有全文索引的空表更快。

l  一个表只能有一个主键索引,但是可以有多个唯一索引。

l  主键索引一定是唯一索引,唯一索引不是主键索引。

l  主键可以与外键构成参照完整性约束,防止数据不一致。

l  复合索引将多个列组合在一起创建索引,可以覆盖多个列。

l  外键索引:只有InnoDB类型的表才可使用外键索引,保证数据的一致性、完整性和级联操作(基本不用)

l  全文索引:MySQL自带的全文索引只能用于MyISAM,并且只能对英文进行全文检索 (基本不用)。

  • 视图是基于 SQL 语句的结果集的可视化的表

  • 视图是虚拟的表,本身不包含数据,也就不能对其进行索引操作。对视图的操作和对普通表的操作一样。

  • 简化复杂的 SQL 操作,比如复杂的联结

  • 只使用实际表的一部分数据

  • 通过只给用户访问视图的权限,保证数据的安全性

## 日期转化为时间戳 ##

## 时间戳转化为日期 ##

## 日期和日期之间,也可以通过时间戳来进行转换 ##

#日期( 17:13:39)怎么转换为想要的格式()

日期之间怎么进行加减操作?

不同格式数据的转换:cast

欢迎转发分享、点赞评论

我要回帖

更多关于 sql语言中,子查询是什么 的文章

 

随机推荐