SQL
全称 Structured Query Language,结构化查询语言。操作关系型数据库的编程语言,定义了
一套操作关系型数据库统一标准 。
通用语法
书写规则:
- SQL语句可以单行或多行书写,以分号结尾。
- SQL语句可以使用空格 进行缩进增强语句的可读性。
- MySQL数据库的SQL语句不区分大小写,个别关键字建议使用大写。
注释
分类
分类 | 说明 |
DDL | 数据定义语言,用来定义数据库对象(数据库,表,字段) |
DML | 数据操作语言,用来对数据库表中的数据进行增删改 |
DQL | 数据查询语言,用来查询数据库中表的记录 |
DCL | 数据控制语言,用来创建数据库用户、控制数据库的访问权限 |
DDL
数据库操作
操作 | 说明 |
---|---|
查询所有数据库 查询当前数据库 | show databases; select database(); |
创建库 | create database ( if not exists) 数据库名 ( default charset 字符串集) ( collate 排序规则) ; |
删除库 | drop database [ if exsts] |
使用库 | use |
表操作
- 查询表
操作 | 说明 |
show tables; | 查询当前数据库所有表 |
desc 表名; | 查询表结构 |
show create table 表名; | 查询指定表的建表语句 |
- 创建表
CREATE TABLE 表名(
字段1 字段1类型 [COMMENT 字段1注释 ],
字段2 字段2类型 [COMMENT 字段2注释 ],
字段3 字段3类型 [COMMENT 字段3注释 ],
......
字段n 字段n类型 [COMMENT 字段n注释 ]
) [ COMMENT 表注释 ] ;
示例:
创建一个表储存下面的信息
学号 | 姓名 | 成绩 |
202201 | 张三 | 90 |
202202 | 李四 | 60 |
202203 | 王五 | 75 |
将此表格中的数据录入数据库(注意你要提前建立好库了)
mysql> create table start(
-> id int comment '学号',
-> name varchar(50) comment '姓名',
-> score int comment '成绩'
-> )comment '示例表';
Query OK, 0 rows affected (0.04 sec)
mysql> show tables
-> ; /*显示表的创建情况*/
+-----------------+
| Tables_in_begin |
+-----------------+
| start |
+-----------------+
1 row in set (0.00 sec)
mysql> desc start;/*查询表结果*/
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(50) | YES | | NULL | |
| score | int | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
其中,包括了输入表,显示当前表的创建情况,查询表结构
- 表的修改
1.修改表名
ALTER TABLE 表名 RENAME TO 新表名;
2.添加字段
ALTER TABLE 表名 ADD 字段名 类型 (长度) ( COMMENT 注释 );
示例:
在上面的示例表中添加一行新的字段,性别,类型为varchar型
mysql> alter table start add gender varchar(50);
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
3.修改数据类型
ALTER TABLE 表名 MODIFY 字段名 新数据类型 (长度);
4.修改字段名何字段类型
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型 (长度) [ COMMENT 注释 ];
示例:
将示例表中的name修改为nicheng,类型变为varchar(40)
mysql> desc start; /*更改前*/
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(50) | YES | | NULL | |
| score | int | YES | | NULL | |
| gender | varchar(50) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> alter table start change name nicheng varchar(40);/*进行更改*/
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc start;/*更改后*/
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| nicheng | varchar(40) | YES | | NULL | |
| score | int | YES | | NULL | |
| gender | varchar(50) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
5.删除字段
ALTER TABLE 表名 DROP 字段名;
示例:
删除gender字段
mysql> desc start;/*删除前*/
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| nicheng | varchar(40) | YES | | NULL | |
| score | int | YES | | NULL | |
| gender | varchar(50) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> alter table start drop gender;/*进行删除*/
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc start;/*删除后*/
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| nicheng | varchar(40) | YES | | NULL | |
| score | int | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
6.删除表
删除表 | DROP TABLE [ IF EXISTS ] 表名; |
删除指定表, 并重新创建表 (得到一张空表) | TRUNCATE TABLE 表名; |
DML
DML是对数据的增删改
添加数据
- 给指定字段添加数据
INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);
- 给全部字段添加数据
INSERT INTO 表名 VALUES (值1, 值2, ...);
- 批量添加数据
INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...), (值1, 值2, ...), (值
1, 值2, ...) ;
INSERT INTO 表名 VALUES (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...) ;
多行数据用逗号分隔
修改数据
UPDATE 表名 SET 字段名1 = 值1 , 字段名2 = 值2 , .... [ WHERE 条件 ] ;
有where则修改部分,没有where则修改对应的列。
删除数据
DELETE FROM 表名 [ WHERE 条件 ] ;
有where则删除符合条件的一行,没有where则删除所有数据
DQL
基础查询
- 查询列字段
SELECT 字段1, 字段2, 字段3 ... FROM 表名 ;
SELECT * FROM 表名 ; /*查询全部*/
基础操作 | 说明 |
as | 设置别名 |
distinct unique | 去重 |
- 设置别名
SELECT 字段1 [ AS 别名1 ] , 字段2 [ AS 别名2 ] ... FROM 表名;
as可以省略
- 去除重复记录
条件查询
SELECT 字段列表 FROM 表名 WHERE 条件列表 ;
运算符 | 功能 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
= | 等于 |
<> 或 != | 不等于 |
BETWEEN ... AND ... | 在某个范围之内(含最小、最大值) |
IN(...) | 在in之后的列表中的值,多选一 |
LIKE "字符串" | 模糊匹配(_匹配单个字符, %匹配任意个字符) |
IS NULL | NULL |
AND 或 && | 并且 (多个条件同时成立) |
OR 或 || | 或者 (多个条件任意一个成立) |
NOT 或 ! | 非 , 不是 |
ORDER BY (DESC) | 升序(降序),默认是升序 |
例如:查询Book表中价格在30-50之间的书的所有信息
select * from Book
where price <=50 and price<=30;
- 模糊匹配
用法 | 说明 |
“%” | 匹配零个或多个字符 |
“_” | 匹配任意单个字符 |
“\” | 转义字符,用于去掉一些特殊字符的特定含义,使其被作为普通字符看待, 如用“\%”去匹配字符%,用\_ 去匹配字符_ |
例如:查询某表名字为张某某的所有同学姓名
Select name From Student
Where name Like '张__';
连接查询
聚合查询
聚合函数:将一列数据作为一个整体,进行纵向计算的函数
函数 | 功能 |
---|---|
count | 统计数量 |
max | 最大值 |
min | 最小值 |
avg | 平均值 |
sum | 求和 |
distinct | 去重 |
limit | 强制 SELECT 语句返回指定的记录数 |
聚合函数的使用
SELECT 聚合函数(字段列表) FROM 表名 ;
例如:
查询BorrowBook表中正在借书的总人数
select count(people) from BorrowBook;
- LIMIT的使用
SELECT * FROM table LIMIT 2;
查找前两行(limit 后面+一个参数:它表示从0开始,查找的最大的行数目)
SELECT * FROM table LIMIT 5,5
查找 6-10行(+两个参数:第一个参数指定开始查找的位置,第二个参数指定查找的最大行数目。)
SELECT * FROM table LIMIT 10,-1
查找11-最后一行 (从某一个行到表结束,可以指定第二个参数为 -1。)
分组查询
SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组
后过滤条件 ];
示例:
根据性别进行分组,统计男性员工 和女性员工的平均年龄(假设他们的数据已存在),我们来看语法
select gender ,avg(age) from [表名] group by gender;
- where与having区别
1.执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
2.判断条件不同:where不能对聚合函数进行判断,而having可以。
排序查询
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2 ;
排序方式:ASC : 升序(默认值)、DESC: 降序
分页查询
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;
注意:
- 起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数。
- 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
- 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。