【MySQL学习笔记(一)】

Windows 下,使用 MySQL5.6.x ,学习 mysql 。
资料:MySQL 必知必会
所列举代码为dos下实验代码。

一、使用 mysql(第四章)
二、检索数据(第五章)
三、过滤数据(第六章)
四、数据过滤(第七章)
五、用通配符进行过滤(第八章)
六、用正则表达式进行搜索(第九章) —> 未完成
七、创建计算字段(第十章)
八、使用数据处理函数(第十一章)
九、汇总数据(第十二章)

准备工作:

查看已启动的服务:

net start

启动、停止mysql

net start mysql56   #启动mysql56
net stop mysql56    #停止mysql56

一、使用 mysql(第四章)

连接数据库:

    #mysql: 命令。
    #-u:后加用户名
    #-p:稍后输入密码
    #确定后再输入密码

mysql -uroot -p

查看可用的数据库:

SHOW DATABASES;

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

mysql>

选择数据库:

USE test
mysql> USE test
Database changed
mysql>

查看当前选择的数据库的可用表的列表:

SHOW TABLES;
mysql> SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| student        |
| user           |
+----------------+
2 rows in set (0.00 sec)

mysql>

显示表列:

SHOW COLUMNS 
FROM user;      #显示表user的列信息
#或
DESCRIBE user;      #在mysql中,DESCRIBE 等同于 SHOW COLUMNS FROM
mysql> SHOW COLUMNS FROM user;
+---------------+---------+------+-----+---------+-------+
| Field         | Type    | Null | Key | Default | Extra |
+---------------+---------+------+-----+---------+-------+
| id            | int(11) | NO   | PRI | NULL    |       |
| name          | text    | YES  |     | NULL    |       |
| email         | text    | YES  |     | NULL    |       |
| passwd        | text    | YES  |     | NULL    |       |
| last_modified | double  | YES  |     | NULL    |       |
+---------------+---------+------+-----+---------+-------+
5 rows in set (0.02 sec)

mysql>

其他SHOW语句:

SHOW STATUS,    用于显示广泛的服务器状态信息;
SHOW CREATE DATABASESHOW CREATE TABLE,分别用来显示创建特定数据库或表的MySQL语句;
SHOW GRANTS,用来显示授予用户(所有用户或特定用户)的安全权限;
SHOW ERRORS和SHOW WARNINGS, 用来显示服务器错误或警告消息。

二、检索数据(第五章)

检索单个列:

SELECT id 
FROM user;
mysql> SELECT id FROM user;
+--------+
| id     |
+--------+
|    100 |
|    101 |
|   1000 |
|   8080 |
|  96900 |
|  96901 |
| 900301 |
+--------+
7 rows in set (0.08 sec)

mysql>

检索多个列:

SELECT id, name 
FROM user;
mysql> SELECT id, name FROM user;
+--------+---------+
| id     | name    |
+--------+---------+
|    100 | Alice   |
|    101 | Sarah   |
|   1000 | Michael |
|   8080 | Julia   |
|  96900 | Ada     |
|  96901 | Adam    |
| 900301 | Python  |
+--------+---------+
7 rows in set (0.01 sec)

mysql>

检索所有列(不推荐使用):

SELECT *
FROM user;
mysql> SELECT * FROM user;
+--------+---------+---------------------+-----------+----------------+
| id     | name    | email               | passwd    | last_modified  |
+--------+---------+---------------------+-----------+----------------+
|    100 | Alice   | alice@test.org      | ABC-12345 | 1513922214.284 |
|    101 | Sarah   | sarah@test.org      | ABC-12345 | 1513922214.284 |
|   1000 | Michael | michael@example.org | 654321    | 1513922215.332 |
|   8080 | Julia   | Julia@test.org      | JULIA     | 1513922215.956 |
|  96900 | Ada     | ada@test.org        | A-12345   | 1513922213.702 |
|  96901 | Adam    | adam@test.org       | A-12345   | 1513922213.702 |
| 900301 | Python  | Python@test.org     | PYTHON    | 1513922214.926 |
+--------+---------+---------------------+-----------+----------------+
7 rows in set (0.03 sec)

mysql>

检索不同的行:

SELECT DISTINCT last_modified
FROM user;
mysql> SELECT DISTINCT last_modified
    -> FROM user;
+----------------+
| last_modified  |
+----------------+
| 1513922214.284 |
| 1513922215.332 |
| 1513922215.956 |
| 1513922213.702 |
| 1513922214.926 |
+----------------+
5 rows in set (0.00 sec)

mysql>

限制返回部分结果:
返回前5行:

mysql> SELECT id
    -> FROM user
    -> LIMIT 5;
mysql> SELECT id
    -> FROM user
    -> LIMIT 5;
+-------+
| id    |
+-------+
|   100 |
|   101 |
|  1000 |
|  8080 |
| 96900 |
+-------+
5 rows in set (0.00 sec)

mysql>

检索从第一行开始的5行(行计数是从0开始的,所以第1行是第二个行):

mysql> SELECT id
    -> FROM user
    -> LIMIT 1,5
    -> ;
mysql> SELECT id
    -> FROM user
    -> LIMIT 1,5
    -> ;
+-------+
| id    |
+-------+
|   101 |
|  1000 |
|  8080 |
| 96900 |
| 96901 |
+-------+
5 rows in set (0.00 sec)

mysql>

使用完全限定的表名

mysql> SELECT user.id
    -> FROM test.user
    -> ;

等同于:

mysql> SELECT id
    -> FROM user
    -> ;
mysql> SELECT user.id
    -> FROM test.user
    -> ;
+--------+
| id     |
+--------+
|    100 |
|    101 |
|   1000 |
|   8080 |
|  96900 |
|  96901 |
| 900301 |
+--------+
7 rows in set (0.03 sec)

mysql>

三、排序检索数据

对检索的数据按一列排序:

mysql> SELECT id
    -> FROM user
    -> ORDER BY id
    -> ;
mysql> SELECT id
    -> FROM user
    -> ORDER BY id
    -> ;
+--------+
| id     |
+--------+
|    100 |
|    101 |
|   1000 |
|   8080 |
|  96900 |
|  96901 |
| 900301 |
+--------+
7 rows in set (0.15 sec)

mysql>

对返回的数据按多个列排序:

#首先按id,然后按name
mysql> SELECT id, name
    -> FROM user
    -> ORDER BY id,name
    -> ;
mysql> SELECT id, name
    -> FROM user
    -> ORDER BY id,name
    -> ;
+--------+---------+
| id     | name    |
+--------+---------+
|    100 | Alice   |
|    101 | Sarah   |
|   1000 | Michael |
|   8080 | Julia   |
|  96900 | Ada     |
|  96901 | Adam    |
| 900301 | Python  |
+--------+---------+
7 rows in set (0.01 sec)

mysql>

对返回的数据按降序排列:

mysql> SELECT id, name
    -> FROM user
    -> ORDER BY name DESC   #加DESC关键字
    -> ;
mysql> SELECT id, name
    -> FROM user
    -> ORDER BY name DESC
    -> ;
+--------+---------+
| id     | name    |
+--------+---------+
|    101 | Sarah   |
| 900301 | Python  |
|   1000 | Michael |
|   8080 | Julia   |
|    100 | Alice   |
|  96901 | Adam    |
|  96900 | Ada     |
+--------+---------+
7 rows in set (0.02 sec)

mysql>

对返回的数据按多个列排序(其中有升序,有降序):
对id 降序排列,对name升序排列

mysql> SELECT id, name
    -> FROM user
    -> ORDER BY id DESC, name
    -> ;
mysql> SELECT id, name
    -> FROM user
    -> ORDER BY id DESC, name
    -> ;
+--------+---------+
| id     | name    |
+--------+---------+
| 900301 | Python  |
|  96901 | Adam    |
|  96900 | Ada     |
|   8080 | Julia   |
|   1000 | Michael |
|    101 | Sarah   |
|    100 | Alice   |
+--------+---------+
7 rows in set (0.00 sec)

mysql>

获取一列中最大或最小值:
用ORDER BY 与 LIMIT组合:

mysql> SELECT id
    -> FROM user
    -> ORDER BY id DESC
    -> LIMIT 1
    -> ;
mysql> SELECT id
    -> FROM user
    -> ORDER BY id DESC
    -> LIMIT 1
    -> ;
+--------+
| id     |
+--------+
| 900301 |
+--------+
1 row in set (0.00 sec)

mysql>

三、过滤数据(第六章)

1、使用WHERE子句:

mysql> SELECT id, name
    -> FROM user
    -> WHERE id = 100
    -> ;

在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。
WHERE子句在表名(FROM子句)之后给出,如下所示:

mysql> SELECT id, name
    -> FROM user
    -> WHERE id = 100
    -> ;
+-----+-------+
| id  | name  |
+-----+-------+
| 100 | Alice |
+-----+-------+
1 row in set (0.07 sec)

mysql>

WHERE子句操作符:

    操 作 符          说 明
    =                等于
    <>               不等于
    !=               不等于
    <                小于
    <=               小于等于
    >                大于
    >=               大于等于
    BETWEEN          在指定的两个值之间

下例中‘ada’是字符串类型,将值与串类型的列相比较,需要限定引号。

mysql> SELECT id, name
    -> FROM user
    -> WHERE name = 'ada'
    -> ;

mysql> SELECT id, name
    -> FROM user
    -> WHERE name = 'ada'
    -> ;
+-------+------+
| id    | name |
+-------+------+
| 96900 | Ada  |
+-------+------+
1 row in set (0.00 sec)

mysql>

2、范围值检查:

mysql> SELECT id, name
    -> FROM user
    -> WHERE id BETWEEN 1000 AND 100000
    -> ;
mysql> SELECT id, name
    -> FROM user
    -> WHERE id BETWEEN 1000 AND 100000
    -> ;
+-------+---------+
| id    | name    |
+-------+---------+
|  1000 | Michael |
|  8080 | Julia   |
| 96900 | Ada     |
| 96901 | Adam    |
+-------+---------+
4 rows in set (0.05 sec)

mysql>

3、空值检查(6.24 不太理解):

mysql> SELECT id,name
    -> FROM user
    -> WHERE name IS NULL
    -> ;

由于表中的name没有空值,所以没有检索出数据

mysql> SELECT id,name
    -> FROM user
    -> WHERE name IS NULL
    -> ;
Empty set (0.01 sec)

mysql>

四、数据过滤(第七章)

MySQL允许给出多个WHERE子句。这些子句可以两种方式使用:以AND子句的方式或OR子句的方式使用。

1、使用 AND 操作符:
2、使用OR 操作符:
3、计算次序:(使用())
4、使用 IN 操作符:
5、使用 NOT 操作符:

1、使用 AND 操作符:

mysql> SELECT id, name, email
    -> FROM user
    -> WHERE id<10000 AND id>100
    -> ;

选择 id <10000 且 id >100的数据

mysql> SELECT id, name, email
    -> FROM user
    -> WHERE id<10000 AND id>100
    -> ;
+------+---------+---------------------+
| id   | name    | email               |
+------+---------+---------------------+
|  101 | Sarah   | sarah@test.org      |
| 1000 | Michael | michael@example.org |
| 8080 | Julia   | Julia@test.org      |
+------+---------+---------------------+
3 rows in set (0.00 sec)

mysql>

2、使用OR 操作符:

mysql> SELECT id, name, email
    -> FROM user
    -> WHERE name='Alice' OR id=101
    -> ;
mysql> SELECT id, name, email
    -> FROM user
    -> WHERE name='Alice' OR id=101
    -> ;
+-----+-------+----------------+
| id  | name  | email          |
+-----+-------+----------------+
| 100 | Alice | alice@test.org |
| 101 | Sarah | sarah@test.org |
+-----+-------+----------------+
2 rows in set (0.00 sec)

mysql>

3、计算次序:
SQL语法中 AND优先级高于 OR ,要保证正确的计算WHERE后的匹配条件,可以用()明确分组相应的操作符。

mysql> SELECT id,name,email
    -> FROM user
    -> WHERE (id=100 OR id= 1000) AND last_modified >1000
    -> ;
mysql> SELECT id,name,email
    -> FROM user
    -> WHERE (id=100 OR id= 1000) AND last_modified >1000
    -> ;
+------+---------+---------------------+
| id   | name    | email               |
+------+---------+---------------------+
|  100 | Alice   | alice@test.org      |
| 1000 | Michael | michael@example.org |
+------+---------+---------------------+
2 rows in set (0.02 sec)

mysql>

4、使用 IN 操作符:
IN后边的()内,列举所有合法取值。IN的功能与OR 相当。
IN的最大优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句。

mysql> SELECT id,name
    -> FROM user
    -> WHERE id IN(100,101,96901)
    -> ORDER BY name
    -> ;
mysql> SELECT id,name
    -> FROM user
    -> WHERE id IN(100,101,96901)
    -> ORDER BY name
    -> ;
+-------+-------+
| id    | name  |
+-------+-------+
| 96901 | Adam  |
|   100 | Alice |
|   101 | Sarah |
+-------+-------+
3 rows in set (0.00 sec)

mysql>

5、使用 NOT 操作符:
否定之后的条件

mysql> SELECT id,name
    -> FROM user
    -> WHERE id NOT IN(100,101,96901)
    -> ORDER BY name
    -> ;
mysql> SELECT id,name
    -> FROM user
    -> WHERE id NOT IN(100,101,96901)
    -> ORDER BY name
    -> ;
+--------+---------+
| id     | name    |
+--------+---------+
|  96900 | Ada     |
|   8080 | Julia   |
|   1000 | Michael |
| 900301 | Python  |
+--------+---------+
4 rows in set (0.01 sec)

mysql>

五、用通配符进行过滤(第八章)

为在搜索子句中使用通配符,必须使用LIKE操作符。 LIKE指示MySQL,后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。
通配符搜索的处理时间比前边提到的搜索时间要长,使用时要注意:
1)不要过度使用通配符,能用其他操作符的,用其他操作符。
2)尽量不要把通配符置于搜索模式的开始处,这样搜索起来,是最慢的。
3)注意通配符的位置,位置放错,可能不会返回想要的数据。

1、使用百分号(%), %代表任意字符出现任意次数 。

mysql> SELECT id,name
    -> FROM user
    -> WHERE name LIKE 'A%'
    -> ;

搜索名字以 ‘A’,开头的数据(默认不区分大小写,若要区分需要修改MySQL的配置方式)

mysql> SELECT id,name
    -> FROM user
    -> WHERE name LIKE 'A%'
    -> ;
+-------+-------+
| id    | name  |
+-------+-------+
|   100 | Alice |
| 96900 | Ada   |
| 96901 | Adam  |
+-------+-------+
3 rows in set (0.00 sec)

mysql>

搜索名字里带有 ‘da’的数据。

mysql> SELECT id,name
    -> FROM user
    -> WHERE name LIKE '%da%'
    -> ;
mysql> SELECT id,name
    -> FROM user
    -> WHERE name LIKE '%da%'
    -> ;
+-------+------+
| id    | name |
+-------+------+
| 96900 | Ada  |
| 96901 | Adam |
+-------+------+
2 rows in set (0.00 sec)

mysql>

2、使用下划线(), 代表任意字符出现一次 。

mysql> SELECT id,name
    -> FROM user
    -> WHERE name LIKE '_da'
    -> ;
mysql> SELECT id,name
    -> FROM user
    -> WHERE name LIKE '_da'
    -> ;
+-------+------+
| id    | name |
+-------+------+
| 96900 | Ada  |
+-------+------+
1 row in set (0.64 sec)

mysql>

六、用正则表达式进行搜索(第九章)

注意:MySQL中的正则表达式匹配(自版本3.23.4后)不区分大小写(即,大写和小写都匹配)。为区分大小写,可使用 BINARY 关键字,如 :

    WHERE prod_name REGEXP BINARY 'JetPack .000'。#书中例句

1、基本字符匹配。

a)

mysql> SELECT id,name
    -> FROM user
    -> WHERE name REGEXP 'da'
    -> ORDER BY name
    -> ;
mysql> SELECT id,name
    -> FROM user
    -> WHERE name REGEXP 'da'
    -> ORDER BY name
    -> ;
+-------+------+
| id    | name |
+-------+------+
| 96900 | Ada  |
| 96901 | Adam |
+-------+------+
2 rows in set (0.09 sec)

mysql>

b)使用‘.’,进行匹配,‘.’代表一个任意字符。

mysql> SELECT id,name
    -> FROM user
    -> WHERE name REGEXP 'da.'
    -> ORDER BY name
    -> ;
+-------+------+
| id    | name |
+-------+------+
| 96901 | Adam |
+-------+------+
1 row in set (0.00 sec)

mysql>

2、使用 OR 进行匹配

mysql> SELECT id,name
    -> FROM user
    -> WHERE name REGEXP 'Ada|Adam'
    -> ORDER BY name
    -> ;

使用OR 搜索两个字符串之一

mysql> SELECT id,name
    -> FROM user
    -> WHERE name REGEXP 'Ada|Adam'
    -> ORDER BY name
    -> ;
+-------+------+
| id    | name |
+-------+------+
| 96900 | Ada  |
| 96901 | Adam |
+-------+------+
2 rows in set (0.02 sec)

mysql>

也可以给出两个以上条件:

    WHERE name REGEXP 'a|b|c'

3、匹配几个字符之一:

使用[]

    WHERE name REGEXP '[abc]da'        #匹配ada,bda,cda

否定字符集:

    WHERE name REGEXP '[^abc]'        #匹配a,b,c,之外的任意字符。

七、创建计算字段(第十章)

从数据库中检索出转换、计算或格式化过的数据
计算字段并不实际存在于数据库表中。计算字段是运行时在SELECT语句内创建的。

计算字段操作方法:

1、拼接字段:

使用 Concat()函数,可以将多个串连接起来,形成一个较长的串。

多数DBMS使用+或||来实现拼接,MySQL则使用Concat()函数来实现。
当把SQL语句转换成MySQL语句时一定要把这个区别铭记在心。

mysql> SELECT Concat(name,'(',id,')')
    -> FROM user
    -> ORDER BY name
    -> ;
+-------------------------+
| Concat(name,'(',id,')') |
+-------------------------+
| Ada(96900)              |
| Adam(96901)             |
| Alice(100)              |
| Julia(8080)             |
| Michael(1000)           |
| Python(900301)          |
| Sarah(101)              |
+-------------------------+
7 rows in set (0.00 sec)

mysql>

2、使用别名
使用 AS 给新检索出的字段起别名

mysql> SELECT Concat(RTrim(name),'_',id) AS name_id
    -> FROM user
    -> ORDER BY name
    -> ;
+---------------+
| name_id       |
+---------------+
| Ada_96900     |
| Adam_96901    |
| Alice_100     |
| Julia_8080    |
| Michael_1000  |
| Python_900301 |
| Sarah_101     |
+---------------+
7 rows in set (0.01 sec)

mysql>

别名的其他用途 别名还有其他用途。常见的用途包括在实际的表列名包含不符合规定的字符(如空格)时重新命名它,在原来的名字含混或容易误解时扩充它,等等。
导出列 别名有时也称为导出列( derived column),不管称为什么,它们所代表的都是相同的东西。

3、执行算数计算

MySQL支持 ‘+’,‘-’,‘*’,‘/’四种运算。同时可用()区分优先顺序。

mysql> SELECT id, name, id+1000 AS id_1000
    -> FROM user
    -> ;
+--------+---------+---------+
| id     | name    | id_1000 |
+--------+---------+---------+
|    100 | Alice   |    1100 |
|    101 | Sarah   |    1101 |
|   1000 | Michael |    2000 |
|   8080 | Julia   |    9080 |
|  96900 | Ada     |   97900 |
|  96901 | Adam    |   97901 |
| 900301 | Python  |  901301 |
+--------+---------+---------+
7 rows in set (0.17 sec)

mysql>

SELECT 提供了测试和实验函数的方法,例如:

mysql> SELECT 3*8
    -> ;
+-----+
| 3*8 |
+-----+
|  24 |
+-----+
1 row in set (0.00 sec)

mysql>

或:

mysql> SELECT Trim('  abc ')
    -> ;
+----------------+
| Trim('  abc ') |
+----------------+
| abc            |
+----------------+
1 row in set (0.02 sec)

mysql>

利用 NOW(),可以返回当前日期和时间。

mysql> SELECT NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2017-12-27 17:47:00 |
+---------------------+
1 row in set (0.02 sec)

mysql>

八、使用数据处理函数(第十一章)

注意:函数的可移植性不强,为了代码的可移植,许多SQL程序员不赞成使用特殊实现的功能。如果你决定使用函数,应该保证做好代码注释,以便以后你(或其他人)能确切地知道所编写SQL代码的含义。

大多数SQL实现支持以下类型的函数。
1)用于处理文本串(如删除或填充值,转换值为大写或小写)的文本函数。
2)用于在数值数据上进行算术操作(如返回绝对值,进行代数运算)的数值函数。
3)用于处理日期和时间值并从这些值中提取特定成分(例如,返回两个日期之差,检查日期有效性等)的日期和时间函数。
4)返回DBMS正使用的特殊信息(如返回用户登录信息,检查版本细节)的系统函数。

1、文本处理函数:

例:
使用Upper()函数,将字母转换成大写。

mysql> SELECT id, name,Upper(name) AS name_upper
    -> FROM user
    -> ORDER BY name
    -> ;
+--------+---------+------------+
| id     | name    | name_upper |
+--------+---------+------------+
|  96900 | Ada     | ADA        |
|  96901 | Adam    | ADAM       |
|    100 | Alice   | ALICE      |
|   8080 | Julia   | JULIA      |
|   1000 | Michael | MICHAEL    |
| 900301 | Python  | PYTHON     |
|    101 | Sarah   | SARAH      |
+--------+---------+------------+
7 rows in set (0.00 sec)

mysql>

常用的文本处理函数

    函 数                 说 明
    Left()              返回串左边的字符
    Length()            返回串的长度
    Locate()            找出串的一个子串
    Lower()             将串转换为小写
    LTrim()             去掉串左边的空格
    Right()             返回串右边的字符
    RTrim()             去掉串右边的空格
    Soundex()           返回串的SOUNDEX值
    SubString()         返回子串的字符
    Upper()             将串转换为大写

SOUNDEX需要做进一步的解释。 SOUNDEX是一个将任何文本串转换为描述其语音表示的字母数字模式的算法。 SOUNDEX考虑了类似的发音字符和音节,使得能对串进行发音比较而不是字母比较。虽然SOUNDEX不是SQL概念,但MySQL(就像多数DBMS一样)都提供对SOUNDEX的支持。
下面给出一个使用Soundex()函数的例子。 customers表中有一个顾客Coyote Inc.,其联系名为Y.Lee。但如果这是输入错误,此联系名实际应该是Y.Lie,怎么办?显然,按正确的联系名搜索不会返回数据,如下所示:
这里写图片描述
现在试一下使用Soundex()函数进行搜索,它匹配所有发音类似于Y.Lie的联系名:
这里写图片描述
分析:在这个例子中, WHERE子句使用Soundex()函数来转换cust_contact列值和搜索串为它们的SOUNDEX值。因为Y.Lee和Y.Lie发音相似,所以它们的SOUNDEX值匹配,因此WHERE子句正确地过滤
出了所需的数据。

2、日期和时间处理函数

日期和时间采用相应的数据类型和特殊的格式存储,以便能快速和有效地排序或过滤,并且节省物理存储空间。
一般,应用程序不使用用来存储日期和时间的格式,因此日期和时间函数总是被用来读取、统计和处理这些值。由于这个原因,日期和时间函数在MySQL语言中具有重要的作用
MySQL的4.1.1更早期版本不支持全部的日期时间函数,使用时需要注意

常用日期和时间处理函数

    函 数                 说 明
    AddDate()            增加一个日期(天、周等)
    AddTime()            增加一个时间(时、分等)
    CurDate()            返回当前日期
    CurTime()            返回当前时间
    Date()               返回日期时间的日期部分
    DateDiff()           计算两个日期之差
    Date_Add()           高度灵活的日期运算函数
    Date_Format()        返回一个格式化的日期或时间串
    Day()                返回一个日期的天数部分
    DayOfWeek()          对于一个日期,返回对应的星期几
    Hour()               返回一个时间的小时部分
    Minute()             返回一个时间的分钟部分
    Month()              返回一个日期的月份部分
    Now()                返回当前日期和时间
    Second()             返回一个时间的秒部分
    Time()               返回一个日期时间的时间部分
    Year()               返回一个日期的年份部分

九、汇总数据(第十二章)

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

1、聚集函数

我们经常需要汇总数据而不用把它们实际检索出来,为此MySQL提供了专门的函数。使用这些函数, MySQL查询可用于检索数据,以便分析和报表生成。这种类型的检索例子有以下几种。
1)确定表中行数(或者满足某个条件或包含某个特定值的行数)。
2)获得表中行组的和。
3)找出表列(或所有行或某些特定的行)的最大值、最小值和平均值。

实际想要的是汇总信息。

聚集函数( aggregate function) 运行在行组上,计算和返回单个值的函数。

SQL聚集函数

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

标准偏差: MySQL还支持一系列的标准偏差聚集函数,但目前并未涉及这些内容。
例:

mysql> SELECT COUNT(id) AS id_count
    -> FROM user
    -> ;
+----------+
| id_count |
+----------+
|        7 |
+----------+
1 row in set (0.00 sec)

mysql>
注意:
    对于 COUNT(), 如果指定列名,则指定列的值为空的行被COUNT()函数忽略,但如果COUNT()函数中用的是星号( *),则不忽略。

    只用于单个列 AVG()只能用来确定特定数值列的平均值,而且列名必须作为函数参数给出。为了获得多个列的平均值,必须使用多个AVG()函数。
    NULL值 AVG()函数忽略列值为NULL的行。

    对非数值数据使用MAX()(或MIN()) 虽然MAX()(或MIN())一般用来找出最大(最小)的数值或日期值,但MySQL允许将它用来返回任意列中的最大(最小)值,包括返回文本列中的最大(最小)值。在用于文本数据时,如果数据按相应的列排序,则MAX()(或MIN())返回最后一行。
    NULL值 MAX()(或MIN())函数忽略列值为NULL的行。

    在多个列上进行计算 如本例所示,利用标准的算术操作符,所有聚集函数都可用来执行多个列上的计算。
    NULL值 SUM()函数忽略列值为NULL的行。
mysql> SELECT SUM(id*10) AS id_sum_10
    -> FROM user
    -> ;
+-----------+
| id_sum_10 |
+-----------+
|  11033830 |
+-----------+
1 row in set (0.02 sec)

mysql>

2、聚集不同值

MySQL 5 及 后 期 版 本 下 面 将 要 介 绍 的 聚 集 函 数 的DISTINCT的使用,已经被添加到MySQL 5.0.3中。下面所述内容在MySQL 4.x中不能正常运行。
聚集函数默认操作所有值,制定DISTINCE 之后,只操作不同的值。

mysql> SELECT SUM(DISTINCT id) AS id_sum
    -> FROM user
    -> ;
+---------+
| id_sum  |
+---------+
| 1103383 |
+---------+
1 row in set (0.20 sec)

mysql>

3、组合聚集函数
SELECT 语句可包含多个聚集函数:

mysql> SELECT COUNT(id) AS id_count,
    -> MAX(last_modified) AS last_max,
    -> MIN(last_modified) AS last_min
    -> FROM user
    -> ;
+----------+----------------+----------------+
| id_count | last_max       | last_min       |
+----------+----------------+----------------+
|        7 | 1513922215.956 | 1513922213.702 |
+----------+----------------+----------------+
1 row in set (0.03 sec)

mysql>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值