欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

MySQL 基础 宁皓网 有大用

shiping1 的头像

用户

1)用户登录

跟其它类似的关系型数据库管理系统差不多,MySQL 本身也有一套权限管理系统,也就是你可以创建新的用户,然后给用户去分配相应的操作权限,比如读取,添加,更新,删除数据等等。你也可以让这个用户在指定的数据库上拥有这些权限。

MySQL 默认会有一个叫 root 的用户,这个用户是 MySQL 的超级管理员,也就是它拥有数据库管理系统上的所有的权限,注意这个 root 用户,跟操作系统里的 root 用户并不是同一个用户。

使用这个 root 用户的身份登录到 MySQL,我们可以去创建新的用户,可以给用户分配权限,可以创建数据库还有操作数据库。下面,我们来看一下怎么样通过命令行工具登录到 MySQL。

登录

Macos 用户可以打开 终端工具,Windows 用户可以使用命令提示符工具 ...

登录 MySQL 可以使用这样的形式:

mysql -h hostname -u user_name -p

-h 的后面可以指定数据库的主机名,如果你想登录到本地上的 MySQL,可以使用 localhost,或者可以直接去掉这个 -h 参数还有主机名,想要登录到远程主机上的 MySQL,在这里,可以指定一下主机的名称或者是 IP 地址。

-u 参数后面,输入使用哪个用户去登录,-p 表示要指定这个用户的密码。这里我们要使用 root 这个用户去登录一下。

mysql -u root -p

因为我的 MySQL 是在本机上,所以不需要指定主机名。回车 ... 提示 Enter Password: 要求输入 root 这个用户的密码。因为我用的是 MAMP ,所以,root 这个用户的密码是 root,如果你用的是 WAMP,可能没有设置 root 用户的密码。

输入 root .. 回车 ..

提示 Welcome to MySQL monitor ... 表示我们已经成功的使用 root 身份,登录到了 MySQL ... 下面,可以使用一些命令去做一些事情。比如要显示当前登录的用户可以管理的数据库可以使用:

show databases;

因为 root 用户可以管理系统上的所有的数据库,所以这里显示的就是 MySQL 上的所有的数据库。注意输入完成以后,在命令的末尾都要加上一个 ; 号,然后回车,这样就会去执行这条命令。如果没有加上这个 ; 号,回车以后,MySQL 会以为你要继续去输入命令,直到看到 ; 号,才会去真正执行你输入的命令。

退出

要退出当前的登录,可以使用快捷键 ctrl+C,或者输入命令 exit ... 然后回车 ...

来自  http://ninghao.net/video/1737#info

 
2)创建新用户

root 用户是一个万能用户,但是为了安全,我们只在必要的情况下才会用去使用这个用户,比如想要添加新的用户或者创建新的数据库。

通常我们会为 Web 应用单独去创建一个数据库,并且再去创建一个拥有操作这个数据库权限的用户。也就是 Web 应用使用的 MySQL 用户只能去操作应用所使用的这个数据库。我们没有必要给这个用户操作其它数据库,添加新用户或者其它不必要的权限。

这样做是为了更安全一些,符合最少权限的原则,也就是用户只需要拥有让它可以做的事情的最低级别的权限就行了。

创建新用户

创建新的用户可以使用 CREATE USER 命令,首先我们需要使用 root 用户身份登录到 MySQL 监视器:

mysql -u root -p

然后使用这样的形式去创建新的用户:

CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';

首先是 CREATE USER,后面加上要添加的用户的名称,注意这里需要使用一个引号,在用户名后面可以再指定一下主机名,中间用一个 @ 符号,主机名周围也需要使用一组引号。在 IDENTIFIED BY 的后面,可以设置一下这个用户的密码。最后是一个分号。然后回车 ...

CREATE USER 'wanghao'@'localhost' IDENTIFIED BY '12345';

这行命令的意思就是,去创建一个叫 phoenix 的用户,它只能在本机上登录,登录的密码是 12345 。下面,我们使用可以这个新创建的用户登录一下看看。

eixt

退出当前使用 root 身份的登录,然后再用 wanghao 这个用户登录一下:

mysql -u wanghao -p

成功以后,我们可以查看一下当前登录的用户 ...

select current_user();

再试一下 show databases 这个命令

show databases;

这里只会显示一个叫 information_schema 的数据库.. 这是因为我们只是创建了一个用户,并没有给他分配权限。在下面的视频里,我们再去看一下怎么样给用户分配权限。

来自  http://ninghao.net/video/1738#info

 
3)分配权限 - GRANT

前面我们使用 CREATE USER 去为 MySQL 添加了一个新的用户,要想让这个用户能去做点什么,你需要给他分配一些权限。权限可以分成几个类型,有处理数据的权限,比如 SELECT,INSERT,UPDATE,DELETE。还有影响数据表结构的权限,比如 CREATE,ALTER,INDEX,DROP。还有一些管理类型的权限,比如 GRANT,CREATE USER 等等。

使用这些权限也分为几个层级,你可以为用户把这些权限分配到全局范围,这样用户就可以对系统里的所有的数据库去执行你分配的权限。我们也可以把权限分配到指定的数据库,或者数据表和列上面。

一般我们会把权限分配到数据库的级别,也就是用户只能针对某些你指定的数据库去执行你分配给他的权限。

GRANT

分配权限用的是 GRANT 命令,使用的语法看起来像这样:

GRANT 权限 ON 数据库/表 TO '用户'@'主机名' [IDENTIFIED BY '密码']

GRANT 命令后面是你想要分配的权限的列表,不同的权限之间用逗号分隔开,想要分配所有权限的话,这里可以用一个 ALL PRIVILEGES ,这个关键词表示所有的权限。

ON 的后面可以指定数据库或者数据表,这样你分配的权限只会应用在这些指定的数据库或者数据表上面。在这里,你可以使用 *.* 这个点位符,它表示所有的数据库。如果想应用在单独某个数据库上,可以使用 数据库.数据表 的形式,把权限应用在所有的表上,可以使用一个 * 号。比如把权限应用在 movietalk 这个数据库里的所有的数据表上,可以这样:movietalk.*

TO 的后面是用户的名称还有主机名,也就是你想分配权限的用户。方括号里的 IDENTIFIED BY '密码' 是一个可选项,在这里可以指定用户的密码。使用 GRANT 命令分配权限的时候,如果用户还不存在的话,就会去创建一个。这样,你可以加上 IDENTIFIED BY ,去为这个新的用户添加一个登录的时候使用的密码。

另外在分配权限的时候,我们可以加上一些资源限制的选项,可以用一个 WITH 连接,

MAX_QUERIES_PER_HOUR 0
MAX_CONNECTIONS_PER_HOUR 0
MAX_UPDATES_PER_HOUR 0
MAX_USER_CONNECTIONS 0

这些选项可以控制用户每小时允许查询,连接,更新的最大的数量,还有总体的能够连接的数量。如果都设置成 0 的话,表示不限制。

演示

下面,我们去给之前创建的 phoenix 这个用户分配一些权限。打开终端工具,先用 root 用户登录到 MySQL ...

然后输入:

CRANT ALL PRIVILEGES ON movietalk.* TO wanghao@localhost;

回车 ... 返回 Query OK ,表示已经成功执行了这行命令,这行命令的意思就是,去为 phoenix 这个用户分配所有的权限,这些权限只能应用在 movietalk 这个数据库上。下面,我们想要让修改的限制立即生效,要执行一条命令:

flush privileges;

下面我们再用 phoenix 这个用户登录一下 ... exit 退出 ...

然后再登录 ... 输入 show databases;

现在, 会显示 movietalk 这个数据库,说明 phoenix 这个用户可以操作这个数据库 .. 用一个简单的 SELECT 语句去试一下 ...

USE movietalk;
SELECT * FROM film;

会返回查找到的结果,说明 phoenix 这个用户有可以从 movietalk 这个数据库选择数据的权限。

来自  http://ninghao.net/video/1739

4)显示用户列表

我们在 Mysql 系统里面创建的用户,还有相关的信息,都会在数据库系统里面的 mysql 这个数据库里的 user 这个表里。

比如你想查看一下在数据库系统里面的所有的用户,可以这样。

select user from mysql.user

这其实是一条 sql 语句,在后面,我们会介绍怎么样使用这样的语句去操纵数据库 ... 它的意思就是,找出在 mysql 这个数据库里面的 user 这个表里的 user 这个字段里的东西。

在这里,给我们显示出来的,除了 root 这个用户以外,还有之前我们创建的 wanghao 这个用户。

在 mysql 这个数据库的 user 这个表里,还有一些其它的东西,比如用户的主机名,密码,还有权限等等。

查看这个表里的所有的字段,,可以这样 ...

desc mysql.user

会给我们列出在 mysql 这个数据库里的 user 这个表里面的所有的字段 ... Host.. User.. Password..

在显示用户列表的时候,除了用户的名字以外,你也可以包含这些东西 ...

select user, host, password from mysql.user;

这会显示出用户的名字,所属的主机名,还有它的密码,这里显示的密码是经过加密处理的。

来自 http://ninghao.net/video/1740

 
5)显示用户权限

查看 mysql 系统里面的用户的权限,可以这样 ...

select user, select_priv from mysql.user;

这里的 select_priv ,表示的就是,用户是否有 select 权限,也就是从数据库里选择数据的权限。

你会看到,root 用户是有这个权限的,但是我们之前创建的 wanghao 这个用户没有这个权限,因为这栏里显示的是 n ,表示没有这个权限。

使用这个方法,我们查询出来的权限是在全局范围内的权限。也就是,在这里如果显示用户有 select 权限,表示他在所有的数据库里都有这个权限。

如果我们只想查看用户在某个特定的数据库上的权限。可以去看一下 mysql 这个数据库里的 db 这个表。

select user, db, select_priv from mysql.db;

在这里,我们要显示的是 db 这个表里的 user ,用户名,还有 db ,表示在特定的数据库 ... 还有 select_priv ,表示 select 这个权限 ...

你会看到 wanghao 这个用户,在 movietalk 这个数据库上面,拥有 select 的权限。

或者,我们也可以使用 show grants 去查看一下用户拥有的权限。

show grants for wanghao@localhost;

查看一下 wanghao 被授予的权限。

GRANT USAGE ON *.* TO 'wanghao'@'localhost' IDENTIFIED BY PASSWORD '*911FE98EE7894C073B44C0BD522EDA5E400A9FF4'
GRANT ALL PRIVILEGES ON `wanghao`.* TO 'wanghao'@'localhost'

下面这行 ... grant all privileges on movietalk.* ... 表示,wanghao 在 movietalk 这个数据库的所有的表里,拥有所有的权限。

来自 http://ninghao.net/video/1741#info

 
6)吊销用户权限 - REVOKE

如果想要吊销用户的所有权限或者某几个权限,可以使用 revoke 命令 ...

比如,我们要吊销 wanghao 这个用户在 movietalk 这个数据库里的 更新还有删除 的权限。 revoke 后面加上要吊销的权限的列表,update ,表示更新的权限,delete 是删除的权限 ...

如果你想吊销用户所有的权限,可以用 ALL PRIVILEGES 来表示所有的权限。

后面再加上一个 on ,然后可以指定一下具体的数据表 ... movietalk.* ... 表示 movietalk 这个数据库的所有的数据表 ...

from ... 后面是要吊销权限的用户 ...

revoke update, delete on movietalk.* from wanghao@localhost;

回车 ... 下面,再去查看一下 wanghao 这个用户在 movietalk 这个数据库里面,是否有更新还有删除的权限。

select user, db, update_priv, delete_priv from mysql.db;

update_priv 表示更新的权限,delete_priv 表示删除的权限。 现在,这两栏里面,都是 N ,表示,表示 wanghao 这个用户在 movietalk 这个数据表里面,没有这两个权限了。

因为已经用 revoke 吊销了这两个权限。

来自  http://ninghao.net/video/1742

 
7)重设密码与删除用户

为用户设置密码,可以这样 ... set password for .... 为谁去设置密码 ... 后面加上用户的名字还有主机名 ... 然后用一个等号

再用 password 这个函数 .. 在这个函数里面,去指定一下用户的密码 .... password 这个函数可以加密处理在这里指定的这个密码 ...

set password for wanghao@localhost = password('hello');

成功以后,我们就可以使用这个新密码登录了 ...

最后,我们再看一下删除用户 ...

用的是 drop user ... 比如我们想要删除掉系统里的 wanghao 这个用户 ...

drop user wanghao@localhost

成功以后,再查看一下系统里的用户 ..

select user from mysql.user;

你会看到,现在系统里面只剩下 root 这个用户了。

来自 http://ninghao.net/video/1743

 
数据库
8)创建,使用,删除数据库

创建数据库

CREATE DATABASE 数据库名称

创建数据库可以使用 CREATE DATABASE 命令,CREATE 是创建,DATABASE 是数据库的意思。在它的后面加上想要创建的数据库的名称就可以了:

CREATE DATABASE movietalk;

这行命令会去创建一个叫 movietalk 的数据库。我们可以查看一下:

show databases;

在返回的结果里,你会看到 movietalk 这个数据库。在 CREATE DATABASE 后面,可以再加上一个 IF NOT EXISTS ,这样在创建的数据库的名称如果已经存在了,就不会显示一个错误。比如我们可以试试再去创建一个叫 movietalk 的数据库。

会出现一个错误提示说 movietalk 这个数据库已经存在了:

ERROR 1007 (HY000): Can't create database 'movietalk'; database exists

下面我们加上一个 IF NOT EXISTS 试一下:

CREATE DATABASE IF NOT EXISTS movietalk;

命令会执行成功,不会显示错误,不过注意这里有一个 warning ,警告。在登录的时候,加上一个 --show-warnings 参数,可以显示这个警告的具体的信息。mysql -u root -p --show-warnings;

先退出一下 ... 再登录 ... 加上 --show-warnings ... 注意这里是两个横线 ... 再执行一下创建数据库的命令 ...

这次会显示出警告的具体内容:Note (Code 1007): Can't create database 'movietalk'; database exists,不能创建 movietalk 这个数据库,因为它已经存在了。

使用数据库

想要去操纵这个数据库,比如创建数据表,往表里插入数据,查询,删除数据等等,需要先用一个 USE 命令,切换到这个数据库。在 USE 的后面加上要切换到的数据库的名称。

USE movietalk;

回车 ... 返回:Database changed ,说明正在使用的数据库已经改变了。

删除数据库

删除数据库,用的是 DROP DATABASE ... 比如我们要删掉 movietalk 这个数据库:

DROP DATABASE movietalk;

返回:Query OK, 0 rows affected (0.08 sec)

说明已经成功执行了命令,我们再用一个 show databases 看一下 ... 现在已经找不到 movietalk 这个数据库了。

来自  http://ninghao.net/video/1751#info

 
9)创建数据表 - CREATE TABLE

CREATE TABLE 数据表名称 (栏1, 栏2...)

创建数据表用的是 CREATE TABLE,TABLE 就是表格的意思。在后面再加上要创建的数据表的名字,然后在后面的括号里,可以指定这个数据表里面的栏。也就是数据的列。不同的栏之间可以使用逗号分隔开。下面我们去试一下:

先去创建一个数据库 ... 叫它 movietalk ...

CREATE DATABASE movietalk;

再切换到这个 movietalk 数据库:

USE movietalk;

我们可以先查看一下这个数据库里的数据表,用的是 SHOW TABLES ...

SHOW TABLES;

返回的结果是:

Empty set (0.00 sec)

说明这个数据库里还没有数据表,下面再去给这个数据库添加两个数据表,CREATE TABLE ... 后面是要创建的数据表的名字 ... 这里我们先创建一个叫 film 的数据表,在这个表里放一些关于电影的内容 .... 然后是一组括号 ... 按一下回车 ...

不输入分号,我们可以继续输入要执行的命令。在括号里需要为这个表里指定一些数据栏。

先简单的添加一个栏,叫它 film_name ,电影的名称 ... 在栏的名字的后面,还要加上这个数据栏的可能要存储的数据的类型。关于数据的类型,我们会在后面的视频里详细的介绍一下。

这里先用一个 varchar 类型,也就是字符串类型的数据,在括号里,我们可以指定可能的最大的字符数,这里我们设置成 255 ,意思就是 film_name 这个栏里面的数据的类型是字符串,最大只能是 255 个字符。

再去添加一个存储电影发布日期的栏,可以叫这 film_date ... 这栏数据的类型,可以是日期类型的数据,这个数据类型的名字是 date ...

CREATE TABLE film(
film_name varchar(255) ,
film_date date
);

回车,现在, 我们就为 movietalk 这个数据库添加了一个数据表,在这个数据表里有两个数据栏,film_name ,还有 film_date ... 输入 SHOW TABLES; 查看一下当前数据库里面的数据表 ... 你会看到 film 这个数据表 ...

DESCRIBE

如果想查看某个数据表的详细的信息,可以使用 DESCRIBE ,后面再加上数据表的名字。

DESCRIBE film;

这里会给我们显示出 film 这个数据表里的栏,这里显示的是 Field ,字段。另外还有数据栏的类型,和其它的一些有用的信息。

10)添加数据栏

创建了数据表以后,想要改变这个数据表,比如添加新的数据栏,修改数据栏的名称,删除数据栏,添加主键等等 ,这些操作我们可以使用 ALTER TABLE 语句。

添加新的数据栏

下面我们先来看一下为数据表添加新的数据栏,先是一个 ALTER TABLE,然后是需要更改的数据表的名称,再用一个 ADD,表示添加,后面是要添加的数据栏的名称。

ALTER TABLE 数据表名称 ADD 新的数据栏的名称;

在这个语句的后面,我们还可以设置一下要添加的这个栏在数据表中的位置,默认新添加的栏会在数据表的最后,如果你想让它出现在数据表的最前面,可以添加一个 FIRST 关键词。

或者,你可以指定在哪个数据栏的后面去添加这个新的数据栏,可以用一个 AFTER 然后再加上这个数据栏的名称。

比如我们要在数据表的最前面添加一个叫 fid 的数据栏 ... ALTER TABLE ... 然后是数据表的名称 ... ADD 的后面是要添加的新的数据栏的名字 ... 可以再设置一下这个数据栏的类型 ... INT 表示整数类型 ... 最后再加上一个 FIRST ...

这样添加的数据栏会在数据表的最前面 ...

ALTER TABLE film ADD fid INT(10) FIRST;

回车 ... 返回:

Query OK, 0 rows affected (0.32 sec)
Records: 0 Duplicates: 0 Warnings: 0

表示成功执行了这条查询。再用 DESCRIBE 去看一下 film 这个数据表 ...

DESCRIBE film;

你会看到,刚才添加的 fid 这个数据栏会在这个数据表的最前面 ...

下面,我们在 film_name 这个栏的下面,再去添加一个新的数据栏 ... ALTER TABLE ... film ... ADD 后面加上要添加的数据栏的名称,这里我们添加一个叫 film_content 的数据栏 ... 这个栏的数据类型是 TEXT,文本类型,也就是可以拥有很长内容的数据。

然后再指定一个这个数据栏出现的位置 ... 用一个 AFTER ... 我们想让这个数据栏出现在 film_name 的下面,所以这里可以指定一下 film_name 这个数据栏做为一个参照。

ALTER TABLE film ADD film_content TEXT AFTER film_name;

DESCRIBE film;

这个 film_content 会出现在 film_content 的下面。

添加主键

现在我们想把之前添加的 fid 这个数据栏设置成这个数据表的主键 ... 要用到 PRIMARY KEY ... ALTER TABLE film... 后面是 ADD ,去添加一个什么东西 ... 我们要添加的是主键,可以使用 PRIMARY KEY ... 然后在括号里指定一下要作为主键的数据栏 ... 这里就是 fid 这个数据栏 ... 回车 ... 成功以后,再查看一下这个数据表 ...

ALTER TABLE film ADD PRIMARY KEY (fid);
DESCRIBE film;

在 Key 这栏里,你会看到 fid 这栏的值是 PRI,这就说明 fid 已经是这个数据表里的主键了。

来自 http://ninghao.net/video/1753#info

11)修改或删除数据栏与数据表

修改数据栏的设置

使用 ALTER TABLE 我们也可以对已经存在的数据栏进行修改,比如更改它的名称,类型等等。这里需要用到一个 CHANGE 关键词,假设我们要修改 fid 这个数据栏的名称。ALTER TABLE ... film ,加上一个 CHANGE ,表示要去修改一些东西 ... 在它的后面,首先是要修改的数据栏的名称 ... 这里就是 fid ... 接着是修改之后的名字 ... 改成 film_id ... 最后我们还要指定一下修改以后的这个数据栏的类型 ...

ALTER TABLE film CHANGE fid film_id INT(10);

回车 ... 执行成功以后 ... 再去查看一下 DESCRIBE film;

原来的 fid 这个栏,就变成了 film_id ...

修改数据表的名称

我们也可以修改数据表的名称,可以使用 RENAME TO ... 比如想把 film 这个表的名字改成 movie ... 先用一个 ALTER TABLE film ... 加上 RENAME TO ... 重命名为 ... 后面再加上重命名以后的名字 ... 这里就是 movie ...

ALTER TABLE film RENAME TO movie;

回车,执行成功以后,用 SHOW TABLES 去查看一下要当前数据库里的数据表 ...

SHOW TABLES;

film 已经重命名成了 movie 这个数据表。

删除数据栏

ALTER TABLE 还可以删掉数据栏 ... 要配合 DROP 去使用。比如我们要删掉 film_content ... ALTER TABLE ... 因为刚才我们把 film 这个表重命名成了 movie ... 所以这里就是 movie ... 然后加上一个 DROP ... 在它的后面是想要删掉的数据栏的名字 ... film_content ... 回车 ...

ALTER TABLE movie DROP film_content;

DESCRIBE movie;

现在已经看不到 film_content 这个数据栏了。

删除数据表

删除数据表可以使用 DROP TABLE ... 在它后面加上数据表的名称就可以了。比如我们要删掉 movie 这个表 ... 输入 DROP TABLE ... 然后是 movie ...

DROP TABLE movie;

执行成功以后 ... 再去查看一下 ... SHOW TABLES;

返回了 Empty set ... 表示当前这个数据库里没有数据表。

来自 http://ninghao.net/video/1759#info

 
12)重新创建数据库与数据表

前面我们介绍的一些 sql 的语句是 sql 的 ddl 的部分,也就是定义数据结构用的 ... 在接下来的视频里,我们会去看一下 sql 的另一个部分,也就是 dml ,关于数据的操作的部分 ...

我们要往数据表里插入数据,从数据表里选择想要的数据,更新还有删除数据等等。这个视频我们为下面的视频去做点准备。重新再去创建一个数据库,然后再重新来看一下怎么样去创建数据表。

先用 root 登录到 mysql ... 查看一下系统里的数据库 .. 这里有我们之前创建的 movietalk 这个数据库 ... 我们可以先删除掉这个数据库 ... drop database movietalk;

再确认一下 ... show databases; 已经看不到 movietalk 这个数据库了 ... 下面,我们再重新去创建一个叫 movietalk 的数据库 ...

create database movietalk ... 这次在要创建的数据库的名字的后面,加上一个 charset=utf8 ... 这会设置一下数据库的整理的字符集 ... 因为我们的数据库里要存放中文数据 ... 所以,设置这个字符集设置成 utf8 比较合适 ...

接着,我们再去给这个数据库添加一个数据表 ... 先进入到这个数据库 ... use movietalk;

然后用 create table ... 去创建数据表 ... 数据表的名字是 people ... 这个表可以存储一些关于电影人的相关的数据 ... 在这个数据表里有几个字段 ...

一个是 people_id ... 它的类型是 INT ... 长度设置成 10 ... 后面再加上一个 unsigned ... 表示这个字段的值只能是正数 ... 再加上一个 not null ,表示不能为空 .. 最后再加上一个 auto_increment ... 自动增加 ... 它的意思就是,如果在往这个 people 表里插入数据的时候,不指定这个字段的值,它会自动增加 ... 这样第一条记录会是 1 ,第二条记录会是 2,依次往下排 .. 这个 people_id 字段的值,不会重复 ... 在整个表里面,每条记录的 people_id 的值,都会是一个唯一的数字 ...

输入一个逗号 ... 另起一行 .. 再添加其它的字段 ...

再添加一个 people_name ... 表示人物的名字 .. 它的类型是 varchar ... 长度设置成 100 ...

另起一行 .. 再添加一个叫 people_birth 的字段 ... 在这个字段里,可以存储人物的生日 ... 它的类型是 date ... 日期类型的数据 ..

再添加一个 people_location ... 表示人物的出生地 ... 它的类型是 varchar ... 长度设置成 100 ...

最后,我们可以再指定一下这个数据表里的主键是哪个字段 ... 用一个 primary key ... 把 people_id 作为这个表的主键 ....

再输入一个括号 ... 在这个括号的外面,我们可以再设置在设置一下这个数据表的默认的字符集 ... 用一个 default ... 设置一下 charset,让它等于 utf8 ...

回车 ...

再查看一下这个数据表 ... describe people ...

来自 http://ninghao.net/video/1760#info

 
查询
13)插入数据 - INSERT

往数据表里面插入数据记录,可以使用 INSERT ,先用一个 INSERT ,。接着是 INTO ,后面加上要插入数据的数据表的名称,在括号里你可以指定想要插入数据的具体的栏。然后是 VALUES ,在它后面可以把每条数据记录都放在一组括号里面,在括号里,每个数据栏的值之间用一个逗号分隔一下 ...

INSERT INTO 数据表 (栏1, 栏2, 栏3) VALUES (值1, 值2, 值3);

下面,我们往 people 这个表里插入一条数据记录。INSERT INTO people ... VALUES... 在括号里指定对应的数据栏的值,这个表一共有四个栏,第一个栏是 pid ,然后是 people_name,people_birth, 还有 people_location ... 注意在括号里的这些栏的值的顺序,也必需按照这个顺序来。

pid 是这个表的主键,在创建这个数据表的时候,我们为它添加了一个 AUTO_INCREMENT ,也就是,如果不为这个栏指定值的话,MySQL 会自动添加一个唯一的数字,一般第一条记录的 pid 就会是 1,在插入第二条数据的时候,它的值会是 2 ,依次往下排 ...

这里,我们可以使用一个 NULL 作为点位符 ...

people_name 是电影人的名字,这栏是文本类型的数据,所以,需要在值的周围添加一组引号 ...

people_birth 是电影人的生日,这是一个日期类型的数据,可以使用年月日的形式插入日期类型的数据 ... 年是四位的数字,月份是两位的数字,日子也是两位的数字 ...

最后一栏是 people_location ... 电影人的出生地 ... 它是文本类型的数据 ...

INSERT INTO people VALUES (NULL, '丹泽尔·华盛顿', '1954-12-28', '美国');

Query OK, 1 row affected ,说明已经成功的执行了这条查询。在插入记录的时候,我们也可以去指定要插入的数据表的具体的栏。

在数据表的后面加上一组括号 ... 在括号里指定一下要插入数据的栏的名称 ... 这次我只想在 people_name 还有 people_location 里面插入数据 ...

然后是 VALUES ... 同样要在这组括号里指定对应的栏的值,注意这里的顺序要匹配前面我们指定的栏的顺序 ... 也就是第一个值应该是 people_name 这栏的值 ... 然后是 people_location 的值 ...

INSERT INTO people (people_name, people_location) VALUES ('安吉莉娜', '美国');

回车 ... 同样显示执行成功 ... 不次在这条记录里,我们没有去指定 pid 还有 people_birth 栏的值 .. pid 的值会自动添加 ... people_birth 的值取决于数据表的结构,如果你为它设置了默认的值,在没有特别指定值的时候,它会使用这个默认的值。

下面我们再看一下怎么样从数据库里选择出想要的数据。

来自  http://ninghao.net/video/1765#info

 
14)选择数据 - SELECT

从数据库里找出想要的数据,用的是 SELECT ,后面加上想要的数据栏,不同的栏之间使用逗号分隔一下,在这里也可以使用 * 这个通配符,它表示所有的栏 ... 然后在 FROM 的后面指定数据表。

SELECT 栏1,栏2,栏3... FROM 数据表

比如想要查询出 people 这个数据表里面的显示的数据 ... SELECT ,星号 ... 表示所有的栏 ... FROM people ...

SELECT * FROM people;

这里会显示出刚才我们使用 INSERT 插入到 people 数据表里面的数据记录 ... 如果你想要的只是电影人的名字还有生日 ... 我们可以这样 ... SELECT .. 在这里指定一下想要的栏的名称 ... people_name, people_birth ... FROM 同样是来自 people 这个表 ...

SELECT people_name, people_birth FROM people;

这次返回的结果里面,只包含电影人的姓名还有生日这两栏内容。

WHERE

我们可以使用一个 WHERE ,去限制一下要找的东西,可以使用 WHERE 去设置一下条件。比如查询出生在 美国 的所有的电影人。

SELECT 所有的东西,FROM ,从 people 这个表里面。WHERE ... 在它后面去设置一个条件,要设置的条件是 people_location 的值等于美国。回车 ... 显示出来的结果都是出生在美国的电影人。

SELECT * FROM people WHERE people_location = '美国';

ORDER BY

对找到的结果,我们可以使用 ORDER BY去设置一下排序的条件与方式,比如按电影人的出生日期来排序,排序的方式可以是升序排列,也可以是降序排列。

SELECT 所有的东西 FROM people 数据表里,ORDER BY people_birth ... 排序的条件是出生日期这栏数据,后面再加上排序的方式,默认是 ASC ,表示升序排列,也就是年龄最小的电影人会排在最前面。如果设置成 DESC 的话,年龄最大的电影人会排在最前面。这里我们设置成 DESC ...

SELECT * FROM people ORDER BY people_birth DESC;

你会看到,排在第一的是 xx ,因为他是最早出生的人。再试一下 ASC ...

SELECT * FROM people ORDER BY people_birth ASC;

这次排在最前面的是 xx,因为它是所有找到结果里面,最晚出生的人。

来自  http://ninghao.net/video/1766#info

 
15)更新与删除数据 - UPDATE and DELETE

UPDATE

更新数据表里的记录,用的是 UPDATE,它的后面首先是表的名称,然后用一个 SET ,表示去设置一些什么东西,后面加上要更新的栏还有对应的值,一般我们还需要加上一个条件,也就是你需要说明一下要更新哪些记录。这个条件可以放在 WHERE 的后面。

下面,我们去更新一下 安吉丽娜·朱莉 的生日这栏,在插入这条数据记录的时候,没有指定她的生日,所以会用一个默认的值 ... 先输入 UPDATE ... 要更新的数据是在 poeple 这个表里面 ... SET ... 更新的栏是 people_birth ... 电影人的出生日期 ... 在等号后面,再加上具体的值 '1975-06-04' ...

最后需要再去设置一个条件,我们要更新的是 xx 的生日 ... pid 是这个表的主键,也就是每条记录的 pid 的值都是唯一的,这样可以利用这个 pid 的值作为条件。

用一个 WHERE 指定一下条件 ... pid 等于 2 .. 这条语句的意思就是,去更新 people 表里,pid 的值是 2 的这条记录里面,people_birth 的值为 1975-06-04 ....

UPDATE people SET people_birth = '1975-06-04' WHERE pid = 3;

回车 ... 再查看一下 ... SELECT * FROM people;

你会发现,pid 是 3 的这条记录的 people_birth 这栏内容的值,已经更新为了 1975-06-04 ...

DELETE

删除表里记录,用的是 DELETE ... 在 DELETE FROM 的后面,加上要删除记录的表的名称 .... 然后再用一个 WHERE,去设置一个删除的条件,满足这个条件的记录都会被删除掉。

比如我们要删除掉 pid 是 4 的这条记录 ... DELETE FROM ... 从 people 这个表里删除 ... WHERE 设置条件 .... pid 等于 4 ... 回车 ... 执行成功以后,再查看一下 ...

DELETE FROM people WHERE pid = 4;

pid 是 4 的这条记录已经从 people 这个表里删除掉了。

UPDATE 表名称 SET 字段 = '值' WHERE 字段 = 值;

16)限制结果的数量与偏移 - LIMIT and OFFSET

LIMIT 与 OFFSET

有时候你可能想要限制找到的结果的数量,在一些 Web 应用里面,会分页显示一些内容,比如每页显示 10 篇文章之类的。这种情况我们可以 LIMIT 去限制结果数量,用 OFFSET 去设置偏移量。

下面我们找出 people 这个表里出生地是在美国的电影人,并且只需要三个结果。SELECT 星号,FROM people ,WHERE 设置一下条件,people_location = '美国' ,再加上一个 LIMIT,限制一下找到的结果的数量 ... 后面是想要的数量的值,这里设置成 3 ...

SELECT * FROM people WHERE people_location = '美国' LIMIT 3;

会给我们找出三个出生在美国的电影人 ... 如果把 LIMIT 的值设置成 2 的话 .... 只会显示 2 条找到的结果 ...

用 OFFSET 可以设置一个偏移量,比如在 Web 应用里,分页显示内容的时候,第一页显示 10 个内容,也就是显示出查询结果里面的 1 - 10,这样在显示第二页内容的时候,显示的就应该是结果里面的第 11 - 20 个结果了,这个时候,就需要去设置一个偏移量。

下面,我们随便找出三个电影人,从第二个开始。LIMIT 设置成 3,OFFSET 设置成 1 ... 往后偏移一个结果,就是从第二个结果开始显示。你也可以理解成,这个结果的行号是从 0 开始的,也就是第一条结果的行号是 0 ,这样如果我们把 OFFSET 的值设置成 1 的话,就表示从第二个结果开始。

注意找到的电影人的 pid 是,2,3,4 ..

SELECT * FROM people LIMIT 3 OFFSET 1;

如果把 OFFSET 的值设置成 2 的话,显示出来的就应该是第 3,4,5 个结果。这里我们也可以换一种写法,就是为 LIMIT 提供两个参数,第一个参数是偏移量,第二个参数是限制结果的数量。

比如我们还是要找出电影人从第二个结果开始,显示三个。SELECT 星号 ... FROM people ... LIMIT ... 第二条结果的行号是 1,所以先输入一个 1,然后用一个逗号分隔一下 ... 再指定一下总共想要的结果数量 ... 这里就是 3 ...

SELECT * FROM people LIMIT 1, 3;

来自 http://ninghao.net/video/1786#info

17)操作符

在查询语句中我们可以使用操作符去做更复杂的事情,之前我们已经介绍了等号的作用。另外还有很多操作符可以使用。像大于,小于,大于等于,小于等于,或者不等于。IN,NOT IN,LIKE 还有 NOT LIKE ... 这个视频里我们来看一下这些操作符的使用。

比较

比如我们要找到在 1960 年 1 月 1 号之后出生的电影人,可以使用大于这个操作符。得到的电影人都是在这个指定日期之后出生的。

SELECT * FROM people WHERE people_birth > '1960-01-01';

逻辑

使用逻辑操作符,可以设置更复杂的条件,比如 AND 或者 OR ,AND 是与,也就是并且的意思。OR 是或,表示或者的意思。

比如我们要找出,出生日期在 1960 年 1 月 1 号以后,并且在 1970 年 1 月 1 号之前出生的电影人。这里可以使用一个 AND 来连接这两个条件。

SELECT * FROM people WHERE people_birth > '1960-01-01' AND people_birth < '1970-01-01';

IN

测试一下一个值是否在一个集合里面,可以使用 IN,测试一个值不在一个集合里,用的是 NOT IN。比如我们要找到出生地在美国或者英国的电影人。

SELECT * FROM people WHERE people_location IN ('美国', '英国');

想找到不是在这两个国家出生的人,把 IN 换成 NOT IN 就可以了。

LIKE

使用 LIKE ,后面可以加上一个简单的匹配的模式,比如你可以找出姓名里面包含某个字的电影人,这里我们可以使用两个通配符,% 表示一个或者多个字符,_ 表示一个字符。

下面,我们找出姓名里包含 李 这个字的所有人电影人 ... SELECT 星号,FROM 从 people 这个表里 WHERE 设置条件,看一下 people_name 这栏内容里面,姓名以李字开头的电影人 ... 回车 ... 找到的结果里面,所有的电影人的姓名里,都是以李字开头 ... 李安,李连杰 ...

SELECT * FROM people WHERE people_name LIKE ('李%');

如果把 % 换成 _ ... 就表示找出姓名是以李字开头,并且是两个字儿的电影人 ... 回车 ...

你会看到,结果里,姓名都是以李字开头并且都是两个字的名字。因为一个下划线,表示一个字符。

关系
18)为创建关系做准备

在接下来的视频里,我们去练习一下利用数据表与表之间的关系。在这之前,我们可以再去重新准备一下数据库。先删除之前我们创建的 movietalk 这个数据库 ...

登录以后,输入 drop database movietalk;

然后再去创建一个数据库 ... create database movietalk; ... 进入到这个数据库 ... use movietalk;

再查看一下数据库里的数据表 ... show tables;

现在这个数据库是空白的 ... 下面,我们可以在这个数据库里添加几个数据库 ... 然后在这些数据表里添加点演示的数据 ... 我准备好了一个数据结构 ... 你可以在这个课程的资源包里面找到 ...

下面,我们先去看一下 ... 现在你看到的就是一个数据库的结构 ... 另外还有数据表里面数据 ... 一会儿,我们要想办法把它导入到数据库里面去 ...

这个文件就是用一些 sql 语句组成的 ... 文件的扩展名一般是 .sql ...

文件的最开始这部分是要创建的数据表 ...

创建数据表,用的是 create table ...

这里我们先创建了一个叫 user 的数据表 ... 在这个数据表里存储的是网站的用户相关的信息 ... 现在, 它里面有两个字段 ... 一个是 user_id ,还有一个是 user_name ,用户名 ...

它的下面是一个叫 review 的数据表 ... 这个数据表里要放的东西是评论的内容 ... 表里面有几个字段 .. review_id ,评论的 id 号 .. 还有 review_content ,这个字段里是评论的内容 ...

下面的是 review_rate ,可以存储用户对电影的评分 ... user_id 存储的是这条评论的作者的 id 号,这个 user_id 跟 user 表里面的 user_id 是对应的 ...

film_id 里面放的是这条评论相关的电影的 id ,它的值,跟下面,我们要创建的 film 这个表里的 film_id 是对应的 ...

在 film 这个表里,包含一个 film_id 字段 ... 电影的 id 号,还有 film_name ,电影的名字 .. 还有一个 film_box ,这个字段可以存储电影的票房记录 ...

people 这个表里放的是电影人... people_id ,电影人的 id 号 ... people_name ,电影人的名字 ... people_birth ,电影人的出生日期 ... 还有 people_location ... 电影人的出生地 ...

最后,还有一个叫 film_people 的数据表 ... 在这个表里面,我们存储的是电影与电影人的关系 ...

这个表里有三个字段,一个是 film_id ,电影的 id 号,还有一个是 people_id ,电影人的 id 号,还有一个 job ,这个字段存储的是电影人在某部电影上的工作是什么,比如导演,编剧,演员等等。

下面这些东西,是要插入到上面这些数据表里面的数据 ... 用的是我们之前介绍过的 insert into ...

下面,我们要想办法去把这个 sql 文件导入到 movietalk 这个数据库里面 ... 可以使用数据库的管理软件,比如 phpmyadmin ,或者 sequel pro ...

这里,我介绍一个用命令导入的方法 ...

打开终端工具 ... 先进入到这个 sql 文件所在的目录 ... 我把它放在了我的桌面上 ... cd desktop ...

然后输入 mysql -u root -p ... 后面加上要导入数据的数据库的名字 ... 这里就是 movietalk 这个数据库 ... 然后用一个小于号 < ... 接着是这个 sql 文件的名字 ... movietalk.sql

mysql -u root -p movietalk < movietalk.sql;

回车 ... 成功以后, 我们可以打开数据库的管理软件去浏览一下 ...

打开 movietalk 这个数据库 ... 你会看到,这个数据库里面,已经创建了几个数据表 ...

再打开对应的数据表 ... 里面,会包含一些导入进来的演示的数据 ...

来自 http://ninghao.net/video/1789#info

19)关联 - JOIN

使用关联,我们可以利用表与表之间的关系,重新去组织不同表的信息。比如我们想把用户和评论这两个表组织在一起,找出所有用户所撰写的对应的电影评论。找到的结果里面要包含用户的名称,还有对应的评论的内容。

SELECT user_name 用户名,还有 review_content ,评论的内容,注意这两栏内容是来自不同的数据表,user_name 是在 user 表里,review_content 是在 review 表里。

如果栏的名称有冲突的话,需要在栏的名称的前面,加上数据表的名称,然后一个点,后面是栏的名称。

FROM ,来自 user 还有 review 这两个表 ... 再用 WHERE 去设置一个条件,这个条件是把用户与评论这两个表组织在一起的非常关键的一步 ...

要设置的条件是 review 表里的 user_id 要跟 user 表里的 user_id 相匹配。回车 ... 用户还有评论这两个表就关联在一起了,关联以后这个表里面有两栏内容,来自用户表里的用户的名称,还有来自评论表里的评论的内容。因为我们设置了一个关联的条件,评论表里的 user_id 等于用户表里的 user_id ,所以,这里显示出来的就是对应用户还有对应的评论内容。

这也是为什么在设计数据表结构的时候,不直接把用户名放在评论的表里面,而是用了一个用户的 id。这样用户可以更改他的名称或者相关的设置,需要的时候,我们可以使用这条语句把这两个表的内容组织在一起。

SELECT user_name, review_content FROM user, review WHERE review.user_id = user.user_id;

关联也有很多方法,比如我们这里,在 FROM 后面指定的要关联的两个表,中间使用了一个逗号... 它的功能其实就相当于是 CROSS JOIN ... 交叉关联 ... 或者 INNER JOIN 内部关联。下面我们用 INNER JOIN 再试一下 ...

两个表之间用 INNER JOIN 连接 ... 然后把 WHERE 要换成 ON ... 也就是用 ON 来设置一下关联的时候要查看是否匹配的栏,也就是去对比一下两个表之间的共同点。回车 ... 跟前面的语句的效果是一样的 ...

SELECT user_name, review_content FROM user INNER JOIN review ON review.user_id = user.user_id;

在它的后面,我们可以继续使用 WHERE 去设置其它的条件。比如找出用户 id 是 1 的评论内容。WHERE user.user_id = 1

SELECT user_name, review_content FROM user INNER JOIN review ON review.user_id = user.user_id WHERE user.user_id = 1;

INNER 就是使用两个表之间的共同点进行关联,这个共同点匹配的话才会把他们关联在一起。它其实就是找出两个表相交集的数据。

来自  http://ninghao.net/video/1790#info

20)左关联 - LEFT JOIN

除了 INNER JOIN 还有一些关联的方法,比如 LEFT JOIN ,左关联。即然它也是 JOIN 的一种方法,所以,也会按照两个表的共同点进行匹配,然后关联在一起。如果不匹配的话,同样会把左边的表的数据记录显示出来。我们再用一个例子说明一下。

比如我们还是想把用户与评论这两个表关联在一起,但是我们想要找出所有的用户表里的用户名,不管这个用户有没有写过评论,如果没写过评论,关联的时候,评论内容这栏里面,就会显示一个 NULL,如果写过评论的话,就显示出对应的评论内容。

SELECT user_name, review_content FROM ... 因为我们想要显示出所有的用户记录,并且要用的是 LEFT JOIN 这种关联的方法,所以,要把 user 这个表放在 LEFT JOIN 的左边 ... 然后是 LEFT JOIN 左关联 .. review 这个表 ...

设置一个关联的条件,也就是这两个表的共同点 ... ON review.user_id = user.user_id ... 回车 ... 执行这条查询语句 ...

会把用户与评论这两个表,按着用户 id 这个共同点进行匹配,把它们关联在一起 ... 注意 张三 这个用户,没有写过评论,因为我们用的是 LEFT JOIN 左关联这种方式 ... 我们把用户这个表放在了关联的左边 .. 所以即使没有评论内容的用户,也会出现在这个查询的结果里面 ... 评论的内容会用一个 NULL 表示空白的内容。

SELECT user_name, review_content FROM user LEFT JOIN review ON review.user_id = user.user_id;

另外还有很多关联的方式 .. 比如 RIGHT JOIN ... 右关联 ... 也就是以右边的表为主进行关联 ..

来自 http://ninghao.net/video/1791#info

 
21)统计,平均,分组

MySQL 提供了一些函数可以去统计,求合,求平均,找出最大值,最小值等等。这个视频我们学习几个函数。

比如我们要统计一下结果的数量 .. . 可以使用 count 函数 ... 比如我们要统计一下 review 这个表里,一共有多少条记录 ...

COUNT

SELECT 选择的是 rid ,我们可以统计一下 rid 这栏的数量,在它的前面加上一个 COUNT,然后把要统计的栏放在一组括号里。FROM ,来自 review 这个表。回车 ... 这条语句的意思就是去统计一下 review 这个表里,一共有多少个记录。

SELECT COUNT(rid) FROM review;

GROUP BY

如果你想找出每一部电影的评论的数量,我们可以使用一个 GROUP BY ,去分一下组。可以按照评论这个表里面的 fid ,也就是电影的 id 来分组。

SELECT fid,电影的 id 号, COUNT(rid) ,统计的仍然是评论的 id,FROM 来自 review 这个表,最后再加上一个 GROUP BY ... 按照什么东西来分组,我们要按 fid 进行分组。回车 ... 给出的结果就是对应的电影的 id ,还有这部电影的所有的评论数量。

SELECT fid, COUNT(rid) FROM review GROUP BY fid;

AVG

下面,我们再试一下求平均的函数,用的是 AVG 这个函数。我们可以算一下每部电影的平均分是多少。

SELECT fid 电影的 id 号,然后用 AVG 函数去求平均数,要求平均数的栏是 review_rate ,用户给电影的评分,FROM 来自 review 这个表,最后同样需要使用一个 GROUP BY ,去按照 fid 来分一下组。回车 ... 结果就是每部电影对应的平均分。

SELECT fid, AVG(review_rate) FROM review GROUP BY fid;

关联

配合关联,我们可以在这个结果里面显示出来自电影这个表里的电影的名称。

SELECT 选择来自 review 表里的 fid ,注意这里要在栏的名称的前面加上表的名称,这样可以防止冲突,然后是来自 film 表里的 film_name,接着是评论表里的电影的平均分 ,用一个 AVG 函数去计算出平均分,FROM 来自 reivew 还有 film 表,用 WHERE 再设置一下条件,设置的条件是 review 表里的 fid 等于 film 表里的 fid 。最后再用一个 GROUP BY 去分一下组。回车 ... 显示的出来就是电影的 id ,对应的名称,还有电影的平均分。

SELECT review.film_id, film.film_name, AVG(review_rate) FROM review, film WHERE review.film_id = film.film_id GROUP BY review.film_id;

来自  http://ninghao.net/video/1792#info

22)三个表的关联

使用关联我们可以去做很复杂的查询,在这个视频我们来看一下把 电影,电影人,还有电影与电影人的关系这几个表关联在一起。

电影这个表里的放的是跟电影相关的内容,电影的名称,票房等等,电影人这个表里是所有的电影从业人员,里面有电影人的名称,出生日期,出生地这些字段。

电影与电影人的关系这个表里,放的是电影的 id 号,还有跟这部电影相关的电影人的 id 号 ,另外还有这个电影人在这部电影中的工作是什么 ,比如演员,导演,编剧等等 ...

我们要做的就是利用 电影与电影人关系这个表里的内容,把电影,还有电影人这两个表关联在一起。关联以后保留电影的名称,跟它相关的所有的电影人,还有这个电影人在这部电影中的工作。

SELECT film_name 电影名称,people_name,电影人的姓名,还有 job,电影人在某部电影中的工作 ... FROM 来自 film 逗号 people 逗号 film_people .... 这个逗号就相当于是 CROSS JOIN 或者 INNER JOIN 这种关联的方法 ... WHERE 去设置一下这几个表之间的共同点 ...

首先 ... film_people 这个表里的 film_id 要等于 film 电影这个表里的 film_id ... 然后用一个 AND 操作符连接一下 ... 表示并且 ... film_people,也就是电影与电影人的关系这个表里的 people_id 要跟 people 表里的 people_id 相匹配 ...

回车 ... 找到的结果就是 电影的名称 ... 对应的电影人的名称 ... 还有这个电影人在这部电影中的工作是什么 ...

SELECT film_name, people_name, job FROM film, people, film_people WHERE film_people.film_id = film.film_id AND film_people.people_id = people.people_id;

要找出某部电影的所有的工作人员 ... 只需要在这条语句的后面再加上一个条件 ... 用一个 AND 连接 ... 比如找到 xxx 这个电影的所有人工作人员 ... 这里再设置一下 film_name = x ...

SELECT film_name, people_name, job FROM film, people, film_people WHERE film_people.film_id = film.film_id AND film_people.people_id = people.people_id AND film_name = 'x';

现在显示出来的就是 xx 这部电影所有相关的工作人员。

我们也可以找出某个电影人参与过的所有的电影作品 .... AND people_name like "xx%" ... 这里我们可以使用一个 like 操作符 ... 找到包含字符的结构 ...

来自  http://ninghao.net/video/1793#info

 
23)三个表的关联 #2

下面,我们再去统计一下每个导演的票房,然后再按降序去排列一下。

SELECT ... film_box ... 电影的票房,因为我们需要合计一下,所以可以用一个 SUM 函数,后面我们会按电影人的姓名进行分组,所以这里统计的就是每个电影人的票房的合计 ...

这里我们可以给它起个别名 ... 这样在后面,我们可以使用这个别名,去利用这个合计之后的数据 ... 比如,设置去按这栏内容进行排序 ...

设置别名,可以用一个 AS ,表示作为 ... 后面是为这栏内容起的别名 ... 可以叫它 total_box ...

... 然后是电影人的名称 people_name .. FROM film, people, crew ... 设置一下 WHERE ... film_people.film_id 等于 film.film_id ... AND 并且 ... film_people.people_id = people.people_id ...

再用一个 AND ... 我们只想统计导演的票房 ... 所以,要让 job = '导演' .... 然后要按照电影人的姓名进行分组 ... 用一个 GROUP BY ... people_name ... 最后设置一下排序的方式 ... ORDER BY ... 按 total_box 进行排序,这个 total_box 是我们为合计的票房起的一个别名 .. 排序的方式是 DESC ,降序排列 ...

回车 ...

现在,你看到的结果就是,在电影人这个数据表里,按降序排列的导演的总计的票房记录。

SELECT SUM(film_box) AS total_box, people_name FROM film, people, crew WHERE crew.film_id = film.film_id AND crew.people_id = people.people_id AND crew_job = '导演' GROUP BY people_name ORDER BY total_box DESC;

SELECT SUM(film_box) AS total_box, people_name FROM film AS f, people AS p, crew AS c WHERE c.film_id = c.film_id AND c.people_id = p.people_id AND crew_job = '导演' GROUP BY people_name ORDER BY total_box DESC;

来自  http://ninghao.net/video/1794#info

 
普通分类: