SQL概述
SQL语句介绍
结构化查询语言(Structured Query Language)简称SQL,是关系型数据库管理系统都需要遵循的规范。 不同的数据库生产厂商都支持SQL语句,但都有特有内容。
扩展:SQL作为一种访问【关系型数据库的标准语言】,SQL 自问世以来得到了广泛的应用,不仅 是著名的大型商用数据库产品 Oracle、DB2、Sybase、SQL Server 支持它,很多开源的数据库产 品如 PostgreSQL、MySQL也支持它,甚至一些小型的产品如 Access 也支持 SQL。近些年蓬勃发 展的 NoSQL 系统最初是宣称不再需要 SQL 的,后来也不得不修正为 Not Only SQL,来拥抱 SQL。 蓝色巨人 IBM 对关系数据库以及 SQL 语言的形成和规范化产生了重大的影响,第一个版本的 SQL 标准 SQL86 就是基于 System R 的手册而来的。 Oracle 在 1979 年率先推出了支持 SQL 的商用产品。随着数据库技术和应用的发展,为不同 RDBMS提供一致的语言成了一种现实需要。 对 SQL 标准影响最大的机构自然是那些著名的数据库产商,而具体的制订者则是一些非营利机 构,例如【国际标准化组织 ISO、美国国家标准委员会 ANSI】等。 各国通常会按照 ISO 标准和 ANSI 标准(这两个机构的很多标准是差不多等同的)制定自己的国 家标准。

SQL作用
- 在数据库中检索信息。
- 对数据库的信息进行更新。
- 改变数据库的结构。
- 更改系统的安全设置。
- 增加或回收用户对数据库、表的许可权限。
SQL语句分类
- 数据定义语言:简称DDL(Data Definition Language)
- 作用:用来定义数据库对象:数据库,表,列等。
- 关键字:create,alter,drop等
- 数据操作语言:简称DML(Data Manipulation Language),
- 作用:用来对数据库中表的记录进行更新。
- 关键字:insert,delete,update等
- 数据查询语言:简称DQL(Data Query Language),
- 作用:用来查询数据库中表的记录。
- 关键字:select,from,where等
- 数据控制语言:简称DCL(Data Control Language),
- 作用:用来定义数据库的访问权限和安全级别,及创建用户。
SQL通用语法
- SQL语句可以单行或多行书写,以分号结尾
- 可使用空格和缩进来增强语句的可读性
- MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
- 常用注释形式
MySQL中的我们常使用的数据类型如下
类型名称 |
说明 |
int(integer) |
整数类型 |
double |
小数类型 |
decimal (m,d) |
指定整数位与小数位长度的小数类型 decimal(10,2) |
date |
日期类型,格式为yyyy-MM-dd,包含年月日,不包含时分秒 2019-05-06 |
datetime |
日期类型,格式为 YYYY-MM-DD HH:MM:SS,包含年月日时分秒 2019-05-06 09:49:30 |
timestamp |
日期类型,时间戳 |
varchar(M) |
文本类型, M为0~65535之间的整数 |
DDL之数据库操作:database
创建、查看、删除、修改…
1) 创建数据库
1 2 3 4 5 6 7 8 9
| create database 数据库名; create database 数据库名 character set 字符集;
create database hello;
create database if not exists hello;
create database hello default character set gbk;
|
2)查看数据库
1 2 3 4 5 6 7
| 查看数据库服务器中的所有的数据库:show databases; 查看某个数据库的定义的信息:show create database 数据库名;
show databases;
show create database hello;
|
3)删除数据库(慎用)
1 2 3
| drop database 数据库名称;
drop database hello;
|
4)修改数据库
1 2 3 4
| 修改数据库默认的字符集: alter database 数据库名 default character set 字符集
alter database hello3 character set utf8;
|
5)其他数据库操作命令
1 2
| 切换数据库: use 数据库名; 查看正在使用的数据库:select database();
|
DDL之表操作:table
- 创建数据库表
- 查看表
- 快速创建:克隆
- 删除表
- 修改表结构:如果表内有数据,修改需要谨慎
1) 创建表
建立数据表,就是建立表结构,指定数据表中的一共有多少列,每一列的数据类型
1 2 3 4 5 6 7 8 9 10 11 12 13
|
create table 表名(
字段名 类型(长度) 约束, 字段名 类型(长度) 约束 );
create table t_user ( uid int primary key auto_increment, uname varchar(20) );
|
字段类型
常用的类型有:
- 数字型:int、integer、bigint、mediumint、smallint、tinyint
- 浮点型:double、float、decimal(精确小数类型)
- 字符型:char(定长字符串)、varchar(可变长字符串)
- 日期类型:date(只有年月日)、time(只有时分秒)、datetime(年月日,时分秒)、year
(年)
- 二进制字符串类型:binary(定长,以二进制形式保存字符串)、varbinary(可边长)
单表约束
1 2 3
| 主键约束:primary key 唯一约束:unique 非空约束:not null
|
注意
2) 查看表
1 2 3 4 5 6 7 8
| 查看数据库中的所有表:show tables; 查看表结构:desc 表名; 查看创建表的 SQL 语句:show create table 表名;
use hello; show tables; desc user; show create table user;
|
3)快速创建一个表结构相同的表
1 2 3 4
| create table 新的表名 like 旧的表名;
create table tb_user like user; desc tb_user;
|
4)删除表
1 2 3 4 5
| drop table 表名; drop table if exists 表名;
drop table user;
|
5)修改表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| alter table 表名 add 列名 类型(长度) 约束;
alter table 表名 modify 列名 类型(长度) 约束;
alter table 表名 change 旧列名 新列名 类型(长度) 约束;
alter table 表名 drop 列名;
rename table 表名 to 新表名;
alter table user add address varchar(50);
alter table user modify address int(30);
alter table user change address addr varchar(50);
alter table user drop addr;
rename table user to tb_user;
|
DML数据操作语言
1)插入记录:insert
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| insert into 表 (列名1,列名2,列名3..) values (值1,值2,值3..);
insert into 表 values (值1,值2,值3..);
insert into 表 (列名1, 列名2, 列名3..) values select (列名1,列名2,列名3..) from 表
insert into 表 values select * from 表
insert into user (uid, uname) values (001, 'cuihua');
insert into user values (002, 'aqiang');
|
5个注意事项:
- ① 列名数与 values 后面的值的个数相等
- ② 列的顺序与插入的值得顺序一致
- ③ 列名的类型与插入的值要一致.
- ④ 插入值得时候不能超过最大长度.
- ⑤ 值如果是字符串或者日期需要加引号’’ (一般是单引号)
2)更新记录:update
语法格式:update 更新、set 修改的列值、where 指定条件。
1 2 3 4 5 6 7 8 9
| - 1.不指定条件,会修改表中当前列所有数据 update 表名 set 字段名=值, 字段名=值;
update 表名 set 字段名=值, 字段名=值 where 条件;
update user set uname='xiaodong';
update user set uname='hashiqi' where uid = 2;
|
注意:
- ① 列名的类型与修改的值要一致
- ② 修改值得时候不能超过最大长度
- ③ 值如果是字符串或者日期需要加 ’ ’ 引号
3)删除记录:delete & truncate
语法格式:
1 2 3 4 5 6
| delete from 表名 [where 条件];
delete from user;
delete from user where uid = 1;
|
注意
删除表中所有记录使用【delete from 表名】,还是用【truncate table 表名】?
删除方式的区别:
1 2
| delete :一条一条删除,不清空 auto_increment 记录数。 truncate :直接将表删除,重新建表,auto_increment 将置为零,从新开始
|
SQL约束
约束类型:
- 主键约束 primary key
- 唯一性约束 unique
- 非空约束 not null
- 外键约束 foreign key
主键约束
PRIMARY KEY 约束唯一标识数据库表中的每条记录。
特点:
- 主键必须包含唯一的值。
- 主键列不能包含 NULL 值。
- 每个表都应该有一个主键,并且每个表只能有一个主键。
添加主键约束
- 方式一:创建表时,在字段描述处,声明指定字段为主键:
1 2 3 4 5 6 7
| CREATE TABLE persons( id_p int PRIMARY KEY, lastname varchar(255), firstname varchar(255), address varchar(255), city varchar(255) );
|
- 方式二:创建表时,在constraint约束区域,声明指定字段为主键:
- 格式: [constraint 名称] primary key (字段列表)
- 关键字constraint可以省略,如果需要为主键命名,constraint不能省略,主键名称一般没 用。
- 字段列表需要使用小括号括住,如果有多字段需要使用逗号分隔。声明两个以上字段为主键, 我们称为联合主键。
1 2 3 4 5 6 7
| CREATE TABLE persons_cons( firstname varchar(255), lastname varchar(255), address varchar(255), city varchar(255), CONSTRAINT pk_personID PRIMARY KEY (firstname,lastname) );
|
- 方式三:创建表之后,通过修改表结构,声明指定字段为主键:
- 格式: ALTER TABLE persons ADD [CONSTRAINT 名称] PRIMARY KEY (字段列表)
1 2 3 4 5 6 7
| CREATE TABLE persons_after( firstname varchar(255), lastname varchar(255), address varchar(255), city varchar(255) ); ALTER TABLE persons_after ADD PRIMARY KEY (firstname,lastname);
|
删除主键约束
如需撤销 PRIMARY KEY 约束,请使用下面的 SQL:
1
| ALTER TABLE persons DROP PRIMARY KEY
|
自动增长列
我们通常希望在每次插入新记录时,数据库自动生成字段的值。
我们可以在表中使用 auto_increment(自动增长列)关键字,自动增长列类型必须是整形,自动增长列 必须为键(一般是主键)。
- 下列 SQL 语句把 “persons” 表中的 “p_id” 列定义为 auto_increment 主键
1 2 3 4 5 6 7
| CREATE TABLE persons_id( p_id int PRIMARY KEY AUTO_INCREMENT, lastname varchar(255), firstname varchar(255), address varchar(255), city varchar(255) );
|
- 向persons添加数据时,可以不为p_id字段设置值,也可以设置成null,数据库将自动维护主键 值:
1 2 3
| INSERT INTO persons_id (firstname,lastname) VALUES ('Bill','Gates'); INSERT INTO persons_id (p_id,firstname,lastname) VALUES (NULL,'Bill','Gates');
|
- 默认AUTO_INCREMENT 的开始值是 1,如果希望修改起始值,请使用下列 SQL 语法:
1
| ALTER TABLE persons AUTO_INCREMENT=100
|
非空约束
NOT NULL 约束强制列不接受 NULL 值。 NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记 录。
- 下面的 SQL 语句强制 “id_p” 列和 “lastname” 列不接受 NULL 值:
1 2 3 4 5 6 7 8
| CREATE TABLE persons_null( id_p int NOT NULL, lastname varchar(255) NOT NULL, firstname varchar(255), address varchar(255), city varchar(255) );
|
唯一约束
- UNIQUE 约束唯一标识数据库表中的每条记录。
- UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
- PRIMARY KEY 拥有自动定义的 UNIQUE 约束。
注意:每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
添加唯一约束
与主键添加方式相同,共有3种
1 2 3 4 5 6 7
| CREATE TABLE persons_unique( id_p int UNIQUE, lastname varchar(255) NOT NULL, firstname varchar(255), address varchar(255), city varchar(255) )
|
1 2 3 4 5 6 7 8
| CREATE TABLE persons( id_p int, lastname varchar(255) NOT NULL, firstname varchar(255), address varchar(255), city varchar(255), CONSTRAINT unique_id_p UNIQUE (Id_P) )
|
1
| ALTER TABLE persons ADD [CONSTRAINT 名称] UNIQUE (Id_P)
|
删除唯一约束
- 如需撤销 UNIQUE 约束,请使用下面的 SQL:
1
| ALTER TABLE persons DROP INDEX 名称
|
- 如果添加唯一约束时,没有设置约束名称,默认是当前字段的字段名。
SQL语句之DQL【重要、重要、重要】
语法:查询不会对数据库中的数据进行修改,根据指定的方式来呈现数据。
语法格式:
1
| select * | 列名,列名 from 表名 [where 条件表达式]
|
- select 是查询指令,可以读 1 ~ n 行数据;
- 列名换成 * 号,可以查询所有字段数据;
- 使用 where 来指定对应的条件
准备工作
创建商品表
1 2 3 4 5 6 7 8 9 10 11 12 13
| CREATE TABLE products (
pid INT PRIMARY KEY AUTO_INCREMENT, pname VARCHAR(20), price DOUBLE, pdate DATE, sid VARCHAR(20) ); INSERT INTO products VALUES(NULL,'泰国大榴莲', 98, NULL, 's001'); INSERT INTO products VALUES(NULL,'新疆大枣', 38, NULL, 's002'); INSERT INTO products VALUES(NULL,'新疆切糕', 68, NULL, 's001'); INSERT INTO products VALUES(NULL,'十三香', 10, NULL, 's002'); INSERT INTO products VALUES(NULL,'老干妈', 20, NULL, 's002');
|
简单查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| select * from product;
select pname,price from product;
select * from product as p;
select pname as pn from product;
select distinct pname from product;
select pname, price + 10 from product;
|
条件查询
使用条件查询,可以根据当下具体情况直查想要的那部分数据,对记录进行过滤。
SQL 语法关键字: WHERE
语法格式:
1
| select 字段名 from 表名 where 条件;
|
运算符

1 2 3 4 5 6 7 8
| select * from product where pname = '十三香';
select * from product where price > 60; select * from product where price <= 60;
select * from product where price != 60; select * from product where price <> 60;
|
逻辑运算符
NOT |
逻辑非【**!】 |
AND |
逻辑与【&&】 |
OR |
逻辑或【||】 |
1 2 3
| select * from product where price > 40 and pid > 3;
select * from product where price > 40 or pid > 3;
|
in 关键字
1 2 3 4
| select * from product where pid in (2,5,8);
select * from product where pid not in (2,5,8);
|
指定范围中 between…and
1
| select * from product where pid between 2 and 10;
|
模糊查询 like 关键字
1 2 3 4 5
|
select * from product where pname like '新%';
select * from product where pname like '%新%';
|
排序
语法:
1 2 3 4
| select 字段名 from 表名 where 字段 = 值 order by 字段名 [asc | desc]
asc 升序 desc 降序
|
1 2 3 4 5
| select * from product order by price;
select * from product where pname like '%新%' order by price desc;
|
聚合函数(组函数)
1 2 3 4 5 6 7 8 9 10 11 12 13
| 特点:只对单列进行操作 常用的聚合函数: sum():求某一列的和 avg():求某一列的平均值 max():求某一列的最大值 min():求某一列的最小值 count():求某一列的元素个数
select sum(price) from product;
select avg(price) from product;
select count(*) from product;
|
分组查询
分组查询:作用是将查询结果按照某列数据来进行分组呈现
语法格式:
1 2 3
| SQL 语法关键字:GROUP BY、HAVING
select 字段1, 字段2... from 表名 group by 分组字段 [having 条件];
|
1 2 3 4 5
| select sid, count(*) from product group by sid;
select sid, avg(price) from product group by sid having avg(price) > 60;
|
注意事项:
① select 语句中的列(非聚合函数列),必须出现在 group by 子句中
② group by 子句中的列,不一定要出现在 select 语句中
③ 聚合函数只能出现 select 语句中或者 having 语句中,一定不能出现在 where 语句中。
having 和 where 的区别:
1) where
1 2
| 对查询结果进行分组前,将不符合 where 条件的记录过滤掉,然后再分组。 where 后面,不能再使用聚合函数。
|
2)having
1 2
| 筛选满足条件的组,分组之后过滤数据。 having 后面,可以使用聚合函数。
|
分页查询
语法
1 2 3 4 5
| select 列 from 表 limit offset, length
select * from products limit 0, 3;
|
关键字:limit [offset,] rows 语法格式:
1 2 3 4 5 6 7 8 9
| select * | 字段列表 [as 别名] from 表名 [where] 条件语句 [group by] 分组语句 [having] 过滤语句 [order by] 排序语句 [limit] 分页语句; limit offset, length; offset:开始行数,从 0 开始 length:每页显示的行数
|
limit 关键字不是 SQL92 标准提出的关键字,它是 MySQL 独有的语法。
通过 limit 关键字,MySQL 实现了物理分页。
分页分为逻辑分页和物理分页:
逻辑分页:将数据库中的数据查询到内存之后再进行分页。
物理分页:通过 LIMIT 关键字,直接在数据库中进行分页,最终返回的数据,只是分页后的数据。
1 2 3
| select * from product limit 5; select * from product limit 3, 5;
|
查询分类
- 条件查询 where
- 分组查询group by
- having针对分组结果过滤
- 排序order by
- 分页 limit
查询语句顺序:
- select 列 from 表 where 条件 group by 分组 having 过滤 order by 排序 limit 分页