抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

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 标准(这两个机构的很多标准是差不多等同的)制定自己的国 家标准。

image-20220602182802042

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语句不区分大小写,关键字建议使用大写
    • 例如:SELECT * FROM user。
  • 常用注释形式
1
2
3
-- 单行注释内容
/* 多行注释 */
# 单行注释内容

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 字符集; -- 字符集 如 UTF-8
-- 【案例】
-- 1. 创建一个叫 hello 的数据库
create database hello;
-- 2. 判读如果不存在则创建
create database if not exists hello;
-- 3. 创建数据库并指定字符集
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 表名(
-- 可以定义多个列
字段名 类型(长度) 约束,
字段名 类型(长度) 约束
);
-- 【案例】
-- 创建用户表
create table t_user (
uid int primary key auto_increment, -- 用户 id
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

注意

1
主键约束 = 唯一约束 + 非空约束

2) 查看表

1
2
3
4
5
6
7
8
查看数据库中的所有表:show tables;
查看表结构:desc 表名;
查看创建表的 SQL 语句:show create table 表名;
-- 【案例】
use hello; -- 使用 hello 数据库
show tables; -- 查看所有表
desc user; -- 查看 user 表的结构
show create table user; -- 查看 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
-- 1.修改表添加列
alter table 表名 add 列名 类型(长度) 约束;
-- 2.修改表修改列的类型长度及约束
alter table 表名 modify 列名 类型(长度) 约束;
-- 3.修改表修改列名
alter table 表名 change 旧列名 新列名 类型(长度) 约束;
-- 4.修改表删除列
alter table 表名 drop 列名;
-- 5.修改表名
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
-- 1.向表中插入某些列
insert into 表 (列名1,列名2,列名3..) values (值1,值2,值3..);
-- 2.向表中插入所有列
insert intovalues (值1,值2,值3..);
-- 3.从另外一张表查某些列的结果插入当前表
insert into 表 (列名1, 列名2, 列名3..) values select (列名1,列名2,列名3..) from

-- 4.从另外一张表查所有列的结果插入当前表
insert intovalues 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 字段名=值, 字段名=值;
-- 2.指定条件,符合条件的才会修改
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;
-- 删除 uid 为 1 的用户
delete from user where uid = 1;
1
truncate table 表名;

注意

删除表中所有记录使用【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 (
-- 自增加 AUTO_INCREMENT
pid INT PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20), -- 商品名称
price DOUBLE, -- 商品价格
pdate DATE, -- 日期
sid VARCHAR(20) -- 分类ID
);
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;
-- 别名查询,使用的 as 关键字,as 也可以省略的
-- 使用别名的好处:显示的时候使用识别性更强的名字,本身也不会去影响到表结构
-- 表别名
-- select 字段名 as 字段别名 from 表名
select * from product as p;
-- 列别名
-- select 列名 as 列别名 from 表名
select pname as pn from product;
-- 列和表,同时指定别名
-- select 列名 as 列别名 from 表名 as 表别名
-- 去掉重复值
-- select distinct 字段名 from 表名
select distinct pname from product;
--查询结果是表达式(运算查询):将所有商品的价格 +10 元进行显示
-- select 列名+固定值 from 表名
-- select 列名1 + 列名2 from 表名
select pname, price + 10 from product;

条件查询

使用条件查询,可以根据当下具体情况直查想要的那部分数据,对记录进行过滤。

SQL 语法关键字: WHERE

语法格式:

1
select 字段名 from 表名 where 条件;

运算符

image-20220603160155125

1
2
3
4
5
6
7
8
-- 查询商品名称为十三香的商品所有信息
select * from product where pname = '十三香';
-- 查询商品价格 >60 元的所有的商品信息
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
-- in 匹配某些值中
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 关键字

  • 模糊查询: 作用是帮助匹配模糊的字段内容

  • 语法:where之后加上like 语法,%百分号,_下划线

  • % 代表任意长短内容模糊匹配:

    • [%xxx]以xxx结尾的任意内容。
    • [xxx%]以xxx开头的任意内容
    • [%xxx%]包含xxx的任意内容
  • _代表任意一个字符的内容模糊匹配

    • [_xxx]以任意单个字符开头的xxx内容。
    • [xxx__x]
1
2
3
4
5
-- 使用 like 实现模糊查询
-- “新”开头
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 BYHAVING

select 字段1, 字段2... from 表名 group by 分组字段 [having 条件];
1
2
3
4
5
-- 根据 cno 字段分组,分组后统计商品的个数
select sid, count(*) from product group by sid;

-- 根据 cno 分组,分组统计每组商品的平均价格,并且平均价格 > 60;
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
首先,执行的顺序是有先有后。

1) where

1
2
对查询结果进行分组前,将不符合 where 条件的记录过滤掉,然后再分组。
where 后面,不能再使用聚合函数。

2)having

1
2
筛选满足条件的组,分组之后过滤数据。
having 后面,可以使用聚合函数。

分页查询

  • 功能: 将查询的结果按照一页一页的形式输出

语法

1
2
3
4
5
-- 语法
selectfrom 表 limit offset, length

-- 案例 0 偏移量
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
-- 如果省略第一个参数,默认从 0 开始
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 分页

评论