目录
1. SQL分类
- DDL(Data Definition Language)语句:数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象。常用的语句关键字主要包括
create、drop、alter
等。 - DML(Data Manipulation Language)语句:数据操作语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性。常用的语句关键字主要包括
insert、delete、update、select
等。 - DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括
grant、revoke
等。
2.1 DDL语句
主要对表的定义、结构的修改操作。
2.1 创建数据库
-- 命令格式
CREATE DATABASE dbname;
-- 创建成功响应结果
Query OK, 1 row affected (0.00 sec)
-- 数据库已存在,再次创建失败响应结果
ERROR 1007 (HY000): Can't create database 'test1';
database exists
2.2 查看数据库列表
-- 命令格式
SHOW DATABASES;
-- 查询结果
+--------------------+
| Database|
+--------------------+
| information_schema |
| cluster |
| mysql |
| test|
| test1|
+--------------------+
5 rows in set (0.00 sec)
information_schema
:主要存储了系统的一些数据库对象信息,比如用户表信息、列信息、权限信息、字符集信息、分区信息等。
cluster
:存储了系统的集群信息。
mysql
:存储了系统的用户权限信息。
test
:系统自动创建的测试数据库,任何用户都可以使用。
2.3 使用/操作数据库
-- 命令格式
USE dbname;
-- 例如,选择数据库test1
> USE test1
-- 响应结果
Database changed
2.4 查看数据库中所有数据表
-- 命令格式
SHOW TABLES;
-- 响应结果
+---------------------------+
| Tables_in_mysql|
+---------------------------+
| columns_priv|
| db|
| event|
| func|
| general_log|
| help_category|
| help_keyword|
+---------------------------+
7 rows in set (0.00 sec)
2.5 删除数据库
-- 命令格式
DROP DATABASE dbname;
注意:数据库删除后,其下的所有表数据都会全部删除,所以删除前一定要仔细检查并做好相应备份。
2.6 创建表
-- 命令格式
CREATE TABLE tablename(
column_name_1 column_type_1 constraints,
column_name_1 column_type_1 constraints,
……
column_name_n column_type_n constraints,
);
column_name
:列名
column_type
:列的数据类型
constraints
:列的约束条件
例如,创建一个名称为student
的表学生表。表中包括name(姓名)、sex(性别)、age(年龄)
,且字段类型分别为varchar(10)、varchar(2)、int(2)
,则SQL语句如下:
CREATE TABLE student(
name varchar(10),
sex varchar(2),
age int(2)
);
2.7 查看表的定义
DESC tablename;
2.8 查看表创建的SQL
-- 命令格式
SHOW CREATE TABLE tablename \G;
2.9 删除表
-- 命令格式
DROP TABLE tablename;
2.10 修改表
-- 1. 修改表类型,命令格式
ALTER TABLE tablename MODIFY [COLUMN] column_definition [FIRST|AFTER col_name];
-- 例如,修改表student的name字段定义,将varchar(10)改为varchar(20):
ALTER TABLE student MODIFY name varchar(20);
-- 2. 增加表字段,命令格式
ALTER TABLE tablename ADD [COLUMN] column_definition [FIRST|AFTER col_name];
-- 例如,在表student中新增字段爱好(hobby),类型为varchar(100):
ALTER TABLE student ADD hobby varchar(100);
-- 3. 删除表字段,命令格式
ALTER TABLE tablename DROP [COLUMN] col_name;
-- 例如,将student表中的爱好(hobby)字段删除掉:
ALTER TABLE student DROP COLUMN hobby;
-- 4. 字段改名,命令格式
ALTER TABLE tablename CHANGE [COLUMN] old_col_name column_definition;
-- 例如,将age改名为age1,同时修改字段类型为int(4):
alter table emp change age age1 int(4) ;
2.11 修改字段排列顺序
前面的字段增加和修改语法(ADD/CHANGE/MODIFY)中,都由一个可选项first|after column_name,这个选项可以用来修改字段在表中的位置,ADD增加的新字段默认是加在表的最后位置,而CHANGE/MODIFY默认都不会改变字段的位置。
例如,将新增的字段 birth date加在name之后:
ALTER TABLE student ADD birth date AFTER name;
修改字段age,将它放在最前面
ALTER TABLE student MODIFY age int(3) FIRST;
注意:CHANGE/FIRST|AFTER COLUMN这些关键字都属于MySQL在标准SQL上的扩展,不一定适用于其他数据库
2.12 修改表名
-- 命令格式
ALTER TABLE tablename RENAME [TO] new_tablename;
-- 例如,将表student改名为teacher:
ALTER TABLE student RENAME teacher;
3. DML语句
DML操作是指对数据库中表记录的操作,主要包括表记录的插入(insert)、更新(update)、删除(delete)和查询(select),是开发人员日常使用最频繁的操作。
3.1 插入记录
-- 命令格式
INSERT INTO tablename(field1, field2, ……,fieldn)
VALUES(value1, value2, ……, valuen);
3.2 更新记录
更新一张表的记录
-- 命令格式
UPDATE tablename
SET
field1 = value1,
field2 = value2,
……,
fieldn = valuen
[WHERE CONDITION]
更新多张表的记录
UPDATE tablename1,tablename2, ……, tablenamen
SET
tablename1.field = value1,
tablename2.field = value2,
……,
tablenamen.field = valuen
[WHERE CONDITION]
注意:多表更新的语法更多地用在了根据一个表的字段来动态地更新另一个表的字段。
3.3 删除记录
删除一张表的记录
-- 命令格式
DELETE FROM tablename [WHERE CONDITION]
删除多张表的记录
-- 命令格式
DELETE tablename1, tablename2, …… tablenamen
FROM tablename1, tablename2, …… tablenamen
[WHERE CONDITION]
如果FROM后边的表名使用别名,则DELETE后面也要用相应的别名,否则会提示语法错误。
例如,同时删除表student和teacher中的age为22的记录:
DELETE s, t
FROM student s, teacher t
WHERE
s.age = t.age
AND s.age = 22;
注意:无论是单标还是多表,不加where条件将会删除表的所有记录,操作时一定要小心。更多情况都会采用逻辑删除处理。
3.4 查询记录
这里只介绍最基本的语法
-- 命令格式
SELECT * FROM tablename [WHERE CONDITION]
注意:一般不建议使用*,通常使用表的列名来代替,仅取出需要使用的列值即可
3.4.1 查询不重复的记录
-- 命令格式
SELECT DISTINCT field1, field2, …… fieldn FROM tablename;
3.4.2 排序和限制
-- 命令格式
SELECT
*
FROM
tablename
[WHERE CONDITION]
[ORDER BY
field1 [DESC|ASC],
field2 [DESC|ASC],
……,
fieldn [DESC|ASC],
]
DESC:按照字段进行降序排序
ASC:按照字段进行升序排序
3.4.3 聚合
很多情况下,用户都需要进行一些汇总操作,比如统计整个班的总成绩,这时候就用到聚合函数
-- 命令格式
SELECT [field1, field2, ……, fieldn] fun_name
FROM tablename
[WHERE CONDITION]
[GROUP BY field1, field2, ……, fieldn]
[WHITH ROLLUP]
[HAVING where_condition]
- fun_name:表示要做的聚合操作,也就是聚合函数,常用的有
sum(fieldname)[求和]、count(*)[记录数]、max(fieldname)[最大值]、min(fieldname)[最小值]
- GROUP BY:关键字表示要进行分类聚合的字段,比如按照部门分类统计员工数量,部门就应该写在GRROUP BY后面。
- WITH ROLLUP:是可选语法,表明是否对分类聚合后的结果进行再汇总。
- HAVING:关键字表示对分类后的结果再进行条件的过滤。
注意:having和where的区别在于,having是对聚合后的结果进行条件的筛选,而where是在聚合前就对记录进行过滤
3.4.4 表连接
内连接:仅选出两张表中互相匹配的记录。
-- 命令格式
SELECT
field1, field2
FROM
tablename1, tablename2
WHERE
tablename1.field3 = tablename2.field3
外连接:会选出其他不匹配的记录。
- 左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。
-- 命令格式
SELECT
field1, field2
FROM
tablename1
LEFT JOIN tablename2
ON tablename1.filed3 = tablename2.filed3
- 右连接:包含所有右边表中的记录甚至是左边表中没有和它匹配的记录。
-- 命令格式
SELECT
field1, field2
FROM
tablename1
RIGHT JOIN tablename2
ON tablename1.filed3 = tablename2.filed3
3.4.5 子查询
在某些情况下,当进行查询的时候,需要的条件是另一个SELECT语句的结果,这个时候,就要用到子查询。用于子查询的关键字主要包括in、not in、=、!=、exists、not exists
等。
-- 命令格式
SELECT
tablename1.field1,
tablename1.field2
FROM
tablename1
WHERE
tablename1.field3 IN (
SELECT
tablename2.field3
FROM
tablename2
[WHERE CONDITION]
);
3.4.6 记录联合
将两个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示,就需要用union、union all
关键字来实现。
SELECT * FROM tablename1
UNION|UNION ALL
SELECT * FROM tablename2
……
UNION|UNION ALL
SELECT * FROM tablenamen;
注意:UNION和UNION ALL的主要区别是UNION ALL是把结果集直接合并在一起,而UNION是将UNION ALL后的结果进行一次DISTINCT,去除重复记录后的结果
4 DCL语句
DCL语句主要是DBA用来管理系统中的对象权限时使用,一般的开发人员很少使用。
例如,创建一个数据库用户user1
,具有对test
数据库中所有表的SELECT/INSERT权限:
GRANT
SELECT,INSERT
ON test.*
TO
'user1'@'localhost' IDENTIFIED BY '123';