01单表查询总结

检索数据

检索单个列

/* 没有明确排序查询的结果,则返回的数据的顺序没有特殊意义    */
select prod_name from products;

检索多个列

select prod_id,prod_name,prod_price from products;

检索所有列

/* 如果给定一个通配符(*),则返回列表中的所有列。
	列的顺序一般是列在表中定义出现的顺序。
	检索不需要的列通常会降低检索和应用程序的性能
*/
select * from produts;

检索不同的行

使用DISTICNT 关键字,此关键字指示MYSQL只返回不同的值。

select distinct vend_id from products;

限制结果

SELECT 语句返回所有匹配的行

为了返回指定的行,可使用 LIMIT子句

LIMIT start,count; //从start开始的count个数据;start从0开始计数

select prod_name from products LIMIT 5; /*  检索前5行数据  */

排序检索数据

使用SELECT语句的ORDER BY子句,根据需要排序检索出的数据

检索出的数据并不是纯粹的以随机顺序显示。如果不排序,,数据一般将以它在底层表中出现的顺序显示。但是,如果数据后来进行过更新和删除,则此顺序将会受到MYSQL重用回收存储空间的影响。因此,如果不明确控制的话,不能(也不应该)依赖排序顺序。关系数据库设计理论认为,如果不明确规定排序顺序,则不应该假定检索出的顺序有意义。

排序数据

select prod_name from products order by prod_name; /* 按照姓名顺序进行排序  */

按多个列排序

为了按多个列排序,只要指定列名,列名之间用逗号分开即可(就像选择多个列时所做的那样)

/*首先按照价格,然后按照名称进行排序*/
/*  仅在多个行具有相同的prod_price值时才对产品按prod_name进行排序。
	如果prod_price列中所有的值都是唯一的,则不会按照prod_name排序
*/
select prod_id,prod_price,prod_name from products order by prod_price,prod_name;

指定排序方向

数据排序不限于升序排序(从A到Z),这只是默认的排序顺序,还可以使用ORDER BY子句以降序(从Z到A)降序排序。为了进行降序排序,必须指定DESC关键字。

/*  按价格以降序排序产品*/
select prod_id from products order by prod_price desc;

如果想在多个列上进行降序排序,必须对每个列指定DESC关键字。

与DESC相反的关键字是ASC,在升序排序时可以指定它。

过滤数据

数据库表一般包含大量的数据,很少需要检索表中所有的行。

通常只会根据特定操作或报告的需要提取表数据的子集。

只检索所需数据需要指定搜索条件,搜索条件也称为过滤条件。

在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。WHERE子句在表名之后给出

检查单个值

select prod_name,prod_price from products where prod_price = 2.50;

不匹配检查

select vend_id,prod_name from products where vend_id <>1003;

范围检查

为了检查某个范围的值,可以使用BETWEEN操作符。

select prod_name from products where prod_price between 5 AND 10;

空值检查

在创建表时,表设计人员可以指定其中的列是否可以不包含值。 在一个列不包含值时,称其为包含空值null

NULL 无值,它与字段包含0、字符串或仅仅包含空格不同

select prod_name from products where prod_price is null;

AND 操作符

为了通过不止一个列进行过滤,可使用AND操作符给WHERE子句附加条件。

AND:用来指示检索满足所有给定条件的行

select prod_id,prod_price from products where vernd_id = 1003 and prod_price <=10;

OR操作符

OR:指示MySql检索匹配任一条件的行

计算次序

解决方法就是使用圆括号明确的分组相应的操作符

IN操作符

IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。

IN取合法值的的由逗号分隔的清单,全都在圆括号内。

select prod_name from products where vend_id in (1002,1003) order by prod_name;

NOT操作符

NOT操作符的作用:否定它之后所跟的任何条件。

/*  列出除1002和1003之外所有供应商制造的产品 */
select prod_name from products where vend_id  NOT in (1002,1003) order by prod_name;

通配符进行过滤

通配符:用来匹配值的一部分特殊字符

为了在搜索子句中使用通配符,必须使用LIKE操作符。

LIKE指示MYSQL后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。

%号通配符

在搜索串中,%表示任何字符出现任意次数

/*  找出所有以词jet起头的产品 */
select prod_id from products where prod_name like 'jet%';

/* 匹配包含anvil的值,而不论它之前或之后出现什么字符 */
select prod_id from products where prod_name like '%anvil%';

/* 匹配以s起头以e结尾的所有产品 */
select prod_id from products where prod_name like 's%e';

——通配符

只匹配单个字符而不是多个字符


创建计算字段

我们需要直接从数据库中检索出转换、计算或格式化的数据;而不是检索出数据,然后再客户机应用程序或报告程序中再重新格式化

计算字段是在运行时在SELECT语句内创建的,并不是实际存在于数据库中

拼接字段

拼接:将值连接到一起构成单个值

在MySQL的SELECT子句中,可使用Concat()函数来拼接两个列

select Concat(vend_name,'(',vend_country,')') from vendors order by vend_name; 

执行算数计算

使用数据处理函数

文本处理函数

函数 功能
Left() 返回左边的字符串
Length() 返回字符串的长度
Locate() 找出串的一个子串
Lower() 将串转为小写
LTrim() 去掉串左边的空格

日期与时间处理函数

函数 功能
AddDate() 增加一个日期(天、周)
AddTime() 增加一个时间
CurDate() 返回当前日期
CurTime() 返回当前时间
Date() 返回当前日期时间的日期部分
DateDiff() 计算两个日期之差

汇总数据

我们经常需要汇总数据而不是把他们实际检索出来,为此MySql提供了专门的函数。使用这些函数,MySql查询可用于检索数据,以便分析和报表生成。这种类型的检索例子有以下几种:

  1. 确定表中的行数(或者满足某个条件或者包含某个特定值的行数)

  2. 获得表中行组的和

  3. 找出表列(或所有行或某些特定的行)的最大值,最小值和平均值

    聚集函数:运行在行组上,计算和返回单个值的函数

    函数 说明
    AVG() 返回某列的平均值
    COUNT() 返回某列的行数
    MAX() 返回某列的最大值
    MIN() 返回某列的最小值
    SUM() 返回某列值之和

AVG()函数

AVG()通过对表中行数计算并计算特定列值之和,求得该列的平均值;

AVG()函数会忽略列值为NULL的行

/**
	返回products所有产品的平均价格
**/
SELECT AVG(PROD_PRICE) AS avg_price;

/*1003供应商的平均价格*/
SELECT AVG(PROD_PRICE) AS avg_price where vend_id=1003;

COUNT()函数

COUNT()函数进行计数。可利用COUNT()函数确定表中行的数目或符合特定条件行的数目

COUNT(*):对表中行的数目进行计数,不管表列中包含的是空值还是非空值

COUNT(columb):对特定列中具有值的行进行计数,忽略NULL值。

/*  返回customers表中客户的总数*/
select count(*as num_cust from customers;

MAX函数

MAX()返回指定列中的最大值

MAX()要求指定列名

忽略列值为NULL的行

select max(prod_price) as max_price from products;

MIN函数

MIN()返回列中的最小值

忽略列值为NULL的行

SUM函数

SUM()用来指定列值的和(总计)

聚集函数用来汇总数据。MySQL支持一系列聚集函数,可以用多种方法使用他们以返回所需要的结果,这些函数是高效设计的,它们返回的结果一般比自己再客户机应用程序中计算要快的多

分组数据

分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算。

创建分组

分组是在SELECT 语句的GROUP BY 子句中建立的。

/*
	GROUP BY子句指示MySql按照vend_id排序并分组数据。
	这导致对每个vend_id而不是整个表就散num_prod.
	GROUP BY子句指示MySql子句指示MySQL分组数据,然后对每个组而不是整个结果集进行聚集。
*/
SELECT 
  VEND_ID,
  COUNT(*) AS NUM_PRODS 
FROM
  PRODUCTS 
GROUP BY VEND_ID ;

  1. GROUP BY子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制
  2. 如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算。
  3. GROUP BY子句中的每个列都必须是检索列或有效表达式。
  4. 如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组。

过滤分组

除了能用GROUP BY分组数据外,MYSQl还允许过滤分组,规定包括哪些分组,排除哪些分组

WHERE过滤指定的是行而不是分组‘

where过滤行,而HAVING过滤分组

/*    */
SELECT 
  cust_id,
  COUNT(*) AS orders 
FROM
  orders 
GROUP BY cust_id 
HAVING COUNT(*) >= 2 ;

where与having的区别

where在数据分组前进行过滤,HAVING在数据分组后进行过滤。

WHERE排除的行不包括在分组中,这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组

/* 具有2个(含)以上,价格为10(含)以上的产品  */
SELECT 
  vend_id,
  COUNT(*) AS num_prods 
FROM
  products 
WHERE prod_price >= 10   /*Where子句过滤所有prod_price至少为10的行      */
GROUP BY vend_id        /*  按照vend_id分组数据   */
HAVING COUNT(*) >= 2 ; /* having子句过滤数据计数为2或2以上的分组    */

SELECT子句的顺序

SELECT
字段,计算字段
FROMWHERE
xxxxxxx  /* 行级过滤  */
GROUP BY /* 分组说明  */
xxxxx
HAVING  /*  组级过滤  */
xxxxx
ORDER BY
xxxx     /*  输出要排序顺序  */
LIMIT 
xxxx   /*  要检索的行数  */

发布了101 篇原创文章 · 获赞 17 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ZHOUJIAN_TANK/article/details/103953607