小白也能看懂的mySQL进阶【单表查询】

摘要:
SELECT子句列出要从表中查询的列的名称,而from子句指定要从中选择数据的表的名称。在SQL语句中使用字符串或日期常量时,必须将其括在单引号(')中。当多行中存在NULL时,它也将被合并为一段NULL数据。注释的编写方法是SQL语句中用于标识说明或预防措施的部分。比较运算符不能用于NULL——例如,选择采购单价不是2800 yen_name,purchase_priceFROMProductWHEREpurchase_price2800的SELECTproduct记录;由于这两张唱片的购买单价未知,因此无法确定是否为2800日元。

目录

 

1.查询基础

SELECT语句基础

列的查询 

为列设定别名 

常数的查询

过滤表中重复数据

根据WHERE语句来选择记录 

注释的书写方法 

算术运算符和比较运算符

算术运算符

需要注意NULL 

比较运算符

对字符串使用不等号时的注意事项

不能对NULL使用比较运算符

逻辑运算符

NOT运算符 

AND运算符和OR运算符

通过括号强化处理

逻辑运算符和真值

含有NULL时的真值 

2.聚合与排序

(1)对表进行聚合查询

计算表中数据的行数(COUNT)

计算合计值(SUM)

计算平均值

计算最大值和最小值(MAX&MIN) 

使用聚合函数过滤重复值(DISTINCT) 

对表进行分组

GROUP BY子句

聚合键中包含NULL的情况

使用WHERE子句时GROUP BY的执行结果 

与聚合函数和GROUP BY子句有关的常见错误 

为聚合结果指定条件

HAVING子句

对查询结果进行排序

ORDER BY子句 

指定升序或降序

指定多个排序键 

NULL的顺序 

在排序键中使用显示用的别名 

ORDER BY子句中可以使用的列


1.查询基础

SELECT语句基础


列的查询 

通过 SELECT 语句查询并选取出必要数据的过程称为匹配查询或查询(query)。 

--基本的SELECT语句
SELECT <列名>,…… 
FROM <表名>;

该SELECT 语句包含了SELECT 和FROM 两个子句(clause) 。

SELECT 子句中列举了希望从表中查询出的列的名称,而 FROM 子句 则指定了选取出数据的表的名称。
注:

(1)查询多列时,需要使用逗号进行分隔

(2) 查询结果中列的顺序和 SELECT 子句中的顺序相同 。

(3)想要查询出全部列时,可以使用代表所有列的星号(*)不过如果使用星号的话,就无法设定列的显示顺序了 。

为列设定别名 

SQL 语句可以使用 AS关键字为列设定别名。

SELECT  product_id AS id,  product_name AS name, purchase_price AS price
FROM Product;

(1)别名可以使用中文,使用中文时需要用双引号(")括起来 。

注:使用双引号可以设定包含空格 (空白)的别名。但是如果忘记使用双引号就可能出错,因此并不推荐。

大家可以像product_ id这样使用下划线(_)来代替空白。

(2)在SQL语句中使用字符串或者日期常数时,必须使用单引号(')将其括起来。

常数的查询

SELECT 子句中可以书写列名,书写常数,还可以书写表达式(后面有详情)。

过滤表中重复数据

使用DISTINCT过滤product_type列中重复的数据 

SELECT DISTINCT product_type  
FROM Product;

注:在使用DISTINCT 时,NULL 也被视为一类数据。NULL 存在于多行中时,也会被合并为一条 NULL 数据。

在多列之前使用DISTINCT

SELECT DISTINCT product_type, regist_date  
FROM Product;

DISTINCT关键字,作用于多个字段时,需满足多个字段才会过滤重复数据

根据WHERE语句来选择记录 

语句通过WHERE 子句来指定查询数据的条件

SELECT语句中的WHERE子句
 

SELECT <列名>, ……  
FROM <表名> 
WHERE <条件表达式>;

执行过程:首先通过 WHERE 子句查询出符合指定条件的记录(即:行),然后再选取出SELECT 语句指定的列。

注:

(1)SQL中子句的书写顺序是固定的,不能随意更改。

(2)WHERE子句也可以使用表达式。

注释的书写方法 

注释是SQL 语句中用来标识 说明或者注意事项的部分。

写法:

    ●    1行注释 书写在“--”之后,只能写在同一行。 
    ●    多行注释 书写在“/*”和“*/”之间,可以跨多行。

注释能够帮助阅读者更好地理解SQL 语句,特别是在书写复杂的SQL 语句时, 希望大家能够尽量多加简明易懂的注释。

算术运算符和比较运算符


算术运算符

SQL语句中可以使用的四则运算的主要运算符
含义运算符
加法运算+
减法运算-
乘法运算*
除法运算/

SELECT 子句中书写算术表达式

SELECT product_name, sale_price,  sale_price * 2 AS "sale_price_x2"  
FROM Product;

SELECT子句中可以使用常数或者表达式。

注:SQL 中也可以像平常的运算表达式那样使用括号( )。括号中 运算表达式的优先级会得到提升,优先进行运算。

需要注意NULL 

A  5 + NULL  B  10 - NULL

C  1 * NULL   D   4 / NULL

E  NULL / 9   F   NULL / 0

实际上所有包含 NULL 的计算,结果肯定是 NULL,NULL / 0也不例外。

比较运算符

比较运算符
运算符含义
=和~相等
<>和~不相等
>=大于等于~
>大于~
<=小于等于~
<小于~
--例:选取出销售单价大于等于1000日元的记录 
SELECT product_name, product_type, sale_price  
FROM Product 
WHERE sale_price >= 1000;

注:

(1)小于某个日期就是在该日期之前的意思

(2)使用比较运算符时一定要注意不等号和等号的位置。
 

WHERE子句的条件表达式中也可以使用计算表达式 

--例:
SELECT product_name, sale_price, purchase_price  
FROM Product 
WHERE sale_price - purchase_price >= 500;

对字符串使用不等号时的注意事项

--例:选取出大于'2'的数据的SELECT语句 
SELECT chr  
FROM Chars 
WHERE chr > '2';

注: 2 和'2' 并 不一样。 

chr 列被定为字符串类型,并且在对字符串类型的数据进行大小比较时,使用的是和数字比较不同的规则。

字符串类型的数据比较规则即:以相同字符开头的单词比不同字符开头的单词更相近,与字典顺序类似。
    小白也能看懂的mySQL进阶【单表查询】第1张

'10' 和'11' 同样都是以'1' 开头的字符串,首先判定为比'2' 小。 

不能对NULL使用比较运算符

--例:选取出进货单价不是2800日元的记录 
SELECT product_name, purchase_price  
FROM Product 
WHERE purchase_price <> 2800;

这两条记录由于进货单价 不明(NULL),因此无法判定是不是 2800日元。 

--例:错误的SELECT语句(一条记录也取不出来) 
SELECT product_name, purchase_price  
FROM Product 
WHERE purchase_price = NULL;

使用=运算符也还是无法选取出NULL 的记录 

SQL 提供了专门用来判断是否为 NULL 的IS NULL 运算符。

--例:选取NULL的记录 
SELECT product_name, purchase_price  
FROM Product 
WHERE purchase_price IS NULL;

反之,希望选取不是NULL 的记录时,需要使用 IS NOT NULL 运 算符

逻辑运算符


NOT运算符 

NOT运算符用来否定某一条件,但是不能滥用。

--例:选取出销售单价大于等于1000日元的记录
SELECT product_name, product_type, sale_price  
FROM Product 
WHERE NOT sale_price < 1000;
--例:结果与上例一致
SELECT product_name, product_type, sale_price  
FROM Product 
WHERE  sale_price >= 1000;

AND运算符和OR运算符

AND 运算符在其两侧的查询条件都成立时整个查询条件才成立,其意思相当于“并且”。

OR 运算符在其两侧的查询条件有一个成立时整个查询条件都成立, 其意思相当于“或者”

注:AND 运算符优先于 OR 运算符,想要优先执行OR运算符时可以使用括号。

--例:在WHERE子句的查询条件中使用OR运算符
SELECT product_name, purchase_price  
FROM Product 
WHERE product_type = '厨房用具' OR sale_price >= 3000;

通过括号强化处理

--例:通过使用括号让OR运算符先于AND运算符执行 
SELECT product_name, product_type, regist_date  
FROM Product 
WHERE product_type = '办公用品'  AND ( regist_date = '2009-09-11' OR regist_date = '2009-09-20');

逻辑运算符和真值

 NOT、AND 和 OR 称为逻辑运算符。这里所说的逻辑就是对真值进行操作的意思。

真值就是值为真(TRUE)或假 (FALSE)其中之一的值 

AND 运算符两侧的真值都为真时返回真,除此之外都返回假。

OR 运算符两侧的真值只要有一个不为假就返回真,只有当其两侧的真值都为假时才返回假。

NOT 运算符只是单纯的将真转换为假,将假转换为真。

含有NULL时的真值 

既不是真也不是假,这时真值是除真假之外的第三种值——不确定(UNKNOWN)

与通常的逻辑运算被称为二值逻辑相对,只有 SQL 中 的逻辑运算被称为三值逻辑。 

考虑到使用NULL 时的条件判断会变得异常复杂。因此,数据库领域的有识之士们达成了“尽量不使用 NULL”的共识。 

2.聚合与排序

(1)对表进行聚合查询

通过 SQL 对数据进行某种操作或计算时需要使用函数

 5个常用的函数:

COUNT: 计算表中的记录数(行数)

SUM: 计算表中数值列中数据的合计值

AVG: 计算表中数值列中数据的平均值

MAX: 求出表中任意列中数据的最大值

MIN: 求出表中任意列中数据的最小值

用于汇总的函数称为聚合函数或者聚集函数。

所谓聚合,就是将多行汇总为一行。实际上,所有的聚合函数都是这样,输入多行输出一行。

计算表中数据的行数(COUNT)

用COUNT 函数时,输入表的列,就能够输出数据行数。

--语法:
SELECT COUNT(parameter)
FROM 表名;

--计算全部数据的行数 
SELECT COUNT(*)  
FROM Product;

--计算NULL之外的数据行数 
SELECT COUNT(具体字段名)  
FROM Product;

COUNT函数的结果根据参数的不同而不同。如:COUNT(*)会得到包含NULL的数据的行数,而COUNT(<列名>)会得到NULL之外的数据行数。
注: COUNT 函数使用*代替所有列,其他函数并不能将星号作为参数。

计算合计值(SUM)

语法与COUNT函数基本相同

聚合函数会将NULL排除在外。但COUNT(*)例外,并不会排除NULL。
 

--计算分别slae_price与purchase_price的合值
SELECT SUM(sale_price), SUM(purchase_price)   
FROM Product;

注:所有的聚合函数,如果以列名为参数,那么在计算之前就已经把 NULL 排除在外了。因此,无论有多少个 NULL 都会被无视。这与“等 价为 0”并不相同 。 

计算平均值

其语法和 SUM函数完全相同

不会计算值为的NULL行

--计算sale_price列的平均值
SELECT AVG(sale_price)   
FROM Product;

计算最大值和最小值(MAX&MIN) 

这两个函数的语法与 SUM 的语法相同

但是,MAX/MIN 函数和SUM/AVG函数有一点不同,那就是 SUM/ AVG函数只能对数值类型的列使用,而 MAX/MIN 函数原则上可以适用 于任何数据类型(能够排序)的列。

使用聚合函数过滤重复值(DISTINCT) 

--计算去除重复数据后的数据行数 
SELECT COUNT(DISTINCT product_type)  
FROM Product;
--先计算数据行数再删除重复数据的结果 
SELECT DISTINCT COUNT(product_type)  
FROM Product;
--两者结果不一致

对表进行分组


GROUP BY子句

--语法
SELECT <列名1>, <列名2>, <列名3>, ……  
FROM <表名> 
GROUP BY <列名1>, <列名2>, <列名3>, ……;

GROUP BY 子句就像切蛋糕那样将表进行分组

在 GROUP BY 子句中指定的列称为聚合键或者分组列。

子句的书写顺序(暂定) 1.	SELECT	→	2.	FROM	→	3.	WHERE	→	4.	GROUP BY

聚合键中包含NULL的情况

--按照进货单价统计数据行数 
SELECT purchase_price, COUNT(*)  
FROM Product 
GROUP BY purchase_price;

聚合键中包含NULL时,在结果中会以“不确定”行(空行)的形式表现出来。

使用WHERE子句时GROUP BY的执行结果 

-- 语法:使用WHERE子句和GROUP BY子句进行汇总处理
SELECT <列名1>, <列名2>, <列名3>, ……  
FROM <表名> 
WHERE  
GROUP BY <列名1>, <列名2>, <列名3>, ……;

执行顺序:会先根据 WHERE 子句指定的条件进行过滤,然后再进行汇总处理。

即:GROUP BY 和 WHERE 并用时 SELECT 语句的执行顺序 FROM    →    WHERE    →    GROUP BY    →    SELECT

--例:
SELECT purchase_price, COUNT(*)  
FROM Product 
WHERE product_type = '衣服' 
GROUP BY purchase_price;

与聚合函数和GROUP BY子句有关的常见错误 

1.把聚合键之外的列名书写在SELECT 子句之中。(只有MySQL认同这种语法)

聚合键相对应的、同时存在多个值的列出现在SELECT 子 句中的情况,理论上是不可能的。

使用GROUP BY子句时,SELECT子句中不能出现聚合键之外的列名。 

2.在GROUP BY子句中写了列的别名 

--错误示范
SELECT product_type AS pt, COUNT(*)  
FROM Product 
GROUP BY pt;
--原因:由SQL语句在DBMS内部的执行顺序造成的

在GROUP BY子句中不能使用SELECT子句中定义的别名。 

3.GROUP BY子句的结果能排序吗

GROUP BY子句结果的默认显示是无序的。 

4.在WHERE子句中使用聚合函数

只有 SELECT 子句和 HAVING 子句( ORDER BY 子句)中能够使用COUNT 等聚合函数。

为聚合结果指定条件


HAVING子句

由于WHERE 子句只能指定记录(行)的条件,而不能用来指定组的条件,所以可以使用HAVING子句。

--语法:
SELECT <列名1>, <列名2>, <列名3>, ……  
FROM <表名> 
GROUP BY <列名1>, <列名2>, <列名3>, …… 
HAVING <分组结果对应的条件>
--注:HAVING子句要写在GROUP BY子句之后。

使用 HAVING 子句时 SELECT 语句书写顺序 SELECT    →    FROM    →    WHERE    →    GROUP BY    →    HAVING

-- 例1:从按照商品种类进行分组后的结果中,取出“包含的数据行数为2 行”的组
SELECT product_type, COUNT(*)  
FROM Product 
GROUP BY product_type 
HAVING COUNT(*) = 2;
--例2:使用HAVING子句设定条件的情况 
SELECT product_type, AVG(sale_price)  
FROM Product 
GROUP BY product_type 
HAVING AVG(sale_price) >= 2500;

HAVING 子句中 能够使用的3种要素如下所示:

●    常数

●    聚合函数

● GROUP BY子句中指定的列名(即聚合键)

WHERE子句与HAVING子句

WHERE 子句    =    指定行所对应的条件

HAVING 子句    =    指定组所对应的条件

对查询结果进行排序


ORDER BY子句 

通过在 SELECT 语句末尾添加 ORDER BY 子句来明确指定排列顺序。 

--语法:
SELECT <列名1>, <列名2>, <列名3>, ……  
FROM <表名> 
ORDER BY <排序基准列1>, <排序基准列2>, ……
--ORDER BY子句中书写的列名称为排序键。

子句的书写顺序
    1.    SELECT 子句    →    2.    FROM 子句    →    3.    WHERE 子句    →    4.    GROUP BY 子句    →    5.    HAVING 子句    →    6.    ORDER BY 子句

注:不论何种情况,ORDER BY 子句都需要写在 SELECT 语句的末尾。

指定升序或降序


在OPDER BY子句的列名后面使用 DESC(降序)ASC(默认升序) 关键字。
 

--按照销售单价由高到低(降序)进行排列 
SELECT product_id, product_name, sale_price, purchase_price  
FROM Product 
ORDER BY sale_price DESC;

注:由于 ASC 和 DESC 这两个关键字是以列为单位指定的,因此可以 同时指定一个列为升序,指定其他列为降序。
 

指定多个排序键 

如果想要对该顺序的商品进行更细致的排序的话,就需要再添加一个 排序键。

--按照销售单价和商品编号的升序进行排序 
SELECT product_id, product_name, sale_price, purchase_price  
FROM Product 
ORDER BY sale_price, product_id;

规则是优先使用左侧的键,如果该列存在相同值的话,再接着参考右侧的键。当然,也可以同时使用 3个以上的排序键。

NULL的顺序 

使用含有 NULL 的列作为排序键时, NULL 会在结果的开头或末尾汇总显示,因为NULL值可以被认为是最小值。

--按照进货单价的升序进行排列 
SELECT product_id, product_name, sale_price, purchase_price  
FROM Product 
ORDER BY purchase_price;

在排序键中使用显示用的别名 

在 GROUP BY子句中不能使用 SELECT子句中定义的别名,但是在 ORDER BY子句中却是允许使用名的。

--ORDER BY子句中可以使用列的别名 
SELECT product_id AS id, product_name, sale_price AS sp, purchase� _price  
ROM Product 
ORDER BY sp, id;

使用 HAVING 子句时 SELECT 语句的顺序

FROM→WHERE→GROUP BY→HAVING→SELECT→ORDER BY 

ORDER BY子句中可以使用的列

ORDER BY 子句中也可以使用存在于表中、但并不包含在 SELECT 子句之中的列

--例:SELECT子句中未包含的列也可以在ORDER BY子句中使用 
SELECT product_name, sale_price, purchase_price  
FROM Product 
ORDER BY product_id;

ORDER BY子句中可以使用列的编号 (不推荐)

-- 通过列名指定 
SELECT product_id, product_name, sale_price, purchase_price  
FROM Product 
ORDER BY sale_price DESC, product_id;
-- 通过列编号指定 
SELECT product_id, product_name, sale_price, purchase_price  
FROM Product 
ORDER BY 3 DESC, 1;

免责声明:文章转载自《小白也能看懂的mySQL进阶【单表查询】》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇java实现数据的Excel导出(合并单元格、样式等)FileStream和Streamreader、StreamWriter的区别下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mysql 行转列

1.表数据 2.结果数据 CREATE TABLE `TEST_TB_GRADE` ( `ID` int(10) NOT NULL AUTO_INCREMENT, `USER_NAME` varchar(20) DEFAULT NULL, `COURSE` varchar(20) DEFAULT NULL, `SCORE` float...

mysql 字符串拼接

CONCAT() CONCAT_WS() GROUP_CONCAT() 一、CONCAT() : 最常用的字符串拼接方法,但遇到拼接中的字符串出现null的情况会返回null 语法:CONCAT(string1,string2) DEMO1 mysql > SELECT CONCAT(s_name,s_sex) FROM student +-...

MySQL ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)的真正原因

在博客Linux mysql 5.6: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)里面,我介绍了一下安装MySQL后登陆MySQL时会遇到ERROR 1045 (28000): Access denied for user 'root'...

.frm和.ibd恢复数据

昨日晚上开发告诉我不小心truncate两个表的数据,要求还原。结果在阿里云上找到了备份内容,结果是物理备份文件.frm、.ibd。心中一万个草泥马啊。。没办法,开始还原吧。 1、查看测试机Mysql配置文件位置 [root@localhost mysql]# which mysqld /usr/sbin/mysq...

MySQL死锁

https://dev.mysql.com/doc/refman/5.7/en/innodb-deadlocks.html 什么是mysql的死锁? A deadlock is a situation where different transactions are unable to proceed because each holds a lock t...

WAMP环境配置-Mysql安装

  1.下载并解压MySQL5.6.36压缩包(顺便重命名一下子)。      2.将my-default.ini文件复制一份改名为my.ini,然后修改下面红框标注的地方      3.安装与启动服务.   以管理员的身份运行cmd(win10,不以管理员的身份进入权限不够),进入到bin目录下,执行以下命令:mysqld -install 显示安装成功...