4 单表操作

1. SQL

1.1 SQL

java 复制代码
1.Structured Query Language:结构化查询语言
2.定义了操作所有关系型数据库的规则,每种数据库操作的方式可能会存在不一样的地方,称为"方言"

1.2 SQL 通用语法

java 复制代码
1.SQL 语句可以单行或多行书写,以分号结尾
2.可使用空格和缩进来增强语句的可读性
3.MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写
4.数据库的注释:
	单行注释:-- 注释内容 
	多行注释:/* 注释内容 */

1.3 SQL 分类

java 复制代码
1.DDL(Data Definition Language)数据定义语言
  用来定义数据库对象:数据库,表,列等。关键字:create、drop,、alter 等
2.DML(Data Manipulation Language)数据操作语言
  用来对数据库中表的数据进行增删改。关键字:insert、delete、update 等
3.DQL(Data Query Language)数据查询语言
  用来查询数据库中表的记录(数据)。关键字:select、where 等
4.DCL(Data Control Language)数据控制语言
  用来定义数据库的访问权限和安全级别,及创建用户。关键字:grant, revoke等

2. DDL

查询所有数据库

java 复制代码
SHOW DATABASES;

查询某个数据库的创建语句

java 复制代码
SHOW CREATE DATABASE 数据库名称;  -- 标准语法
SHOW CREATE DATABASE mysql;     -- 查看mysql数据库的创建格式

创建数据库

java 复制代码
CREATE DATABASE 数据库名称;-- 标准语法
CREATE DATABASE db1;     -- 创建db1数据库

创建数据库(判断,如果不存在则创建)

java 复制代码
CREATE DATABASE IF NOT EXISTS 数据库名称;

创建数据库,并指定字符集

java 复制代码
CREATE DATABASE 数据库名称 CHARACTER SET 字符集名称;

例如:创建db4数据库、如果不存在则创建,指定字符集为gbk

java 复制代码
-- 创建db4数据库、如果不存在则创建,指定字符集为gbk
CREATE DATABASE IF NOT EXISTS db4 CHARACTER SET gbk;

-- 查看db4数据库的字符集
SHOW CREATE DATABASE db4;

修改数据库的字符集

java 复制代码
ALTER DATABASE 数据库名称 CHARACTER SET 字符集名称;

常用字符集

java 复制代码
--查询所有支持的字符集
SHOW CHARSET;
--查看所有支持的校对规则
SHOW COLLATION;

-- 字符集: utf8,latinI,GBK,,GBK是utf8的子集
-- 校对规则: ci 大小定不敏感,cs或bin大小写敏感

删除数据库

java 复制代码
DROP DATABASE 数据库名称;

删除数据库(判断,如果存在则删除):

java 复制代码
DROP DATABASE IF EXISTS 数据库名称;

使用数据库:

查询当前正在使用的数据库名称

java 复制代码
SELECT DATABASE();

使用数据库

java 复制代码
USE 数据库名称; -- 标准语法
USE db4;	   -- 使用db4数据库

查询数据库中所有的数据表

java 复制代码
USE mysql;-- 使用mysql数据库

SHOW TABLES;-- 查询库中所有的表

查询表结构

java 复制代码
DESC 表名;

查询表字符集

java 复制代码
SHOW TABLE STATUS FROM 库名 LIKE '表名';

创建数据表

java 复制代码
CREATE TABLE 表名(
    列名1 数据类型1,
    列名2 数据类型2,
    ....
    列名n 数据类型n
);
-- 注意:最后一列,不需要加逗号

复制表

java 复制代码
CREATE TABLE 表名 LIKE 被复制的表名;  -- 标准语法
CREATE TABLE product2 LIKE product; -- 复制product表到product2表

数据类型

java 复制代码
-- 使用db3数据库
USE db3;

-- 创建一个product商品表
CREATE TABLE product(
	id INT,				-- 商品编号
	NAME VARCHAR(30),	-- 商品名称
	price DOUBLE,		-- 商品价格
	stock INT,			-- 商品库存
	insert_time DATE    -- 上架时间
);

修改表名

java 复制代码
ALTER TABLE 表名 RENAME TO 新的表名;

修改表的字符集

java 复制代码
ALTER TABLE 表名 CHARACTER SET 字符集名称;

添加一列

java 复制代码
ALTER TABLE 表名 ADD 列名 数据类型;

修改列数据类型

java 复制代码
ALTER TABLE 表名 MODIFY 列名 新数据类型;

修改列名称和数据类型

java 复制代码
ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;

删除列

java 复制代码
ALTER TABLE 表名 DROP 列名;

删除数据表

java 复制代码
DROP TABLE 表名;

删除数据表(判断,如果存在则删除)

java 复制代码
DROP TABLE IF EXISTS 表名;

3. DML

3.1 INSERT

新增表数据

新增格式 1:给指定列添加数据

java 复制代码
INSERT INTO 表名(列名1,列名2...) VALUES (值1,值2...);

新增格式 2:默认给全部列添加数据

java 复制代码
INSERT INTO 表名 VALUES (值1,值2,值3,...);

新增格式 3:批量添加数据

java 复制代码
-- 给指定列批量添加数据
INSERT INTO 表名(列名1,列名2,...) VALUES (值1,值2,...),(值1,值2,...)...;

-- 默认给所有列批量添加数据 
INSERT INTO 表名 VALUES (值1,值2,值3,...),(值1,值2,值3,...)...;

字符串拼接

java 复制代码
CONCAT(string1,string2,'',...)

注意事项

java 复制代码
列名和值的数量以及数据类型要对应
除了数字类型,其他数据类型的数据都需要加引号(单引双引都可以,推荐单引)

3.2 UPDATE

修改表数据语法

java 复制代码
UPDATE 表名 SET 列名1 = 值1,列名2 = 值2,... [where 条件];

修改电视的价格为1800、库存为36

java 复制代码
UPDATE product SET price=1800,stock=36 WHERE NAME='电视';
SELECT * FROM product;-- 查看所有商品信息

注意事项

java 复制代码
修改语句中必须加条件
如果不加条件,则将所有数据都修改

3.3 DELETE

删除表数据语法

java 复制代码
DELETE FROM 表名 [WHERE 条件];

注意事项

java 复制代码
删除语句中必须加条件
如果不加条件,则将所有数据删除

4. DQL

4.1 查询语法

数据库查询遵循条件在前的原则

java 复制代码
SELECT DISTINCT
	<select list>
FROM
	<left_table> <join_type>
JOIN
	<right_table> ON <join_condition>	-- 连接查询在多表查询部分详解
WHERE
	<where_condition>
GROUP BY
	<group_by_list>
HAVING
	<having_condition>
ORDER BY
	<order_by_condition>
LIMIT
	<limit_params>

执行顺序:

java 复制代码
FROM	<left_table>

ON 		<join_condition>

<join_type>		JOIN	<right_table>

WHERE		<where_condition>

GROUP BY 	<group_by_list>

HAVING		<having_condition>

SELECT DISTINCT		<select list>

ORDER BY	<order_by_condition>

LIMIT		<limit_params>

4.2 查询全部

查询全部的表数据

java 复制代码
-- 标准语法
SELECT * FROM 表名;

-- 查询product表所有数据(常用)
SELECT * FROM product;

查询指定字段的表数据

java 复制代码
SELECT 列名1,列名2,... FROM 表名;

去除重复查询:只有值全部重复的才可以去除,需要创建临时表辅助查询

java 复制代码
SELECT DISTINCT 列名1,列名2,... FROM 表名;

计算列的值(四则运算)

java 复制代码
SELECT 列名1 运算符(+ - * /) 列名2 FROM 表名;
java 复制代码
-- 查询商品名称和库存,库存数量在原有基础上加10
SELECT NAME,stock+10 FROM product;

-- 查询商品名称和库存,库存数量在原有基础上加10。进行null值判断
SELECT NAME,IFNULL(stock,0)+10 FROM product;

起别名

java 复制代码
SELECT 列名1,列名2,... AS 别名 FROM 表名;

例如:

java 复制代码
-- 查询商品名称和库存,库存数量在原有基础上加10。进行null值判断,起别名为getSum,AS可以省略。
SELECT NAME,IFNULL(stock,0)+10 AS getsum FROM product;
SELECT NAME,IFNULL(stock,0)+10 getsum FROM product;

4.3 条件查询

条件查询语法

java 复制代码
SELECT 列名 FROM 表名 WHERE 条件;

条件分类

例如:

java 复制代码
-- 查询库存大于20的商品信息
SELECT * FROM product WHERE stock > 20;

-- 查询品牌为华为的商品信息
SELECT * FROM product WHERE brand='华为';

-- 查询金额在4000 ~ 6000之间的商品信息
SELECT * FROM product WHERE price >= 4000 AND price <= 6000;
SELECT * FROM product WHERE price BETWEEN 4000 AND 6000;

-- 查询库存为14、30、23的商品信息
SELECT * FROM product WHERE stock=14 OR stock=30 OR stock=23;
SELECT * FROM product WHERE stock IN(14,30,23);

-- 查询库存为null的商品信息
SELECT * FROM product WHERE stock IS NULL;
-- 查询库存不为null的商品信息
SELECT * FROM product WHERE stock IS NOT NULL;

-- 查询名称以'小米'为开头的商品信息
SELECT * FROM product WHERE NAME LIKE '小米%';

-- 查询名称第二个字是'为'的商品信息
SELECT * FROM product WHERE NAME LIKE '_为%';

-- 查询名称为四个字符的商品信息 4个下划线
SELECT * FROM product WHERE NAME LIKE '____';

-- 查询名称中包含电脑的商品信息
SELECT * FROM product WHERE NAME LIKE '%电脑%';

4.4 函数查询

4.4.1 聚合函数

聚合函数:将一列数据作为一个整体,进行纵向的计算

聚合函数语法

java 复制代码
SELECT 函数名(列名) FROM 表名 [WHERE 条件]

聚合函数分类

例如

java 复制代码
-- 计算product表中总记录条数 7
SELECT COUNT(*) FROM product;

-- 获取最高价格
SELECT MAX(price) FROM product;
-- 获取最高价格的商品名称
SELECT NAME,price FROM product WHERE price = (SELECT MAX(price) FROM product);

-- 获取最低库存
SELECT MIN(stock) FROM product;
-- 获取最低库存的商品名称
SELECT NAME,stock FROM product WHERE stock = (SELECT MIN(stock) FROM product);

-- 获取总库存数量
SELECT SUM(stock) FROM product;
-- 获取品牌为小米的平均商品价格
SELECT AVG(price) FROM product WHERE brand='小米';
4.4.2 文本函数

CONCAT():用于连接两个字段

java 复制代码
SELECT CONCAT(TRIM(col1), '(', TRIM(col2), ')') AS concat_col FROM mytable
-- 许多数据库会使用空格把一个值填充为列宽,连接的结果出现一些不必要的空格,使用TRIM()可以去除首尾空格
4.4.3 数字函数
4.4.4 日期函数

4.5 正则查询

正则表达式(Regular Expression)是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串

java 复制代码
SELECT * FROM emp WHERE name REGEXP '^T';	-- 匹配以T开头的name值
SELECT * FROM emp WHERE name REGEXP '2$';	-- 匹配以2结尾的name值
SELECT * FROM emp WHERE name REGEXP '[uvw]';-- 匹配包含 uvw 的name值

4.6 排序查询

排序查询语法

java 复制代码
SELECT 列名 FROM 表名 [WHERE 条件] ORDER BY 列名1 排序方式1,列名2 排序方式2;

排序方式

java 复制代码
ASC:升序
DESC:降序

注意 :多个排序条件,当前边的条件值一样时,才会判断第二条件

例如

java 复制代码
-- 按照库存升序排序
SELECT * FROM product ORDER BY stock ASC;

-- 查询名称中包含手机的商品信息。按照金额降序排序
SELECT * FROM product WHERE NAME LIKE '%手机%' ORDER BY price DESC;

-- 按照金额升序排序,如果金额相同,按照库存降序排列
SELECT * FROM product ORDER BY price ASC,stock DESC;

4.7 分组查询

分组查询会进行去重

分组查询语法

java 复制代码
SELECT 列名 FROM 表名 [WHERE 条件] GROUP BY 分组列名 [HAVING 分组后条件过滤] [ORDER BY 排序列名 排序方式];

WHERE 过滤行,HAVING 过滤分组,行过滤应当先于分组过滤

分组规定:

java 复制代码
GROUP BY 子句出现在 WHERE 子句之后,ORDER BY 子句之前
NULL 的行会单独分为一组
大多数 SQL 实现不支持 GROUP BY 列具有可变长度的数据类型

例如

java 复制代码
-- 按照品牌分组,获取每组商品的总金额
SELECT brand,SUM(price) FROM product GROUP BY brand;

-- 对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额
SELECT brand,SUM(price) FROM product WHERE price > 4000 GROUP BY brand;

-- 对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额,只显示总金额大于7000元的
SELECT brand,SUM(price) AS getSum FROM product WHERE price > 4000 GROUP BY brand HAVING getSum > 7000;

-- 对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额,只显示总金额大于7000元的、并按照总金额的降序排列
SELECT brand,SUM(price) AS getSum FROM product WHERE price > 4000 GROUP BY brand HAVING getSum > 7000 ORDER BY getSum DESC;

4.8 分页查询

分页查询语法

java 复制代码
SELECT 列名 FROM 表名 [WHERE 条件] GROUP BY 分组列名 [HAVING 分组后条件过滤] [ORDER BY 排序列名 排序方式] LIMIT 开始索引,查询条数;

公式:开始索引 = (当前页码-1) * 每页显示的条数

例如

java 复制代码
SELECT * FROM product LIMIT 0,2;  -- 第一页 开始索引=(1-1) * 2
SELECT * FROM product LIMIT 2,2;  -- 第二页 开始索引=(2-1) * 2
SELECT * FROM product LIMIT 4,2;  -- 第三页 开始索引=(3-1) * 2
SELECT * FROM product LIMIT 6,2;  -- 第四页 开始索引=(4-1) * 2