玖叶教程网

前端编程开发入门

小白入门必知必会-MySQL之SQL语句

一、SQL分类

  • DDL:数据定义语言,用来定义数据库对象(数据库,表,字段)
  • DML:数据操作语言,用来对数据库表中的数据进行增删改
  • DQL: 数据查询语言,用来查询数据库中表的记录
  • DCL: 数据控制语言,用来创建数据库用户、控制数据库的访问权限。

1.1 DDL-数据库操作

查询所有数据库

show databases;

查询当前数据库

select database();

创建数据库

create database [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集] [COLLATE 排序规则];

create database school; ==》建库语句

create schema school1; ==》效果同上

create database school2 charset utf8; ==》设置字符集

create database school3 charset utf8mb4 collate utf8mb4_bin; ==》字符集及对应校对规则

查看当前数据库支持的所有字符集

show charset;

查看字符集所支持的校对规则

show collation;

删除数据库

drop database [IF EXISTS] 数据库名;

切换数据库

use 数据库名;

1.1.1 DDL-表操作-查询

查询当前数据库所有表

show tables;

查询表结构

desc 表名;

查询指定表的建表语句

show create table 表名;

1.1.2 DDL-表操作-创建

create table 表名(

字段1 字段1类型 [comment 字段1注释],

字段2 字段2类型 [comment 字段2注释],

字段3 字段3类型 [comment 字段3注释],

......

字段n 字段n类型 [comment 字段n注释]

) [comment 表注释];

1.1.3 DDL-表操作-数据类型及案例

主要分三类:数值类型、字符串类型、日期时间类型

create table emp(

id int comment '编号',

workno varchar(10) comment '工号',

name varchar(10) comment '姓名',

gender char(1) comment '性别',

age tinyint unsigned comment '年龄',

idcard char(18) comment '身份证号',

entrydate date comment '入职时间'

) comment '员工表';

1.1.4 DDL-表操作-修改

添加字段

alter table 表名 add 字段名 类型(长度) [comment 注释] [约束];

alter table emp add nickname varchar(20) comment '昵称';

修改数据类型

alter table 表名 modify 字段名 新数据类型(长度);

修改字段名和字段类型

alter table 表名 change 旧字段名 新字段名 类型(长度) [comment 注释] [约束];

alter table emp change nickname username varchar(30) comment '用户名';

删除字段

alter table 表名 drop 字段名;

alter table emp drop username;

修改表名

alter table 表名 rename to 新表名;

alter table emp rename to employee;

1.1.5 DDL-表操作-删除

删除表

drop table [if exists] 表名;

drop table if exists t_user;

删除指定表,并重新创建该表

truncate table 表名;

truncate table t_user;

1.2 DML操作

1.2.1 DML-添加数据

给指定字段添加数据

insert into 表名(字段名1,字段名2,...) values (值1,值2,...);

insert into employee(id,workno,name,gender,age,idcard,entrydate) values (1,'1','itcast','男',10,'123456789012345678','2023-01-01');

给全部字段添加数据

insert into 表名 values(值1,值2,...);

insert into employee values (2,'2','灭绝师太','女',48,'123456789012345670','2023-03-03');

批量添加数据

insert into 表名(字段名1,字段名2,...) values (值1,值2,...),(值1,值2,...),(值1,值2,...);

insert into 表名 values (值1,值2,...),(值1,值2,...),(值1,值2,...);

1.2.2 DML-修改数据

update 表名 set 字段名1=值1,字段名2=值2,... [where 条件];

update employee set name = 'itheima' where id = 1;

update employee set name = '阿紫', gender = '女' where id = 1;

update employee set entrydate = '2023-03-08';

1.2.3 DML-删除数据

delete from 表名 [where 条件];

delete from employee where gender = '女';

delete from employee;

1.3 DQL-语法

select

字段列表

from

表名列表

where

条件列表

group by

分组字段列表

having

分组后条件列表

order by

排序字段列表

limit

分页参数

1.3.1 DQL-基本查询

查询多个字段

select 字段1,字段2,字段3,... from 表名;

select name,workno,age from employee;

select * from 表名;

select * from employee;

设置别名

select 字段1 [as 别名1],字段2 [as 别名2] ... from 表名;

select workaddress as '工作地址' from employee;

去除重复记录

select distinct 字段列表 from 表名;

select distinct workaddress from employee;

1.3.2 DQL-条件查询

语法

select 字段列表 from 表名 where 条件列表;

查询年龄等于18或20或40的员工

select * from emp where age in(18,20,40);

查询姓名为两个字的员工信息

select * from emp where name like '__';

查询身份证号最后一位是X的员工信息

select * from emp where idcard like '%X';

1.3.3 DQL-聚合函数

将一列数据作为一个整体,进行纵向计算。

select 聚合函数(字段列表) from 表名;

1.3.4 DQL-分组查询

select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];

where与having的区别

执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。

判断条件不同:where不能对聚合函数进行判断,而having可以。

根据性别分组,统计男性员工和女性员工的数量

select gender,count(*) from emp group by gender;

查询年龄小于45的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址

select workaddress,count(*) from emp where age < 45 group by workaddress having count(*) >= 3;

1.3.5 DQL-排序查询

语法

select 字段列表 from 表名 order by 字段1 排序方式1,字段2 排序方式2;

排序方式

asc:升序(默认值)

desc:降序

根据年龄对公司的员工进行升序排序,年龄相同,再按照入职时间进行降序排序。

select * from emp order by age asc,entrydate desc;

1.3.6 DQL-分页查询

语法

select 字段列表 from 表名 limit 起始索引,查询记录数;

起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数

查询第二页员工数据,每页展示10条记录

select * from emp limit 10,10;

1.3.7 DQL-执行顺序

from

表名列表

where

条件列表

group by

分组字段列表

having

分组后条件列表

select

字段列表

order by

排序字段列表

limit

分页参数

1.4 DCL-管理用户

查询用户

use mysql;

select * from user;

创建用户

create user '用户名@主机名' identified by '密码';

修改用户密码

alter user '用户名@主机名' identified with mysql_native_password by '新密码';

删除用户

drop user '用户名@主机名';

1.4.1 DCL-权限控制

查询权限

show grants for '用户名@主机名';

授予权限

grant 权限列表 on 数据库名.表名 to '用户名@主机名';

撤销权限

revoke 权限列表 on 数据库名.表名 from '用户名@主机名';

二、总结

一条SQL语句执行的过程

连接层:

提供连接协议:TCP/IP、Socket

提供验证:用户名、密码、IP、SOCKET

提供专用连接线程:接收用户SQL,返回结果

查看连接线程基本情况

show processlist;

SQL层:

接收上层传送的SQL语句

语法验证模块:验证语句语法是否满足SQL_MODE

语义检查:判断SQL语句的类型

DDL:数据定义语言

DCL: 数据控制语言

DML:数据操作语言

DQL: 数据查询语言

权限检查:用户对库表有没有权限

解析器:在语句执行前,进行预处理,生成解析树(执行计划),说白了就是生成多种执行方案。

优化器:根据解析器得出的多种执行计划,进行判断,选择最优的执行计划

代价模型:资源(CPU IO MEM)的耗损评估性能好坏

执行器:根据最优执行计划,执行SQL语句,产生执行结果

执行结果在磁盘的xxx位置上

提供查询缓存(默认是没有开启的),会使用redis tair替代查询缓存功能

提供日志记录(日志管理章节):binlog,默认是没开启的。

存储引擎层

负责根据SQL层执行的结果,从磁盘上拿数据。

将16进制的磁盘数据,交由SQL结构化化成表

连接层的专用线程返回给用户。

至此,SQL语句梳理完成,看到这里的小伙伴点个赞吧。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言