您现在的位置是:首页 >技术杂谈 >MySQL小记——DDL、DML、DQL网站首页技术杂谈

MySQL小记——DDL、DML、DQL

Jmh-Ethereal 2024-06-17 11:19:12
简介MySQL小记——DDL、DML、DQL

目录

数据库概念

关系型数据库

MySQL使用

SQL语言

sql分类

DDL:操作数据库和表

操作数据库

操作表

DML:数据操作语言,用来增删改数据库记录

1.插入数据

2.删除数据

3.修改数据

DQL:查询

条件查询

模糊查询

字段的运算和去重

排序 order by

聚合函数

分组 group by 

分页 limit


数据库概念

存储数据的仓库,用于存储和管理数据

关系型数据库

由行和列组成的这种二维表,而且表和表之间有对应关系。

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)*每页条数

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。