一、DDL、DCL、DML、DQL
通过二维表的形式,更加清晰直观的学习、对比其关系。
DDL | DCL | DML | DQL | |
英文释义 | Data Defination Language 数据库定义语言 | Data Control Language 数据库控制语言 | Data Manipulation Language 数据操作语言 | Data Query Language 数据查询语言 |
作用 | 定义数据库对象的结构和属性,及存储过程 | 控制数据库的访问权限和安全性 | 对数据库中的数据进行操作 | 对数据进行查询操作 |
功能 | 创建数据库对象--create 修改数据库对象--insert 删除数据库对象(表、视图、索引) --drop | 授予权限 grain 撤销权限 revoke | 插入数据 insert into 更新数据 update 删除数据 delete from 查询数据 select | 分页查询、排序查询、分组查询、条件查询 select 列名 from 表名 where 限定条件; |
应用场景 |
|
|
| 从数据库中选择数据 选择数据、过滤数据、排序数据、组合数据、计算数据 |
操作对象 | 据库对象的结构,如表、视图、索引等 | 对用户权限的管理 | 数据库中的实际数据 | 数据库中的实际数据 |
执行结果 | 永久性地改变数据库的结构 | 权限授予或撤销会立即生效,并影响用户对数据库的操作权限 | 临时性的,除非提交事务,否则数据更改可以回滚。 | 可进行随时调整,以表格形式返回,可通过工具进一步处理或显示 |
二、DDL语法与实践
数据库操作
查询所有的数据库名称:
show database;
show database;
创建数据库
create database 数据库名称;
create database if not exists 数据库名称;
删除数据库
drop database 数据库名;
drop database if not exists 数据库名;
使用数据库
select database();——查看当前使用的数据库
use 数据库名;——使用数据库
表操作
查询表
show tables ;
desc 表名;
创建表
create table 表名(
字段名 数据类型,
....
);
修改表
alter table 表名 rename to 新表名;
alter table 表名 add 列名 数据类型;
alter table 表名 modify 列名 新数据类型;
alter table 表名 change 列名 新数据类型;
alter table 表名 drop 列名;
三、DML语法与实践
添加数据
1.给指定列添加数据
insert into 表名(列名1,列名2,...)values(值1,值2,...);
2.给全部列添加数据
insert into 表名 values(值1,值2,...);
3.给指定列添加数据
insert into 表名(列名1,列名2,...)values(值1,值2,...),(值1,值2,...),(值1,值2,...)... ;
insert into 表名 values(值1,值2,...),(值1,值2,...)...;
修改数据
update 表名 set 列名1=值1,列名2=值2,列名3=值3,...
注意:修改语句中如果不加条件,则将所有数据都修改。
删除数据
delete from 表名 [where 条件];
注意:删除语句中如果不加条件,则将所有数据都删除
代码操作
可以按照模板,去创建表
--查询所有数据
select * from stu;
--给指定列添加数据 INSERT INTO 表名(列名1,列名2,)VALUES(值1,值2,);
INSERT into stu(id, name) VALUES(1,'张三');
--给所有的添加数据
INSERT into stu(id, name,sex,birthday,score,email,tel,status) VALUES(2,'李四','男','1999-11-11',88.88,'lisi@itcanst.cn','13888889990',1);
--列名的列表可以省略
INSERT into stu values(2,'李阳','男','1999-11-11',88.88,'lisi@itcanst.cn','13888889990',1);
--修改数据 update 表名 set、 列名1=值1,列名2=值2,..[where 条件]
--将张三改为女
update stu set sex = '女' where name = '张三';
--将张三的生日改为1999-12-12 分数改为99.99
update stu set birthday = '1999-12-12', score = 99.99 where name = '张三';
--注意,若没有where,表示所有数据全部修改
--删除 DELETE from 表名 where
delete from stu where name = '张三';
四、DQL语法与实践
查询语法
select 字段列表 from 表名列表
where 条件列表
group by 分组字段
having 分组后条件
order by 排序字段
limit 分页限定
1.查询多个字段
select 字段列表 from 表名;
select * from 表名; 查询所有表名
2.去除重复记录
select distinct 字段列表 from 表名;
3.起别名
AS:(AS也可以省略用空格代替)
条件查询
select 字段列表 from 表名 where 条件列表;
排序查询
select 字段列表 from 表名 order by 排序字段名1 [排序方式1],排序字段名2 [排序方式2]...;
排序方式:
ASC升序(默认)
DESC:降序
分组查询
聚合函数
select 聚合函数名(列名) from 表;
注意:null不参与聚合函数运算。
语法
select 字段列表 from 表名 [where 分组前条件限定] group by 分组字段名 [having]
区分where与having的区别
where | having | |
执行 | 在分组前对数据进行过滤 | 在分组后对数据进行过滤 |
条件 | 后不可使用聚合函数 | 后可使用聚合函数 |
意义 | 要分组的条件要求 | 对分组后的条件要求 |
分页查询
select 字段列表 from 表名 limit 起始索引, 查询条目;
起始索引从零开始
起始索引 = (当前页码-1)* 每页显示的条数
tip是:
分页查询limit是MySQL方言
Oracle分页查询使用rownumber
SQL server分页查询使用top
五、代码实操
创建表、添加表数据、基础查询
-- 删除stu表
DROP TABLE
IF
EXISTS stu;-- 创建stu表
CREATE TABLE stu (
id INT,
NAME VARCHAR ( 20 ),
age INT,
sex VARCHAR ( 5 ),
address VARCHAR ( 100 ),
math DOUBLE ( 5, 2 ),
english DOUBLE ( 5, 2 ),
hire_date date
);-- 添加数据
INSERT INTO stu ( id, NAME, age, sex, address, math, english, hire_date )
VALUES
( 1, '马云', 55, '男', '杭州', 66, 78, '1995-09-01' ),
( 2, '马画藤', 45, '女', '深圳', 66, 78, '1998-09-01' ),
( 3, '马斯克', 55, '男', '香港', 66, 78, '1999-09-02' ),
( 4, '柳白', 20, '女', '湖南', 66, 78, '1997-09-05' ),
( 5, '柳青', 20, '男', '湖南', 66, 78, '1998-09-01' ),
( 6, '刘德华', 57, '男', '香港', 66, 78, '1998-09-01' ),
( 7, '张学友', 22, '女', '香港', 66, 78, '1998-09-01' ),
( 8, '德玛西亚', 18, '男', '南京', 66, 78, '1994-09-02' );
SELECT
*
FROM
stu;-- 基础查询==============================
SELECT NAME -- 姓名
,
age -- 年龄
FROM
stu;
-- 查询地址
SELECT address from stu;
-- 去重
SELECT DISTINCT address from stu;
-- 查询姓名、数学成绩、英语成绩
select name,math as 数学成绩,english as 英语成绩 from stu;
条件查询
SELECT * from stu;
-- 条件查询=====================
-- 1.查询年龄大于20岁的学员信息
select name,id,age,sex,hire_date,math from stu where age > 20;
-- 2.查询年龄 大于等于20岁 的学员信息
select * from stu where age >= 20;
-- 3.查询年龄 大于等于20岁 并且 小于等于 30岁 的学员信息
select * from stu where age >= 20 && age <=30;
select * from stu where age >= 20 and age <=30;
select * from stu where age between 20 and 30;
-- 4.查询入学日期在‘1988-09-01’到‘1999-09-01’之间的学员信息
select * from stu where hire_date between '1988-09-01' and '1999-09-01';
-- 5.查询年龄等于18岁的学员信息
select * from stu where age = 18;
-- 6.查询年龄不等于18岁的学员信息
select * from stu where age != 18;
select * from stu where age <>18;
-- 7.查询年龄=28 或 =20 或=22 的成员
select * from stu where age =18 or age = 20 or age = 22;
select * from stu where age in (18,20,22);
-- 8.查询英语成绩为null的学员成绩
-- 注意:null值的比较不可以用null is null;用is is not
-- select * from stu where english = null;
select * from stu where english is null;
select * from stu where english is not null;
-- LIKE 占位符的使用--模糊查询---
-- 1.姓马的学员
select * from stu where name like '马%';
-- 2.查询第二个字是画的
select * from stu where name like '_画%';
-- 3.包含德的学员信息
select * from stu where name like '%德%';
分组查询
-- 分组查询========================
-- 聚合操作--select 聚合函数名(列名) from 表;——纵向计算
-- count--统计数量 1. 主键 2.*
-- 1. 统计班级一共有多少个学生
select count(name) from stu; -- count 统计的列名不能为null
select count(math) from stu;
-- 2. 查询数学成绩的最高分
select max(math) from stu;
-- 3. 查询数学成绩的最低分
select min(math) from stu;
-- 4. 查询数学成绩的总分
select sum(math) from stu;
-- 5. 查询数学成绩的平均分
select avg(math) from stu;
-- 6. 查询英语成绩的最低分
select min(english) from stu; -- 如果其中有null,聚合函数中null不参与运算
/*-- 分组查询=======================
-- select 字段列表 from 表名 [where 分组之前的条件限定] group by 分组字段 [ having 分组后条件过滤]...
*/
select * from stu;
-- 1.查询男同学和女同学各自的数学平均分
select sex,avg(math) from stu group by sex;
-- 2.查询男同学和女同学各自的数学平均分 以及各自的人数
select sex,avg(math),count(*) from stu group by sex;
-- 3.查询男同学和女同学各自的数学平均分 以及各自的人数, 要求:分数低于70分的不参加分组
select sex,avg(math),count(*) from stu where math>=70 group by sex;
-- 4.查询男同学和女同学各自的数学平均分 以及各自的人数要求:分数低于70分的不参加分组, 分组后人数大于2
select sex,avg(math),count(*) from stu where math>=70 group by sex having count(*)>2;
select sex,avg(math),count(*) from stu where math>=70 group by sex having count(name)>2;
分页查询
/*
分页查询:
select 字段列表 from 表名 limit 起始索引,查询条目数*起始索引:从0开始
*/
SELECT * FROM sru;
-- 1. 从0显示3条数据,查询3条数据
select * from stu limit 0, 3;
-- 2. 每页显示3条数据,查询第1页数据
select * from stu limit 0, 3;
-- 3. 每页显示3条数据,查询第2页数据
select * from stu limit 3, 3;
-- 4. 每页显示3条数据,查询第3页数据
select * from stu limit 6, 3;
-- 起始索引 = (当前页码-1)*3