您现在的位置是:首页 >技术杂谈 >MySQL小记——DDL、DML、DQL网站首页技术杂谈
MySQL小记——DDL、DML、DQL
目录
数据库概念
存储数据的仓库,用于存储和管理数据
关系型数据库
由行和列组成的这种二维表,而且表和表之间有对应关系。
MySQL就是关系型数据库的一种。
MySQL使用
1.登录
cmd-->mysql -uroot -p密码
2.退出
exit
SQL语言
结构化查询语言
通过sql语言可以操作所有的关系型数据库。每种数据库之间会存在差异,称为 "方言"。
sql分类
DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;
DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(增、删、改)
DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;
DQL(Data Query Language):数据查询语言,用来查询记录(数据)。
DDL:操作数据库和表
操作数据库
创建:create database 数据库名称;
删除:drop database 数据库名称;
修改字符集:alter database 数据库名称 character set gbk;
查询:show databases; 查询所有数据库名称
show create database 数据库名称; 查看建库语句,可以看到编码
切换库:use 库名
操作表
就是创建表头(列,字段)
常见字段的数据类型:
int:整型 id int,
* double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99; money double(5,2)
char(10):固定长度字符串类型;
name char(10) "张三"
varchar(10):可变长度字符串类型;
例:name varchar(10) "张三"
text:字符串类型;存大格式的文本 比如存个小说 一般不用
blob:字节类型;存字节类型的数据 比如电影字节 图片字节 但是一般不会把字节数据存到数据库当中
date:日期类型,格式为:yyyy-MM-dd; 2020-10-12
time:时间类型,格式为:hh:mm:ss 14:30:30
datetime:日期时间类型 yyyy-MM-dd hh:mm:ss 2020-10-12 14:30:30
* timestamp:时间戳类型 yyyy-MM-dd hh:mm:ss
* 如果该类型的字段不给赋值,则默认当前时间
创建:
create table 表名(
列名1 类型1,
列名2 类型2,
...
列名n 类型n
);
create table student(
id int, -- 编号
sname varchar(10), -- 姓名
age int, -- 年龄
sal double(6,2), -- 工资
birthday date -- 生日
);
删除表: drop table 表名;
查看库中所有表:show tables;
查看表结构:desc 表名;
增加一个表头:alter table student add(phone char(11));
删除一个表头:alter table student drop phone;
修改表头名称:alter table student change id sid int;
修改表头数据类型:alter table student modify sal int ;
或:alter table student change sal sal double(5,2);
修改表名:alter table student rename to stu;
DML:数据操作语言,用来增删改数据库记录
1.插入数据
插入所有:
insert into student(id,name,age) values (1,'zhangsan',23);
简写:
insert into student values (1,'zhangsan',23);
个别字段插入:
insert into student(id,name) values(2,'lisi');
2.删除数据
1.全部删除:
delete from student;
2.where 条件删除
=、!=、<、<=、>、>=、and (&&) 、or (||)
delete from student where id=1;
3.修改数据
1.没有条件修改
update student set sname='wangwu',age=30;
2.有条件修改
update student set sname='zhangsan',age=20 where id=1;
DQL:查询
1.查询表中所有数据
select * from student;
建议全写,而不是写个*
select id,sname,age,sal,birthday from student;
2.查询个别字段
select sname,id from student;
条件查询
=、!=、<>(不等于)、<、<=、>、>=;
BETWEEN…AND; 在什么范围之间
IN(set);
IS NULL;为空
IS NOT NULL; 不为空
AND; 并且
OR; 或者
NOT;非
1.等值查询
select * from emp where empno=7566;
2.between....and
select * from emp where sal between 2000 and 5000;
3.in
select * from emp where empno in(7499,7788,7934,55555);
4.null值(is null / is not null)
select * from emp where comm is null;
5.as 字段别名 as可不写
select empno as 员工工号,ename as 员工姓名,sal 工资 from emp;
select empno 员工工号,ename 员工姓名,sal 工资 from emp;
6.表别名
select empno 员工工号,ename 员工姓名,sal 工资 from emp e where e.empno=7499;
模糊查询
% 通配多个任意字符
_ 通配单个任意字符
1.姓名包含M
select * from emp as e where ename like '%M%';
2.以S开头
select * from emp as e where ename like 'S%';
3.以S结尾
select * from emp as e where ename like '%S';
4.第二个字母是A
select * from emp as e where ename like '_A%';
5.五个字母组成
select * from emp as e where ename like '_____';
字段的运算和去重
查询年薪
SELECT empno,ename,sal,comm,sal*12 AS 年薪 FROM emp;
null值参与运算结果是null,若想要把null值当作0,用ifnull
IFNULL(comm,0) 如果comm是null,就取0 不是null 取你原本的值
去重
select distinct sal from emp where sal=3000;
排序 order by
升序 asc
降序 desc
聚合函数
对列做运算
-- 统计员工有多少人
SELECT COUNT(empno) AS 总人数 FROM emp;-- 传入* 也可以
SELECT COUNT(*) AS 总人数 FROM emp;-- 工资最值
SELECT MAX(sal) AS 最高工资 FROM emp;
SELECT MIN(sal) AS 最低工资 FROM emp;-- 平均工资
SELECT AVG(sal) AS 平均工资 FROM emp;-- 总工资
SELECT SUM(sal) AS 总工资 FROM emp;
分组 group by
和聚合函数配合使用
-- 比如我按部分编号分组 比如有三个部门 然后我求每个部门的平均工资 那展示出来的数据应该有三条
SELECT deptno '部门编号',AVG(sal) '部门的平均工资' FROM emp GROUP BY deptno;
-- 按照岗位分组,统计每种岗位多少人
SELECT job '岗位',COUNT(job) '岗位人数' FROM emp GROUP BY job;
-- 1.例如查询 每个部门的部门编号 以及每个部门工资大于1500的人数,分组之前要进行筛选
-- where 在分组之前进行条件的筛选,符合条件的参与分组,不符合条件的不参与分组。
SELECT deptno '部门编号',COUNT(empno) '部门人数' FROM emp WHERE sal>1500 GROUP BY deptno;
-- 2.例如 我要查询 各个部门平均工资 大于2000 的部门
-- having:在分组之后,对结果集的筛选
SELECT deptno '部门编号',AVG(sal) '部门的平均工资' FROM emp GROUP BY deptno HAVING AVG(sal)>2000;
SELECT deptno '部门编号',AVG(sal) '部门的平均工资' FROM emp GROUP BY deptno HAVING 部门的平均工资>2000;
-- 3. 例如我要查询 各个部门 员工工资大于1500 的平均工资 并且平均工资 大于2000的部门
SELECT deptno '部门编号',AVG(sal) '部门的平均工资' FROM emp WHERE sal>1500 GROUP BY deptno HAVING 部门的平均工资>2000;
-- having 和where的区别?
-- * where和having
-- * where:在分组之前对条件进行限定。不满足条件,就不会参与分组
-- * having:在分组之后,对结果集的筛选
-- 4. 例如我要查询 各个部门 员工工资大于1500 的平均工资 并且平均工资 大于2000的部门,升序排列
SELECT deptno '部门编号',AVG(sal) '部门的平均工资'
FROM emp WHERE sal>1500
GROUP BY deptno HAVING 部门的平均工资>2000
ORDER BY 部门的平均工资 ASC;
分页 limit
limit 起始索引,每页的条数
-- 第一页
SELECT * FROM emp LIMIT 0,3;
-- 第二页
SELECT * FROM emp LIMIT 3,3;
-- 第三页
SELECT * FROM emp LIMIT 6,3;
-- 第四页
SELECT * FROM emp LIMIT 9,3;
-- 第五页
SELECT * FROM emp LIMIT 12,3;
-- 起始索引=(页码-1)*每页条数