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   /*  要检索的行数  */

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值