当前位置: 首页 > news >正文

【数据库复习】SQL语言

一、SQL通用语法与分类

(一)SQL通用语法

SQL语句的格式通常较为规范,以关键字开头,如CREATE、SELECT、INSERT等,后跟具体的表名、字段名和条件等。在MySQL中,还可以使用help命令获取帮助信息,例如:

help select;

该命令会返回SELECT语句的详细用法和参数说明,方便我们快速查阅。

(二)SQL分类

SQL主要分为以下几类:
DDL(Data Definition Language,数据定义语言):用于定义和修改数据库结构,如创建、修改和删除数据库和表。
DML(Data Manipulation Language,数据操纵语言):用于对数据库中的数据进行操作,如插入、更新和删除数据。
DQL(Data Query Language,数据查询语言):主要用于查询数据库中的数据,SELECT语句是其核心。
DCL(Data Control Language,数据控制语言):用于控制用户对数据库的访问权限,如授予和回收权限。

二、DDL:定义和管理数据库结构

(一)数据库操作

创建数据库
创建一个名为test的数据库,使用默认字符集:

create database test;

如果数据库已存在,为了避免报错,可以使用if not exists参数:

create database if not exists test;

创建一个名为caustudent的数据库,并指定字符集为utf8mb4:

Create database caustudent default charset utf8mb4;

切换数据库
在操作某个数据库下的表时,需要先切换到对应的数据库:

Use test;

(二)表操作

创建表
创建一个名为emp的员工表,包含员工编号、工号、姓名、性别、年龄、身份证号和入职时间等字段:

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 '身份证号',
workaddress varchar(30) comment '工作地址',
entrydate date comment '入职时间'
)comment '员工表';

插入数据
向emp表中插入多条员工数据:

insert into emp (id, workno, name,gender, age, idcard,workaddress,entrydate)
values(1,'1','柳岩','女',20,'123456789012345678','北京','2000-01-01'),
(2,'2','张无忌','男',18,'123456789012345670','北京','2005-09-01'),
(3,'3','韦一笑','男',38,'123456789712345670','上海','2005-08-01'),
(4,'4','赵敏','女',18,'123456757123845670','北京','2009-12-01'),
(5,'5','小昭','女',16,'123456769012345678','上海','2007-07-01'),
(6,'6','杨逍','男',28,'12345678931234567X','北京','2006-01-01'),
(7,'7','范瑶','男',40,'123456789212345670','北京','2005-05-01'),
(8,'8','黛绮丝','女',38,'123456157123645670','天津','2015-05-01'),
(9,'9','范凉凉','女',45,'123156789012345678','北京','2010-04-01'),
(10,'10','陈友谅','男',53,'123456789012345670','上海','2011-01-01'),
(11,'11','张士诚','男',55,'123567897123465670','江苏','2015-05-01'),
(12,'12','常遇春','男',32,'123446757152345670','北京','2004-02-01'),
(13,'13','张三丰','男',59,'123656789012345678','江苏','2020-11-01'),
(14,'14','灭绝','女',65,'123456719012345670','西安','2019-05-01'),
(15,'15','胡青牛','男',70,'12345674971234567X','西安','2018-04-01'),
(16,'16','周芷若','女',18,null,'北京','2012-06-01');

三、DML:数据操纵语言

(一)插入数据

插入单条记录
向emp表中插入一条员工数据:

insert into emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
values(17, '17', '新员工', '男', 25, '123456789012345678', '北京', '2023-01-01');

插入子查询结果
将一个查询结果插入到另一个表中(假设存在另一个表emp_backup):

insert into emp_backup select * from emp where age > 30;

(二)更新数据

更新单条记录
将id为1的员工姓名修改为柳岩岩:

update emp set name = '柳岩岩' where id = 1;

更新多条记录
将所有员工的入职日期修改为2023-01-01:

update emp set entrydate = '2023-01-01';

带子查询的更新
将workaddress为北京的员工年龄增加1岁:

update emp set age = age + 1 where workaddress = '北京';

(三)删除数据

删除单条记录
删除id为1的员工记录:

delete from emp where id = 1;

删除所有记录
删除emp表中的所有记录:

delete from emp;

注意:DELETE和TRUNCATE的区别:
DELETE支持条件删除,可以逐行删除满足条件的记录,且可以回滚,但速度较慢,会产生大量日志。
TRUNCATE直接清空整个表,速度更快,不会产生大量日志,但无法回滚,且不会触发触发器。
表的复制
复制表结构:

create table emp_copy like emp;

复制表数据:

insert into emp_copy select * from emp;

四、DQL:数据查询语言

(一)基本查询

查询指定字段
查询员工的姓名、工号和年龄:

select name, workno, age from emp;

查询所有字段
查询emp表中的所有字段:

select * from emp;

字段别名
查询员工的工作地址,并给字段起别名:

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

去重查询
查询公司员工的上班地址(不重复):

select distinct workaddress '工作地址' from emp;

(二)条件查询

比较运算符
查询年龄等于59岁的员工:

select * from emp where age = 59;

查询年龄小于20岁的员工信息:

select * from emp where age < 20;

查询没有身份证号的员工信息:

select * from emp where idcard is null;

查询有身份证号的员工信息:

select * from emp where idcard is not null;

查询年龄不等于59岁的员工:

select * from emp where age != 59;

查询性别为女且年龄小于25岁的员工信息:

select * from emp where gender = '女' and age < 25;

范围查询
查询年龄在15岁到20岁之间的员工信息:

select * from emp where age between 15 and 20;

查询年龄等于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';

(三)聚合函数

统计数量
统计公司员工总数:

select count(*) from emp;

平均值
统计公司员工的平均年龄:

select avg(age) from emp;

最大值
查询公司员工的最大年龄:

select max(age) from emp;

最小值
查询公司员工的最小年龄:

select min(age) from emp;

求和
统计北京地区员工的年龄之和:

select sum(age) from emp where workaddress = '北京';

(四)分组查询

按性别分组统计员工数量
查询男性员工和女性员工的数量:

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

按性别分组统计平均年龄
查询男性员工和女性员工的平均年龄:

select gender, avg(age) from emp group by gender;

按工作地址分组统计员工数量
查询年龄小于45岁的员工,并按工作地址分组,获取员工数量大于等于3的工作地址:

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

多字段分组
统计各个工作地址的男性和女性员工数量:

select workaddress, gender, count(*) '数量' from emp group by gender, workaddress;

(五)排序与分页

排序
查询所有员工,按年龄升序排序:

select * from emp order by age asc;

查询所有员工,按年龄升序排序,如果年龄相同则按入职时间降序排序:

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

分页
查询第一页员工数据,每页显示10条记录:

select * from emp limit 0, 10;

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

select * from emp limit 10, 10;

五、DCL:数据控制语言

(一)用户管理

查询用户
查询MySQL中的所有用户:

select * from mysql.user;

创建用户
创建一个名为test1的用户,不限制访问主机,无需密码:

CREATE USER 'test1'@'%';

创建一个名为test2的用户,只能从本地主机访问,密码为123456:

CREATE USER 'test2'@'localhost' IDENTIFIED BY '123456';

设置用户密码
为用户test1设置密码123456:

ALTER USER 'test1'@'%' IDENTIFIED BY '123456';

删除用户
删除用户test1:

DROP USER 'test1'@'%';

(二)权限管理

查看权限
查看用户root和test1的授权情况:

SHOW GRANTS FOR 'root'@'localhost';
SHOW GRANTS FOR 'test1'@'%';

授予权限
授予用户test1对student数据库的SELECT和INSERT权限:

GRANT SELECT, INSERT ON student.* TO 'test1'@'%';

回收权限
回收用户test1对student数据库的INSERT权限:

REVOKE INSERT ON student.* FROM 'test1'@'%';

刷新权限
刷新权限,使更改立即生效:

FLUSH PRIVILEGES;

六、MySQL函数

(一)字符串函数

字符串拼接
将两个字符串拼接成一个字符串:

select concat('Hello', ' MySQL');

转换为小写
将字符串转换为小写:

select lower('Hello');

转换为大写
将字符串转换为大写:

select upper('Hello');

左填充
用指定字符对字符串进行左填充,达到指定长度:

select lpad('01', 5, '-');

右填充
用指定字符对字符串进行右填充,达到指定长度:

select rpad('01', 5, '-');

去除空格
去掉字符串头部和尾部的空格:

select trim(' Hello MySQL ');

子字符串
返回字符串从指定位置开始的指定长度的子字符串:

select substring('Hello MySQL', 1, 5);

(二)数值函数

向上取整
对数值向上取整:

select ceil(1.1);

向下取整
对数值向下取整:

select floor(1.9);

求模
返回两个数值相除的余数:

select mod(7, 4);

随机数
返回0到1之间的随机数:

select rand();

四舍五入
对数值进行四舍五入,并保留指定的小数位数:

select round(2.344, 2);

(三)日期函数

当前日期
返回当前日期:

select curdate();

当前时间
返回当前时间:

select curtime();

当前日期和时间
返回当前日期和时间:

select now();

获取年份
获取指定日期的年份:

select year(now());

获取月份
获取指定日期的月份:

select month(now());

获取日期
获取指定日期的日期:

select day(now());

日期加法
返回指定日期加上指定时间间隔后的日期:

select date_add(now(), interval 70 year);

日期差
返回两个日期之间的天数差:

select datediff('2021-10-01', '2021-12-01');

(四)流程函数

条件判断
根据条件返回不同的值:

select if(false, 'Ok', 'Error');

空值判断
如果第一个值不为空,则返回第一个值,否则返回第二个值:

select ifnull('', 'Default');

多条件判断
根据多个条件返回不同的值:

select name, (case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end) as '工作地址' from emp;

七、实战案例

(一)成绩等级评定

假设我们有一个学生成绩表score,包含学生姓名、数学、英语和语文成绩。我们希望根据成绩评定等级,并在查询结果中显示。
创建成绩表

create table score(
id int comment 'ID',
name varchar(20) comment '姓名',
math int comment '数学',
english int comment '英语',
chinese int comment '语文'
)comment '学员成绩表';

插入测试数据

insert into score(id, name, math, english, chinese) VALUES
(1, 'Tom', 67, 88, 95),
(2, 'Rose', 23, 66, 90),
(3, 'Jack', 56, 98, 76);

查询成绩等级

select id, name,
(case when math >= 85 then '优秀' when math >= 60 then '及格' else '不及格' end) as '数学',
(case when english >= 85 then '优秀' when english >= 60 then '及格' else '不及格' end) as '英语',
(case when chinese >= 85 then '优秀' when chinese >= 60 then '及格' else '不及格' end) as '语文'
from score;

八、总结

本文从SQL的基础语法讲起,逐步深入到数据查询、用户权限管理以及MySQL函数的使用,涵盖了SQL语言的各个方面。通过大量的代码示例和实战案例,读者可以快速掌握SQL的核心知识,并应用于实际工作中。

相关文章:

  • 联邦+反射器 基础实验
  • Android学习总结之Glide自定义三级缓存(实战篇)
  • Android Activity之间跳转的原理
  • 【更新】全国省市县-公开手机基站数据集(2006-2025.3)
  • HarmonyOS NEXT~React Native在鸿蒙系统(HarmonyOS)上的适配现状与技术展望
  • 人工智能外呼系统:重构智能交互的全维度进化
  • 观成科技:加密C2框架Vshell流量分析
  • Flink SQL 将kafka topic的数据写到另外一个topic里面
  • PyQt5基本窗口控件(QComboBox(下拉列表框))
  • Webpack其他插件
  • 【计算机网络】TLS中的对称加密和非对称加密的应用,应对第三方抓包的双向https认证
  • 数据库系统概论|第七章:数据库设计—课程笔记
  • 计算机网络-MPLS VPN基础概念
  • 如何设置FFmpeg实现对高分辨率视频进行转码
  • 高速数字测试利器,新款是德科技UXR0504B示波器
  • 多模态和多智能体系统与理性的结合综述研究
  • 2天长沙旅游规划
  • MFC 调用海康相机进行软触发
  • 【ROS】将Qt的Pro工程转换到ROS2的colcon
  • 【springcloud学习(dalston.sr1)】使用Feign实现接口调用(八)
  • 黄仕忠丨戏曲文献研究之回顾与展望
  • 外企聊营商|波音速度:创新审批促“起飞”
  • 何立峰:中方坚定支持多边主义和自由贸易,支持世贸组织在全球经济治理中发挥更大作用
  • 鄂州:锁死中小学教师编制总量,核减小学编制五百名增至初中
  • 高龄老人骨折后,生死可能就在家属一念之间
  • 总粉丝破亿!当网络大V遇见硬核科技,互联网时代如何书写上海故事?