百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

第二章——MySql的SQL运用及基础语句

toyiye 2024-07-16 05:37 9 浏览 0 评论

第2章 SQL基础


本章将通过丰富的实例对SQL语言的基础进行详细介绍,MySQL,使得读者不但能够学习到标准SQL的使用,又能够学习到MySQL中一些扩展SQL的使用方法。

2.1 SQL简介

当面对一个陌生的数据库时,通常需要一种方式与它进行交互,以完成用户所需要的各种工作,这个时候,就要用到SQL语言了。

SQL是Structure Query Language(结构化查询语言)的缩写,它是使用关系模型的数据库应用语言,由IBM在20世纪70年代开发出来,作为IBM关系数据库原型System R的原型关系语言,实现了关系数据库中的信息检索。

20世纪80年代初,美国国家标准局(ANSI)开始着手制定SQL标准,最早的ANSI标准于1986年完成,就被叫作SQL-86。标准的出台使SQL作为标准关系数据库语言的地位得到了加强。SQL标准目前已几经修改更趋完善。

正是由于SQL语言的标准化,所以大多数关系型数据库系统都支持SQL语言,它已经发展成为多种平台进行交互操作的底层会话语言。

2.2 (My)SQL使用入门

这里用了(My)SQL这样的标题,目的是在介绍标准SQL的同时,也将一些MySQL在标准SQL上的扩展一同介绍给大家。希望读者看完本节后,能够对标准SQL的基本语法和MySQL的部分扩展语法有所了解。

2.2.1 SQL分类

SQL语句主要可以划分为以下3个类别。

? DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括create、drop、alter等。

? DML(Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括insert、delete、udpate和select等。

? DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括grant、revoke等。

2.2.2 DDL语句

DDL是数据定义语言的缩写,简单来说,就是对数据库内部的对象进行创建、删除、修改的操作语言。它和DML语言的最大区别是DML只是对表内部数据的操作,而不涉及到表的定义、结构的修改,更不会涉及到其他对象。DDL语句更多的被数据库管理员(DBA)所使用,一般的开发人员很少使用。

下面通过一些例子来介绍MySQL中常用DDL语句的使用方法。

1.创建数据库

启动MySQL服务之后,输入以下命令连接到MySQL服务器:

[mysql@db3 ~]$ mysql -uroot -p

Enter password:

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 7344941 to server version: 5.1.9-beta-log


Type 'help;' or '\h' for help. Type '\c' to clear the buffer.


mysql>

在以上命令行中,mysql代表客户端命令,-u后面跟连接的数据库用户,-p表示需要输入密码。

如果数据库设置正常,并输入正确的密码,将看到上面一段欢迎界面和一个mysql>提示符。在欢迎界面中介绍了以下几部分内容。

? 命令的结束符,用;或者\g结束。

? 客户端的连接ID,这个数字记录了MySQL服务到目前为止的连接次数,每个新连接都会自动加1,本例中是7344941。

? MySQL服务器的版本,本例中是“5.1.9-beta-log”,说明是5.1.9的测试版,如果是标准版,则会用Standard代替Beta。

? 通过“help;”或者“\h”命令来显示帮助内容,通过“\c”命令来清除命令行buffer。

在mysql>提示符后面输入所要执行的的SQL语句,每个SQL语句以分号或者\g结束,按回车键执行。

因为所有的数据都存储在数据库中,因此需要学习的第一个命令是创建数据库,语法如下所示:

CREATE DATABASE dbname

例如,创建数据库test1,命令执行如下:

mysql> create database test1;

Query OK, 1 row affected (0.00 sec)

可以发现,执行完创建命令后,下面有一行提示“Query OK, 1 row affected (0.00 sec)”,这段提示可以分为3部分,“Query OK”表示上面的命令执行成功,读者可能奇怪,又不是执行查询操作,为什么显示查询成功?其实这是MySQL的一个特点,所有的DDL和DML(不包括SELECT)操作执行成功后都显示“Query OK”,这里理解为执行成功就可以了;“1 row affected”表示操作只影响了数据库中一行的记录,“0.00 sec”则记录了操作执行的时间。

如果已经存在这个数据库,系统会提示:

mysql> create database test1;

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

这个时候,如果需要知道系统中都存在哪些数据库,可以用以下命令来查看:

mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| cluster |

| mysql |

| test |

| test1 |

+--------------------+

5 rows in set (0.00 sec)

可以发现,在上面的列表中除了刚刚创建的test1外,还有另外4个数据库,它们都是安装MySQL时系统自动创建的,其各自功能如下。

? information_schema:主要存储了系统中的一些数据库对象信息。比如用户表信息、列信息、权限信息、字符集信息、分区信息等。

? cluster:存储了系统的集群信息。

? mysql:存储了系统的用户权限信息。

? test:系统自动创建的测试数据库,任何用户都可以使用。


在查看了系统中已有的数据库后,可以用如下命令选择要操作的数据库:

USE dbname

例如,选择数据库test1:

mysql> use test1

Database changed

然后再用以下命令来查看test1数据库中创建的所有数据表:

mysql> show tables;

Empty set (0.00 sec)

由于test1是刚创建的数据库,还没有表,所以显示为空。命令行下面的“Empty set”表示操作的结果集为空。如果查看一下mysql数据库里面的表,则可以得到以下信息:

mysql> use mysql

Database changed

mysql> show tables;

+---------------------------+

| Tables_in_mysql |

+---------------------------+

| columns_priv |

| db |

| event |

| func |

| general_log |

| help_category |

| help_keyword |

| help_relation |

| help_topic |

| host |

| plugin |

| proc |

| procs_priv |

| slow_log |

| tables_priv |

| time_zone |

| time_zone_leap_second |

| time_zone_name |

| time_zone_transition |

| time_zone_transition_type |

| user |

+---------------------------+

21 rows in set (0.00 sec)


2.删除数据库

删除数据库的语法很简单,如下所示:

drop database dbname;

例如,要删除test1数据库可以使用以下语句:

mysql> drop database test1;

Query OK, 0 rows affected (0.00 sec)

可以发现,提示操作成功后,后面却显示了“0 rows affected”,这个提示可以不用管它,在MySQL里面,drop语句操作的结果显示都是“0 rows affected”。

注意:数据库删除后,下面的所有表数据都会全部删除,所以删除前一定要仔细检查并做好相应备份.

3.创建表

在数据库中创建一张表的基本语法如下:

CREATE TABLE tablename (column_name_1 column_type_1 constraints,

column_name_2 column_type_2 constraints,……column_name_n column_type_n constraints)

因为MySQL的表名是以目录的形式存在于磁盘上,所以表名的字符可以用任何目录名允许的字符。column_name是列的名字,column_type是列的数据类型,contraints是这个列的约束条件,在后面的章节中会详细介绍。

例如,创建一个名称为emp的表。表中包括3个字段,ename(姓名),hiredate(雇用日期)、sal(薪水),字段类型分别为varchar(10)、date、int(2)(关于字段类型将会在下一章中介绍):

mysql> create table emp(ename varchar(10),hiredate date,sal decimal(10,2),deptno int(2));

Query OK, 0 rows affected (0.02 sec)

表创建完毕后,如果需要查看一下表的定义,可以使用如下命令:

DESC tablename

例如,查看emp表,将输出以下信息:

mysql> desc emp;

+----------+---------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+----------+---------------+------+-----+---------+-------+

| ename | varchar(10) | YES | | | |

| hiredate | date | YES | | | |

| sal | decimal(10,2) | YES | | | |

| deptno | int(2) | YES | | | |

+----------+---------------+------+-----+---------+-------+

4 rows in set (0.00 sec)

虽然desc命令可以查看表定义,但是其输出的信息还是不够全面,为了查看更全面的表定义信息,有时就需要通过查看创建表的SQL语句来得到,可以使用如下命令实现:

mysql> show create table emp \G;

*************************** 1. row ***************************

Table: emp

Create Table: CREATE TABLE `emp` (

`ename` varchar(20) DEFAULT NULL,

`hiredate` date DEFAULT NULL,

`sal` decimal(10,2) DEFAULT NULL,

`deptno` int(2) DEFAULT NULL,

KEY `idx_emp_ename` (`ename`)

) ENGINE=InnoDB DEFAULT CHARSET=gbk

1 row in set (0.02 sec)


ERROR:

No query specified


mysql>

从上面表的创建SQL语句中,除了可以看到表定义以外,还可以看到表的engine(存储引擎)和charset(字符集)等信息。“\G”选项的含义是使得记录能够按照字段竖着排列,对于内容比较长的记录更易于显示。


4.删除表

表的删除命令如下:

DROP TABLE tablename

例如,要删除数据库emp可以使用以下命令:

mysql> drop table emp;

Query OK, 0 rows affected (0.00 sec)

5.修改表

对于已经创建好的表,尤其是已经有大量数据的表,如果需要对表做一些结构上的改变,我们可以先将表删除(drop),然后再按照新的表定义重建表。这样做没有问题,但是必然要做一些额外的工作,比如数据的重新加载。而且,如果有服务在访问表,也会对服务产生影响。

因此,在大多数情况下,表结构的更改一般都使用alter table语句,以下是一些常用的命令。

(1) 修改表类型,语法如下:

ALTER TABLE tablename MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]

例如,修改表emp的ename字段定义,将varchar(10)改为varchar(20):

mysql> desc emp;

+----------+---------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+----------+---------------+------+-----+---------+-------+

| ename | varchar(10) | YES | | | |

| hiredate | date | YES | | | |

| sal | decimal(10,2) | YES | | | |

| deptno | int(2) | YES | | | |

+----------+---------------+------+-----+---------+-------+

4 rows in set (0.00 sec)

mysql> alter table emp modify ename varchar(20);

Query OK, 0 rows affected (0.03 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> desc emp;

+----------+---------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+----------+---------------+------+-----+---------+-------+

| ename | varchar(20) | YES | | | |

| hiredate | date | YES | | | |

| sal | decimal(10,2) | YES | | | |

| deptno | int(2) | YES | | | |

+----------+---------------+------+-----+---------+-------+

4 rows in set (0.00 sec)

(2) 增加表字段,语法如下:

ALTER TABLE tablename ADD [COLUMN] column_definition [FIRST | AFTER col_name]

例如,表emp上新增加字段age,类型为int(3):

mysql> desc emp;

+----------+---------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+----------+---------------+------+-----+---------+-------+

| ename | varchar(20) | YES | | | |

| hiredate | date | YES | | | |

| sal | decimal(10,2) | YES | | | |

| deptno | int(2) | YES | | | |

+----------+---------------+------+-----+---------+-------+

4 rows in set (0.00 sec)


mysql> alter table emp add column age int(3);

Query OK, 0 rows affected (0.03 sec)

Records: 0 Duplicates: 0 Warnings: 0


mysql> desc emp;

+----------+---------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+----------+---------------+------+-----+---------+-------+

| ename | varchar(20) | YES | | | |

| hiredate | date | YES | | | |

| sal | decimal(10,2) | YES | | | |

| deptno | int(2) | YES | | | |

| age | int(3) | YES | | | |

+----------+---------------+------+-----+---------+-------+

5 rows in set (0.00 sec)

(3)删除表字段,语法如下:

ALTER TABLE tablename DROP [COLUMN] col_name

例如,将字段age删除掉:

mysql> desc emp;

+----------+---------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+----------+---------------+------+-----+---------+-------+

| ename | varchar(20) | YES | | | |

| hiredate | date | YES | | | |

| sal | decimal(10,2) | YES | | | |

| deptno | int(2) | YES | | | |

| age | int(3) | YES | | | |

+----------+---------------+------+-----+---------+-------+

5 rows in set (0.00 sec)

mysql> alter table emp drop column age;

Query OK, 0 rows affected (0.04 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> desc emp;

+----------+---------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+----------+---------------+------+-----+---------+-------+

| ename | varchar(20) | YES | | | |

| hiredate | date | YES | | | |

| sal | decimal(10,2) | YES | | | |

| deptno | int(2) | YES | | | |

+----------+---------------+------+-----+---------+-------+

4 rows in set (0.00 sec)


(4)字段改名,语法如下:

ALTER TABLE tablename CHANGE [COLUMN] old_col_name column_definition

[FIRST|AFTER col_name]

例如,将age改名为age1,同时修改字段类型为int(4):

mysql> desc emp;

+----------+---------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+----------+---------------+------+-----+---------+-------+

| ename | varchar(20) | YES | | | |

| hiredate | date | YES | | | |

| sal | decimal(10,2) | YES | | | |

| deptno | int(2) | YES | | | |

| age | int(3) | YES | | | |

+----------+---------------+------+-----+---------+-------+

mysql> alter table emp change age age1 int(4) ;

Query OK, 0 rows affected (0.02 sec)

Records: 0 Duplicates: 0 Warnings: 0


mysql> desc emp

-> ;

+----------+---------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+----------+---------------+------+-----+---------+-------+

| ename | varchar(20) | YES | | | |

| hiredate | date | YES | | | |

| sal | decimal(10,2) | YES | | | |

| deptno | int(2) | YES | | | |

| age1 | int(4) | YES | | | |

+----------+---------------+------+-----+---------+-------+

5 rows in set (0.00 sec)

注意:change和modify都可以修改表的定义,不同的是change后面需要写两次列名,不方便。但是change的优点是可以修改列名称,modify则不能。

(5)修改字段排列顺序。

前面介绍的的字段增加和修改语法(ADD/CNAHGE/MODIFY)中,都有一个可选项first|after column_name,这个选项可以用来修改字段在表中的位置,默认ADD增加的新字段是加在表的最后位置,而CHANGE/MODIFY默认都不会改变字段的位置。

例如,将新增的字段birth date加在ename之后:

mysql> desc emp;

+----------+---------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+----------+---------------+------+-----+---------+-------+

| ename | varchar(20) | YES | | | |

| hiredate | date | YES | | | |

| sal | decimal(10,2) | YES | | | |

| deptno | int(2) | YES | | | |

| age | int(3) | YES | | | |

+----------+---------------+------+-----+---------+-------+

5 rows in set (0.00 sec)


mysql> alter table emp add birth date after ename;

Query OK, 0 rows affected (0.03 sec)

Records: 0 Duplicates: 0 Warnings: 0


mysql> desc emp;

+----------+---------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+----------+---------------+------+-----+---------+-------+

| ename | varchar(20) | YES | | | |

| birth | date | YES | | | |

| hiredate | date | YES | | | |

| sal | decimal(10,2) | YES | | | |

| deptno | int(2) | YES | | | |

| age | int(3) | YES | | | |

+----------+---------------+------+-----+---------+-------+

6 rows in set (0.00 sec)

修改字段age,将它放在最前面:

mysql> alter table emp modify age int(3) first;

Query OK, 0 rows affected (0.03 sec)

Records: 0 Duplicates: 0 Warnings: 0


mysql> desc emp;

+----------+---------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+----------+---------------+------+-----+---------+-------+

| age | int(3) | YES | | | |

| ename | varchar(20) | YES | | | |

| birth | date | YES | | | |

| hiredate | date | YES | | | |

| sal | decimal(10,2) | YES | | | |

| deptno | int(2) | YES | | | |

+----------+---------------+------+-----+---------+-------+

6 rows in set (0.00 sec)

注意:CHANGE/FIRST|AFTER COLUMN这些关键字都属于MySQL在标准SQL上的扩展,在其他数据库上不一定适用。

(6)表改名,语法如下:

ALTER TABLE tablename RENAME [TO] new_tablename

例如,将表emp改名为emp1,命令如下:

mysql> alter table emp rename emp1;

Query OK, 0 rows affected (0.00 sec)


mysql> desc emp;

ERROR 1146 (42S02): Table 'sakila.emp' doesn't exist

mysql> desc emp1;

+----------+---------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+----------+---------------+------+-----+---------+-------+

| age | int(3) | YES | | | |

| ename | varchar(20) | YES | | | |

| birth | date | YES | | | |

| hiredate | date | YES | | | |

| sal | decimal(10,2) | YES | | | |

| deptno | int(2) | YES | | | |

+----------+---------------+------+-----+---------+-------+

6 rows in set (0.00 sec)

2.2.3 DML语句

DML操作是指对数据库中表记录的操作,主要包括表记录的插入(insert)、更新(update)、删除(delete)和查询(select),是开发人员日常使用最频繁的操作。下面将依次对它们进行介绍。

1.插入记录

表创建好后,就可以往里插入记录了,插入记录的基本语法如下:

INSERT INTO tablename (field1,field2,……fieldn) VALUES(value1,value2,……valuesn);

例如,向表emp中插入以下记录:ename为zzx1,hiredate为2000-01-01,sal为2000,deptno为1,命令执行如下:

mysql> insert into emp (ename,hiredate,sal,deptno) values('zzx1','2000-01-01','2000',1);

Query OK, 1 row affected (0.00 sec)

也可以不用指定字段名称,但是values后面的顺序应该和字段的排列顺序一致:

mysql> insert into emp values('lisa','2003-02-01','3000',2);

Query OK, 1 row affected (0.00 sec)

对于含可空字段、非空但是含有默认值的字段、自增字段,可以不用在insert后的字段列表里面出现,values后面只写对应字段名称的value,这些没写的字段可以自动设置为NULL、默认值、自增的下一个数字,这样在某些情况下可以大大缩短SQL语句的复杂性。

例如,只对表中的ename和sal字段显式插入值:

mysql> insert into emp (ename,sal) values('dony',1000);

Query OK, 1 row affected (0.00 sec)

来查看一下实际插入值:

mysql> select * from emp;

+--------+------------+---------+--------+

| ename | hiredate | sal | deptno |

+--------+------------+---------+--------+

| zzx | 2000-01-01 | 100.00 | 1 |

| lisa | 2003-02-01 | 400.00 | 2 |

| bjguan | 2004-04-02 | 100.00 | 1 |

| dony | NULL | 1000.00 | NULL |

+--------+------------+---------+--------+

果然,设置为可空的两个字段都显示为NULL。

在MySQL中,insert语句还有一个很好的特性,可以一次性插入多条记录,语法如下:

INSERT INTO tablename (field1, field2,……fieldn)

VALUES

(record1_value1, record1_value2,……record1_valuesn),

(record2_value1, record2_value2,……record2_valuesn),

……

(recordn_value1, recordn_value2,……recordn_valuesn)

;

可以看出,每条记录之间都用逗号进行了分隔。

下面的例子中,对表dept一次插入两条记录:

mysql> insert into dept values(5,'dept5'),(6,'dept6');

Query OK, 2 rows affected (0.04 sec)

Records: 2 Duplicates: 0 Warnings: 0


mysql> select * from dept;

+--------+----------+

| deptno | deptname |

+--------+----------+

| 1 | tech |

| 2 | sale |

| 5 | fin |

| 5 | dept5 |

| 6 | dept6 |

+--------+----------+

5 rows in set (0.00 sec)

这个特性可以使得MySQL在插入大量记录时,节省很多的网络开销,大大提高插入效率。

2.更新记录

对于表里的记录值,可以通过update命令进行更改,语法如下:

UPDATE tablename SET field1=value1,field2.=value2,……fieldn=valuen [WHERE CONDITION]

例如,将表emp中ename为“lisa”的薪水(sal)从3000更改为4000:

mysql> update emp set sal=4000 where ename='lisa';

Query OK, 1 row affected (0.00 sec)

Rows matched: 1 Changed: 1 Warnings: 0

在MySQL中,update命令可以同时更新多个表中数据,语法如下:

UPDATE t1,t2…tn set t1.field1=expr1,tn.fieldn=exprn [WHERE CONDITION]

在下例中,同时更新表emp中的字段sal和表dept中的字段deptname:

mysql> select * from emp;

+--------+------------+---------+--------+

| ename | hiredate | sal | deptno |

+--------+------------+---------+--------+

| zzx | 2000-01-01 | 100.00 | 1 |

| lisa | 2003-02-01 | 200.00 | 2 |

| bjguan | 2004-04-02 | 100.00 | 1 |

| dony | 2005-02-05 | 2000.00 | 4 |

+--------+------------+---------+--------+

4 rows in set (0.00 sec)


mysql> select * from dept;

+--------+----------+

| deptno | deptname |

+--------+----------+

| 1 | tech |

| 2 | sale |

| 5 | fin |

+--------+----------+

3 rows in set (0.00 sec)


mysql> update emp a,dept b set a.sal=a.sal*b.deptno,b.deptname=a.ename where a.deptno=b.deptno;

Query OK, 3 rows affected (0.04 sec)

Rows matched: 5 Changed: 3 Warnings: 0


mysql> select * from emp;

+--------+------------+---------+--------+

| ename | hiredate | sal | deptno |

+--------+------------+---------+--------+

| zzx | 2000-01-01 | 100.00 | 1 |

| lisa | 2003-02-01 | 400.00 | 2 |

| bjguan | 2004-04-02 | 100.00 | 1 |

| dony | 2005-02-05 | 2000.00 | 4 |

+--------+------------+---------+--------+

4 rows in set (0.01 sec)


mysql> select * from dept;

+--------+----------+

| deptno | deptname |

+--------+----------+

| 1 | zzx |

| 2 | lisa |

| 5 | fin |

+--------+----------+

3 rows in set (0.00 sec)

自此,两个表的数据同时进行了更新。

注意:多表更新的语法更多地用在了根据一个表的字段,来动态的更新另外一个表的字段


3.删除记录

如果记录不再需要,可以用delete命令进行删除,语法如下:

DELETE FROM tablename [WHERE CONDITION]

例如,在emp中将ename为‘dony’的记录全部删除,命令如下:

mysql> delete from emp where ename='dony';

Query OK, 1 row affected (0.00 sec)

在MySQL中可以一次删除多个表的数据,语法如下:

DELETE t1,t2…tn FROM t1,t2…tn [WHERE CONDITION]

如果from后面的表名用别名,则delete后面的也要用相应的别名,否则会提示语法错误。

在下例中,将表emp和dept中deptno为3的记录同时都删除:

mysql> select * from emp;

+--------+------------+---------+--------+

| ename | hiredate | sal | deptno |

+--------+------------+---------+--------+

| zzx | 2000-01-01 | 100.00 | 1 |

| lisa | 2003-02-01 | 200.00 | 2 |

| bjguan | 2004-04-02 | 100.00 | 1 |

| bzshen | 2005-04-01 | 300.00 | 3 |

| dony | 2005-02-05 | 2000.00 | 4 |

+--------+------------+---------+--------+

5 rows in set (0.00 sec)


mysql> select * from dept;

+--------+----------+

| deptno | deptname |

+--------+----------+

| 1 | tech |

| 2 | sale |

| 3 | hr |

| 5 | fin |

+--------+----------+

4 rows in set (0.00 sec)

mysql> delete a,b from emp a,dept b where a.deptno=b.deptno and a.deptno=3;

Query OK, 2 rows affected (0.04 sec)


mysql>

mysql>

mysql> select * from emp;

+--------+------------+---------+--------+

| ename | hiredate | sal | deptno |

+--------+------------+---------+--------+

| zzx | 2000-01-01 | 100.00 | 1 |

| lisa | 2003-02-01 | 200.00 | 2 |

| bjguan | 2004-04-02 | 100.00 | 1 |

| dony | 2005-02-05 | 2000.00 | 4 |

+--------+------------+---------+--------+

4 rows in set (0.00 sec)


mysql> select * from dept;

+--------+----------+

| deptno | deptname |

+--------+----------+

| 1 | tech |

| 2 | sale |

| 5 | fin |

+--------+----------+

3 rows in set (0.00 sec)


注意:不管是单表还是多表,不加where条件将会把表的所有记录删除,所以操作时一定要小心。

4.查询记录

数据插入到数据库中后,就可以用SELECT命令进行各种各样的查询,使得输出的结果符合我们的要求。由于SELECT的语法很复杂,所有这里只介绍最基本的语法:

SELECT * FROM tablename [WHERE CONDITION]

查询最简单的方式是将记录全部选出,在下面的例子中,将表emp中的记录全部查询出来:

mysql> select * from emp;

+--------+------------+---------+--------+

| ename | hiredate | sal | deptno |

+--------+------------+---------+--------+

| zzx | 2000-01-01 | 2000.00 | 1 |

| lisa | 2003-02-01 | 4000.00 | 2 |

| bjguan | 2004-04-02 | 5000.00 | 3 |

+--------+------------+---------+--------+

3 rows in set (0.00 sec)

其中“*”表示要将所有的记录都选出来,也可以用逗号分割的所有字段来代替,例如,以下两个查询是等价的:

mysql> select * from emp;

+--------+------------+---------+--------+

| ename | hiredate | sal | deptno |

+--------+------------+---------+--------+

| zzx | 2000-01-01 | 2000.00 | 1 |

| lisa | 2003-02-01 | 4000.00 | 2 |

| bjguan | 2004-04-02 | 5000.00 | 3 |

+--------+------------+---------+--------+

3 rows in set (0.00 sec)


mysql> select ename,hiredate,sal,deptno from emp;

+--------+------------+---------+--------+

| ename | hiredate | sal | deptno |

+--------+------------+---------+--------+

| zzx | 2000-01-01 | 2000.00 | 1 |

| lisa | 2003-02-01 | 4000.00 | 2 |

| bjguan | 2004-04-02 | 5000.00 | 3 |

+--------+------------+---------+--------+

3 rows in set (0.00 sec)

“*”的好处是当需要查询所有字段信息时候,查询语句很简单,但是要只查询部分字段的时候,必须要将字段一个一个列出来。

上例中已经介绍了查询全部记录的语法,但是在实际应用中,用户还会遇到各种各样的查询要求,下面将分别介绍。

(1)查询不重复的记录。

有时需要将表中的记录去掉重复后显示出来,可以用distinct关键字来实现:

mysql> select ename,hiredate,sal,deptno from emp;

+--------+------------+---------+--------+

| ename | hiredate | sal | deptno |

+--------+------------+---------+--------+

| zzx | 2000-01-01 | 2000.00 | 1 |

| lisa | 2003-02-01 | 4000.00 | 2 |

| bjguan | 2004-04-02 | 5000.00 | 1 |

+--------+------------+---------+--------+

3 rows in set (0.00 sec)


mysql> select distinct deptno from emp;

+--------+

| deptno |

+--------+

| 1 |

| 2 |

+--------+

2 rows in set (0.00 sec)

(2)条件查询。

在很多情况下,用户并不需要查询所有的记录,而只是需要根据限定条件来查询一部分数据,用where关键字可以来实现这样的操作。

例如,需要查询所有deptno为1的记录:

mysql> select * from emp;

+--------+------------+---------+--------+

| ename | hiredate | sal | deptno |

+--------+------------+---------+--------+

| zzx | 2000-01-01 | 2000.00 | 1 |

| lisa | 2003-02-01 | 4000.00 | 2 |

| bjguan | 2004-04-02 | 5000.00 | 1 |

+--------+------------+---------+--------+

3 rows in set (0.00 sec)


mysql> select * from emp where deptno=1;

+--------+------------+---------+--------+

| ename | hiredate | sal | deptno |

+--------+------------+---------+--------+

| zzx | 2000-01-01 | 2000.00 | 1 |

| bjguan | 2004-04-02 | 5000.00 | 1 |

+--------+------------+---------+--------+

2 rows in set (0.00 sec)

结果集中将符合条件的记录列出来。上面的例子中,where后面的条件是一个字段的‘=’比较,除了‘=’外,还可以使用>、<、>=、<=、!=等比较运算符;多个条件之间还可以使用or、and等逻辑运算符进行多条件联合查询,运算符会在以后章节中详细讲解。

以下是一个使用多字段条件查询的例子:

mysql> select * from emp where deptno=1 and sal<3000;

+-------+------------+---------+--------+

| ename | hiredate | sal | deptno |

+-------+------------+---------+--------+

| zzx | 2000-01-01 | 2000.00 | 1 |

+-------+------------+---------+--------+

1 row in set (0.00 sec)


(3)排序和限制。

我们经常会有这样的需求,取出按照某个字段进行排序后的记录结果集,这就用到了数据库的排序操作,用关键字ORDER BY来实现,语法如下:

SELECT * FROM tablename [WHERE CONDITION] [ORDER BY field1 [DESC|ASC],field2 [DESC|ASC],……fieldn [DESC|ASC]]

其中,DESC和ASC是排序顺序关键字,DESC表示按照字段进行降序排列,ASC则表示升序排列,如果不写此关键字默认是升序排列。ORDER BY后面可以跟多个不同的排序字段,并且每个排序字段可以有不同的排序顺序。

例如,把emp表中的记录按照工资高低进行显示:

mysql> select * from emp order by sal;

+--------+------------+---------+--------+

| ename | hiredate | sal | deptno |

+--------+------------+---------+--------+

| zzx | 2000-01-01 | 2000.00 | 1 |

| bzshen | 2005-04-01 | 3000.00 | 3 |

| lisa | 2003-02-01 | 4000.00 | 2 |

| bjguan | 2004-04-02 | 5000.00 | 1 |

+--------+------------+---------+--------+

4 rows in set (0.00 sec)

如果排序字段的值一样,则值相同的字段按照第二个排序字段进行排序,以此类推。如果只有一个排序字段,则这些字段相同的记录将会无序排列。

例如,把emp表中的记录按照部门编号deptno字段排序:

mysql> select * from emp order by deptno;

+--------+------------+---------+--------+

| ename | hiredate | sal | deptno |

+--------+------------+---------+--------+

| zzx | 2000-01-01 | 2000.00 | 1 |

| bjguan | 2004-04-02 | 5000.00 | 1 |

| lisa | 2003-02-01 | 4000.00 | 2 |

| bzshen | 2005-04-01 | 4000.00 | 3 |

+--------+------------+---------+--------+

4 rows in set (0.00 sec)

对于deptno相同的前两条记录,如果要按照工资由高到低排序,可以使用以下命令:

mysql> select * from emp order by deptno,sal desc;

+--------+------------+---------+--------+

| ename | hiredate | sal | deptno |

+--------+------------+---------+--------+

| bjguan | 2004-04-02 | 5000.00 | 1 |

| zzx | 2000-01-01 | 2000.00 | 1 |

| lisa | 2003-02-01 | 4000.00 | 2 |

| bzshen | 2005-04-01 | 4000.00 | 3 |

+--------+------------+---------+--------+

4 rows in set (0.00 sec)


对于排序后的记录,如果希望只显示一部分,而不是全部,这时,就可以使用LIMIT关键字来实现,LIMIT的语法如下:

SELECT ……[LIMIT offset_start,row_count]

其中offset_start表示记录的起始偏移量,row_count表示显示的行数。

在默认情况下,起始偏移量为0,只需要写记录行数就可以,这时候,显示的实际就是前n条记录,看下面例子:

例如,显示emp表中按照sal排序后的前3条记录:

mysql> select * from emp order by sal limit 3;

+--------+------------+---------+--------+

| ename | hiredate | sal | deptno |

+--------+------------+---------+--------+

| zzx | 2000-01-01 | 2000.00 | 1 |

| lisa | 2003-02-01 | 4000.00 | 2 |

| bzshen | 2005-04-01 | 4000.00 | 3 |

+--------+------------+---------+--------+

3 rows in set (0.00 sec)

如果要显示emp表中按照sal排序后从第二条记录开始,显示3条记录:

mysql> select * from emp order by sal limit 1,3;

+--------+------------+---------+--------+

| ename | hiredate | sal | deptno |

+--------+------------+---------+--------+

| lisa | 2003-02-01 | 4000.00 | 2 |

| bzshen | 2005-04-01 | 4000.00 | 3 |

| bjguan | 2004-04-02 | 5000.00 | 1 |

+--------+------------+---------+--------+

3 rows in set (0.00 sec)

limit经常和order by一起配合使用来进行记录的分页显示。

注意:limit属于MySQL扩展SQL92后的语法,在其他数据库上并不能通用。


(4)聚合。

很多情况下,我们需要进行一些汇总操作,比如统计整个公司的人数或者统计每个部门的人数,这个时就要用到SQL的聚合操作。

聚合操作的语法如下:

SELECT [field1,field2,……fieldn] fun_name

FROM tablename

[WHERE where_contition]

[GROUP BY field1,field2,……fieldn

[WITH ROLLUP]]

[HAVING where_contition]

对其参数进行以下说明。

? fun_name表示要做的聚合操作,也就是聚合函数,常用的有sum(求和)、count(*)(记录数)、max(最大值)、min(最小值)。

? GROUP BY关键字表示要进行分类聚合的字段,比如要按照部门分类统计员工数量,部门就应该写在group by后面。

? WITH ROLLUP是可选语法,表明是否对分类聚合后的结果进行再汇总。

? HAVING关键字表示对分类后的结果再进行条件的过滤。


注意:having和where的区别在于having是对聚合后的结果进行条件的过滤,而where是在聚合前就对记录进行过滤,如果逻辑允许,我们尽可能用where先过滤记录,这样因为结果集减小,将对聚合的效率大大提高,最后再根据逻辑看是否用having进行再过滤。

例如,要emp表中统计公司的总人数:

mysql> select count(1) from emp;

+----------+

| count(1) |

+----------+

| 4 |

+----------+

1 row in set (0.00 sec)

在此基础上,要统计各个部门的人数:

mysql> select deptno,count(1) from emp group by deptno;

+--------+----------+

| deptno | count(1) |

+--------+----------+

| 1 | 2 |

| 2 | 1 |

| 4 | 1 |

+--------+----------+

3 rows in set (0.00 sec)

更细一些,既要统计各部门人数,又要统计总人数:

mysql> select deptno,count(1) from emp group by deptno with rollup;

+--------+----------+

| deptno | count(1) |

+--------+----------+

| 1 | 2 |

| 2 | 1 |

| 4 | 1 |

| NULL | 4 |

+--------+----------+

4 rows in set (0.00 sec)

统计人数大于1人的部门:

mysql> select deptno,count(1) from emp group by deptno having count(1)>1;

+--------+----------+

| deptno | count(1) |

+--------+----------+

| 1 | 2 |

+--------+----------+

1 row in set (0.00 sec)

最后统计公司所有员工的薪水总额、最高和最低薪水:

mysql> select * from emp;

+--------+------------+---------+--------+

| ename | hiredate | sal | deptno |

+--------+------------+---------+--------+

| zzx | 2000-01-01 | 100.00 | 1 |

| lisa | 2003-02-01 | 400.00 | 2 |

| bjguan | 2004-04-02 | 100.00 | 1 |

| dony | 2005-02-05 | 2000.00 | 4 |

+--------+------------+---------+--------+

4 rows in set (0.00 sec)


mysql> select sum(sal),max(sal),min(sal) from emp;

+----------+----------+----------+

| sum(sal) | max(sal) | min(sal) |

+----------+----------+----------+

| 2600.00 | 2000.00 | 100.00 |

+----------+----------+----------+

1 row in set (0.00 sec)


(5)表连接。

当需要同时显示多个表中的字段时,就可以用表连接来实现这样的功能。

从大类上分,表连接分为内连接和外连接,它们之间的最主要区别是內连接仅选出两张表中互相匹配的记录,而外连接会选出其他不匹配的记录。我们最常用的是内连接。

例如,查询出所有雇员的名字和所在部门名称,因为雇员名称和部门分别存放在表emp和dept中,因此,需要使用表连接来进行查询:

mysql> select * from emp;

+--------+------------+---------+--------+

| ename | hiredate | sal | deptno |

+--------+------------+---------+--------+

| zzx | 2000-01-01 | 2000.00 | 1 |

| lisa | 2003-02-01 | 4000.00 | 2 |

| bjguan | 2004-04-02 | 5000.00 | 1 |

| bzshen | 2005-04-01 | 4000.00 | 3 |

+--------+------------+---------+--------+

4 rows in set (0.00 sec)


mysql> select * from dept;

+--------+----------+

| deptno | deptname |

+--------+----------+

| 1 | tech |

| 2 | sale |

| 3 | hr |

+--------+----------+

3 rows in set (0.00 sec)


mysql> select ename,deptname from emp,dept where emp.deptno=dept.deptno;

+--------+----------+

| ename | deptname |

+--------+----------+

| zzx | tech |

| lisa | sale |

| bjguan | tech |

| bzshen | hr |

+--------+----------+

4 rows in set (0.00 sec)


外连接有分为左连接和右连接,具体定义如下。

· 左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录

· 右连接:包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录

例如,查询emp中所有用户名和所在部门名称:

mysql> select * from emp;

+--------+------------+---------+--------+

| ename | hiredate | sal | deptno |

+--------+------------+---------+--------+

| zzx | 2000-01-01 | 2000.00 | 1 |

| lisa | 2003-02-01 | 4000.00 | 2 |

| bjguan | 2004-04-02 | 5000.00 | 1 |

| bzshen | 2005-04-01 | 4000.00 | 3 |

| dony | 2005-02-05 | 2000.00 | 4 |

+--------+------------+---------+--------+

5 rows in set (0.00 sec)

mysql> select * from dept;

+--------+----------+

| deptno | deptname |

+--------+----------+

| 1 | tech |

| 2 | sale |

| 3 | hr |

+--------+----------+

3 rows in set (0.00 sec)

mysql> select ename,deptname from emp left join dept on emp.deptno=dept.deptno;

+--------+----------+

| ename | deptname |

+--------+----------+

| zzx | tech |

| lisa | sale |

| bjguan | tech |

| bzshen | hr |

| dony | |

+--------+----------+

5 rows in set (0.00 sec)

比较这个查询和上例中的查询,都是查询用户名和部门名,两者的区别在于本例中列出了所有的用户名,即使有的用户名(dony)并不存在合法的部门名称(部门号为4,在dept中没有这个部门);而上例中仅仅列出了存在合法部门的用户名和部门名称。

右连接和左连接类似,两者之间可以互相转化,例如,上面的例子可以改写为如下的右连接:

mysql> select ename,deptname from dept right join emp on dept.deptno=emp.deptno;

+--------+----------+

| ename | deptname |

+--------+----------+

| zzx | tech |

| lisa | sale |

| bjguan | tech |

| bzshen | hr |

| dony | |

+--------+----------+

5 rows in set (0.00 sec)


(6)子查询。

某些情况下,当我们查询的时候,需要的条件是另外一个select语句的结果,这个时候,就要用到子查询。用于子查询的关键字主要包括in、not in、=、!=、exists、not exists等。

例如,从emp表中查询出所有部门在dept表中的所有记录:

mysql> select * from emp;

+--------+------------+---------+--------+

| ename | hiredate | sal | deptno |

+--------+------------+---------+--------+

| zzx | 2000-01-01 | 2000.00 | 1 |

| lisa | 2003-02-01 | 4000.00 | 2 |

| bjguan | 2004-04-02 | 5000.00 | 1 |

| bzshen | 2005-04-01 | 4000.00 | 3 |

| dony | 2005-02-05 | 2000.00 | 4 |

+--------+------------+---------+--------+

5 rows in set (0.00 sec)


mysql> select * from dept;

+--------+----------+

| deptno | deptname |

+--------+----------+

| 1 | tech |

| 2 | sale |

| 3 | hr |

| 5 | fin |

+--------+----------+

4 rows in set (0.00 sec)


mysql> select * from emp where deptno in(select deptno from dept);

+--------+------------+---------+--------+

| ename | hiredate | sal | deptno |

+--------+------------+---------+--------+

| zzx | 2000-01-01 | 2000.00 | 1 |

| lisa | 2003-02-01 | 4000.00 | 2 |

| bjguan | 2004-04-02 | 5000.00 | 1 |

| bzshen | 2005-04-01 | 4000.00 | 3 |

+--------+------------+---------+--------+

4 rows in set (0.00 sec)

如果子查询记录数唯一,还可以用=代替in:

mysql> select * from emp where deptno = (select deptno from dept);

ERROR 1242 (21000): Subquery returns more than 1 row

mysql> select * from emp where deptno = (select deptno from dept limit 1);

+--------+------------+---------+--------+

| ename | hiredate | sal | deptno |

+--------+------------+---------+--------+

| zzx | 2000-01-01 | 2000.00 | 1 |

| bjguan | 2004-04-02 | 5000.00 | 1 |

+--------+------------+---------+--------+

2 rows in set (0.00 sec)

某些情况下,子查询可以转化为表连接,例如:

mysql> select * from emp where deptno in(select deptno from dept);

+--------+------------+---------+--------+

| ename | hiredate | sal | deptno |

+--------+------------+---------+--------+

| zzx | 2000-01-01 | 2000.00 | 1 |

| lisa | 2003-02-01 | 4000.00 | 2 |

| bjguan | 2004-04-02 | 5000.00 | 1 |

| bzshen | 2005-04-01 | 4000.00 | 3 |

+--------+------------+---------+--------+

4 rows in set (0.00 sec)

转换为表连接后:

mysql> select emp.* from emp ,dept where emp.deptno=dept.deptno;

+--------+------------+---------+--------+

| ename | hiredate | sal | deptno |

+--------+------------+---------+--------+

| zzx | 2000-01-01 | 2000.00 | 1 |

| lisa | 2003-02-01 | 4000.00 | 2 |

| bjguan | 2004-04-02 | 5000.00 | 1 |

| bzshen | 2005-04-01 | 4000.00 | 3 |

+--------+------------+---------+--------+

4 rows in set (0.00 sec)


注意:子查询和表连接之间的转换主要应用在两个方面:

l MySQL 4.1以前的版本不支持子查询,需要用表连接来实现子查询的功能

l 表连接在很多情况下用于优化子查询

(7)记录联合。

我们经常会碰到这样的应用,将两个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示出来,这个时候,就需要用union和union all关键字来实现这样的功能,具体语法如下:

SELECT * FROM t1

UNION|UNION ALL

SELECT * FROM t2

……

UNION|UNION ALL

SELECT * FROM tn;

UNION和UNION ALL的主要区别是UNION ALL是把结果集直接合并在一起,而UNION是将UNION ALL后的结果进行一次DISTINCT,去除重复记录后的结果。

来看下面例子,将emp和dept表中的部门编号的集合显示出来:

mysql> select * from emp;

+--------+------------+---------+--------+

| ename | hiredate | sal | deptno |

+--------+------------+---------+--------+

| zzx | 2000-01-01 | 100.00 | 1 |

| lisa | 2003-02-01 | 400.00 | 2 |

| bjguan | 2004-04-02 | 100.00 | 1 |

| dony | 2005-02-05 | 2000.00 | 4 |

+--------+------------+---------+--------+

4 rows in set (0.00 sec)

mysql> select * from dept;

+--------+----------+

| deptno | deptname |

+--------+----------+

| 1 | tech |

| 2 | sale |

| 5 | fin |

+--------+----------+

3 rows in set (0.00 sec)

mysql> select deptno from emp

-> union all

-> select deptno from dept;

+--------+

| deptno |

+--------+

| 1 |

| 2 |

| 1 |

| 4 |

| 1 |

| 2 |

| 5 |

+--------+

7 rows in set (0.00 sec)

如果希望将结果去掉重复记录后显示:

mysql> select deptno from emp

-> union

-> select deptno from dept;

+--------+

| deptno |

+--------+

| 1 |

| 2 |

| 4 |

| 5 |

+--------+

4 rows in set (0.00 sec)

2.2.4 DCL语句

DCL语句主要是DBA用来管理系统中的对象权限时所使用,一般的开发人员很少使用。下面通过一个例子来简单说明一下。

创建一个数据库用户z1,具有对sakila数据库中所有表的SELECT/INSERT权限:

mysql> grant select,insert on sakila.* to 'z1'@'localhost' identified by '123';

Query OK, 0 rows affected (0.00 sec)


mysql> exit

Bye

[mysql@db3 ~]$ mysql -uz1 -p123

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 21671 to server version: 5.1.9-beta-log


Type 'help;' or '\h' for help. Type '\c' to clear the buffer.


mysql> use sakila

Database changed

mysql> insert into emp values('bzshen','2005-04-01',3000,'3');

Query OK, 1 row affected (0.04 sec)

由于权限变更,需要将z1的权限变更,收回INSERT,只能对数据进行SELECT操作:

[mysql@db3 ~]$ mysql -uroot

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 21757 to server version: 5.1.9-beta-log


Type 'help;' or '\h' for help. Type '\c' to clear the buffer.


mysql> revoke insert on sakila.* from 'z1'@'localhost';

Query OK, 0 rows affected (0.00 sec)


mysql> exit

Bye

用户z1重新登录后执行前面语句:

[mysql@db3 ~]$ mysql -uz1 -p123

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 21763 to server version: 5.1.9-beta-log


Type 'help;' or '\h' for help. Type '\c' to clear the buffer.


mysql> insert into emp values('bzshen','2005-04-01',3000,'3');

ERROR 1046 (3D000): No database selected

mysql> use sakila

Database changed

mysql> insert into emp values('bzshen','2005-04-01',3000,'3');

ERROR 1142 (42000): INSERT command denied to user 'z1'@'localhost' for table 'emp'


以上例子中的grant和revoke分别授出和收回了用户z1的部分权限,达到了我们的目的。关于权限的更多内容,将会在第4篇中详细介绍。

2.3 帮助的使用

在MySQL使用过程中,可能经常会遇到以下问题:

l 某个操作语法忘记了,需要快速查找。

l 当前版本上,某个字段类型我们想快速知道它的取值范围?

l 当前版本上,都支持哪些函数?希望有例子能快速入门。

l 当前版本上,是否支持某个功能?


对于上面列出的各种问题,我们可能想到的办法是查找MySQL的文档。不错,这些问题在MySQL官方文档中都可以很清楚地查到,但是却要耗费大量的时间和精力。

所以对于以上问题,最好的解决办法是使用MySQL安装后自带的帮助文档,这样在遇到问题时就可以方便快捷地进行查询。

2.3.1 按照层次看帮助

如果不知道帮助能够提供些什么,可以用“?contents”命令来显示所有可供查询的的分类,如下例所示:

mysql> ? contents

You asked for help about help category: "Contents"

For more information, type 'help <item>', where <item> is one of the following

categories:

Account Management

Administration

Data Definition

Data Manipulation

Data Types

Functions

Functions and Modifiers for Use with GROUP BY

Geographic Features

Language Structure

Plugins

Storage Engines

Stored Routines

Table Maintenance

Transactions

Triggers

对于列出的分类,可以使用“? 类别名称”的方式针对用户感兴趣的内容做进一步的查看。例如,想看看MySQL中都支持哪些数据类型,可以执行“? data types”命令:

mysql> ? data types

You asked for help about help category: "Data Types"

For more information, type 'help <item>', where <item> is one of the following

topics:

AUTO_INCREMENT

BIGINT

BINARY

BIT

BLOB

BLOB DATA TYPE

BOOLEAN

。。。。。。

上面列出了此版本支持的所有数据类型,如果想知道int类型的具体介绍,也可以利用上面的方法,做进一步的查看:

mysql> ? int

Name: 'INT'

Description:

INT[(M)] [UNSIGNED] [ZEROFILL]


A normal-size integer. The signed range is -2147483648 to 2147483647.

The unsigned range is 0 to 4294967295.

帮助文档中显示了int类型的详细描述。通过这种“? 类别名称”的方式,就可以一层层地往下查找用户所关心的主题内容。

2.3.2 快速查阅帮助

在实际应用当中,如果需要快速查阅某项语法时,可以使用关键字进行快速查询。例如,想知道show命令都能看些什么东西,可以用如下命令:

mysql> ? show

Name: 'SHOW'

Description:

SHOW has many forms that provide information about databases, tables,

columns, or status information about the server. This section describes

those following:


SHOW AUTHORS

SHOW CHARACTER SET [LIKE 'pattern']

SHOW COLLATION [LIKE 'pattern']

SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [LIKE 'pattern']

SHOW CONTRIBUTORS

SHOW CREATE DATABASE db_name

SHOW CREATE EVENT event_name

SHOW CREATE FUNCTION funcname

。。。。。。

例如,如果想参看CREATE TABLE的语法,可以使用以下命令:

mysql> ? create table

Name: 'CREATE TABLE'

Description:

Syntax:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name

(create_definition,...)

[table_option ...]

[partition_options]


Or:


CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name

[(create_definition,...)]

[table_option ...]

[partition_options]

select_statement

、 。。。。。。

2.3.3 常用的网络资源

http://dev.mysql.com/downloads/是MySQL的官方网站,可以下载到各个版本的MySQL以及相关客户端开发工具等。

http://dev.mysql.com/doc/提供了目前最权威的MySQL数据库及工具的在线手册。

http://bugs.mysql.com/这里可以查看到MySQL已经发布的bug列表,或者向MySQL提交bug报告。

http://www.mysql.com/news-and-events/newsletter/通常会发布各种关于MySQL的最新消息。

2.4 小结

本章简单地介绍了SQL语句的基本分类DML/DDL/DCL,并对每一种分类下的常用SQL的用法进行了举例说明。MySQL在标准SQL的基础上进行了很多扩展,本章对常用的一些语法做了简单介绍,更详细的说明,读者可以参考MySQL的帮助或者官方文档。在本章的最后,还介绍了用户应如何使用MySQL中的帮助文档,以便快速查找各种语法定义。

喜欢小编分享的知识,请留下点赞及关注,激励小编持续更新!

涉嫌侵权请联系小编下架。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码