MYSQL基本语法使用

news/2025/4/1 23:50:35/

目录

mysql%E4%B9%8BDML-toc" name="tableOfContents" style="margin-left:0px">一、mysql之DML

增加语句

删除语句和truncate

更新语句

replace语句

select查询语句

二、select多种用法

查询时的别名使用

分组

分组后的筛选

结果排序

分页功能

分表

多表关联查询

练习题

一、单表查询

二、多表查询


前面已经学习了mysql的安装和基本语法,接下来我们继续学习其他的mysql基本语法是如何使用的

mysql%E4%B9%8BDML" name="%E4%B8%80%E3%80%81mysql%E4%B9%8BDML">一、mysql之DML

增加语句

#语法
insert INTO table_name[(field1 [, field2 ……]) values(value1 [, vaule2 ……])  [,()]];
-- 插入多条数据 --
insert into t_user(id passwd) values(1,"123"),(2,"234"),(3,"345")

示例:

删除语句和truncate

删除语言,请注意删除的条件!!!如果不带条件,则删除全表。

delete from table_name [where 条件];
truncate table table_name;

示例:

-- 如果没有条件,则清空全数据包【慎重!!】
delete from user;

-- truncate清空全表【注意:truncate删除数据是不经过数据字典】
truncate table students;

更新语句

更新就是修改表中的数据

#语法结构
update table_name set 字段1=新值 [, 字段2=新值, 字段3=字段3 + 1]   [where 条件];

示例:

#其他示例
update user_1 set age=20,password="root" where id=2;
update user_1 set age=age+1;

replace语句

该语句是集更新和插入为一体的语句;

如果表中没有这条数据,则执行插入,否则执行更新;

⚠️注意:replace的更新,本质是先删除,再插入

replace into user_1 (id,name) values(10,"test");

select查询语句

在开发中,查询语句是使用最多,也是CRUD中,复杂度最高的sql语句

#查询语法结构
select *|字段1 [, 字段2 ……] from 表名称 [, 表名称2……] [where 条件] [group by 字段 [having 分组后的筛选]] [order by 字段 [desc|asc] [字段2 [desc|asc] ……]] [limit 分页]-- 查询所有数据
select * from user_1;-- 查询需要的字段信息
select id,name,password from user_1;-- 查询一个字段,一个等值条件
select name from user_1 where id=1;#等值查询select password from user_1 where name="李四";

 select语句中的特殊情况:

对数值型数据列、变量、常量可以使用算数操作符创建表达式(+ - * /)

对日期型数据列、变量、常量可以使用部分算数操作符创建表达式(+ -)

运算符不仅可以在列和常量之间进行运算,也可以在多列之间进行运算。

SELECT last_name, salary, salary*12 FROM employees;

二、select多种用法

查询时的别名使用

select count(*) from test
select count(*) as 总人数 from test

分组

group by 字段

select gender from test group by gender;
select gender, count(gender) from test group by gender;

分组后的筛选

select gender,count(gender) from test group by gender having count(gender) > 5

结果排序

将查询结果,以特定的顺序展示(升序或者降序)

# 语法结构
order by 字段 
order by 字段 asc|desc;
order by 字段 asc|desc, 字段2 ;

分页功能

select语句,查询数据时,可能结果会非常多,此时就不能直接展示,分页展示。

总数量(all_data):查询 select count(*)

每页展示的数量(page_size):程序员定

当前页(cur_page):默认第一页,用户自己点击选择

总页数(all_page):总数量 % 每页的数量 == 0 整除后的商 : 商 + 1

limit num  # 查询多少条limit num1, num2; # num1: 偏移量, num2 : 每页的数量  limit cur_page * (page_size - 1), page_size;

分表

数据直接都存储在一张表中:

  • 如果数据很大,性能会出现问题

  • 将不同的数据,如果放在同一个表中,可能数据冗余

  • 数据冗余,会导致数据可能出错

将不同的类型,采用不同的数据表进行存储,如果两张表或者多张表之间存在关联关系,则可以采用外键来描述这种关联关系。

主表中,一般是一个字段,改字段一般是从表的主键。

create table grade(id int auto_increment,name varchar(50) unique,primary key (id)
);insert into grade(name) value("java精品班"),("python数据分析班"),("网络安全班"),("云原生高级班");create table student(id int primary key auto_increment,name varchar(50) unique,gender enum("F","M"),age int default 18,address varchar(255),class_id int
);

#插入一些数据
insert into student(name, class_id) values("小明", 1);
insert into student(name, class_id) values("小红", 2);
insert into student(name, class_id) values("小谢", 1);
insert into student(name, class_id) values("小高", 3);
insert into student(name, class_id) values("小紫", 1);
insert into student(name, class_id) values("小兰", 4);

-- 此时,插入了一条错误数据,该数据描述的外键不存在,是一条脏数据!!!
insert into student(name, class_id) values("小黑666", 44);
## 如果要避免出现这种情况,必须加入外键约束!

多表关联查询

select *|字段 [,……] from 表名称 [,表名称] ……-- 交叉连接(cross join)
-- 在查询多表时,不指定表的关联关系,数据只能全部匹配
-- 引发笛卡尔积现象
select * from student, grade;-- sql98的标准写法
select * from student cross join grade;

#内连接
select * from student, grade where student.class_id = grade.id;
select * from student, grade where student.class_id = grade.id and student.name = "小明";

练习题

一、单表查询

素材: 表名:worker-- 表中字段均为中文,比如 部门号 工资 职工号 参加工作 等
CREATE TABLE `worker` (`部门号` int(11) NOT NULL,`职工号` int(11) NOT NULL,`工作时间` date NOT NULL,`工资` float(8,2) NOT NULL,`政治面貌` varchar(10) NOT NULL DEFAULT '群众',`姓名` varchar(20) NOT NULL,`出生日期` date NOT NULL,PRIMARY KEY (`职工号`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;INSERT INTO `worker` (`部门号`, `职工号`, `工作时间`, `工资`, `政治面貌`, `姓名`, `出生日期`) VALUES (101, 1001, '2015-5-4', 3500.00, '群众', '张三', '1990-7-1');
INSERT INTO `worker` (`部门号`, `职工号`, `工作时间`, `工资`, `政治面貌`, `姓名`, `出生日期`) VALUES (101, 1002, '2017-2-6', 3200.00, '团员', '李四', '1997-2-8');
INSERT INTO `worker` (`部门号`, `职工号`, `工作时间`, `工资`, `政治面貌`, `姓名`, `出生日期`) VALUES (102, 1003, '2011-1-4', 8500.00, '党员', '王亮', '1983-6-8');
INSERT INTO `worker` (`部门号`, `职工号`, `工作时间`, `工资`, `政治面貌`, `姓名`, `出生日期`) VALUES (102, 1004, '2016-10-10', 5500.00, '群众', '赵六', '1994-9-5');
INSERT INTO `worker` (`部门号`, `职工号`, `工作时间`, `工资`, `政治面貌`, `姓名`, `出生日期`) VALUES (102, 1005, '2014-4-1', 4800.00, '党员', '钱七', '1992-12-30');
INSERT INTO `worker` (`部门号`, `职工号`, `工作时间`, `工资`, `政治面貌`, `姓名`, `出生日期`) VALUES (102, 1006, '2017-5-5', 4500.00, '党员', '孙八', '1996-9-2');

要求:

1、显示所有职工的基本信息。
select*from worker;
2、查询所有职工所属部门的部门号,不显示重复的部门号。  
select distinct 部门号 from worker;
3、求出所有职工的人数。
select count(*) as 总人数 from worker;
4、列出最高工和最低工资。 
select max(工资),min(工资) from worker;
5、列出职工的平均工资和总工资。
select avg(工资),sum(工资) from worker;
6、创建一个只有职工号、姓名和参加工作的新表,名为工作日期表。 
create table workday(`职工号` int(11) primary key auto_increment,`姓名` varchar(10) unique,`参加工作` varchar(10)
);
7、显示所有女职工的年龄。 select name, age from worker where gender="女";
8、列出所有姓刘的职工的职工号、姓名和出生日期。
select 职工号,姓名,出生日期 from worker where 姓名 like "刘%";
9、列出1960年以前出生的职工的姓名、参加工作日期。
mysql> select 姓名,工作时间 from worker where 工作时间 <=1960-01-01;
10、列出工资在1000-2000之间的所有职工姓名。 
select 姓名  from worker where 工资 between 1000 and 2000;
11、列出所有陈姓和李姓的职工姓名。
select 姓名 from worker where 姓名 like "陈%" and 姓名 like "李%";
12、列出所有部门号为2和3的职工号、姓名、党员。
select 职工号, 姓名,政治面貌 from worker where 部门号 between 2 and 3 and 政治面貌 = "党员";
13、将职工表worker中的职工按出生的先后顺序排序。
select*from worker order by 出生日期 asc;
14、显示工资最高的前3名职工的职工号和姓名。 
select*from worker order by 工资 desc limit 3;
15、求出各部门党员的人数。 
select 部门号,sum(政治面貌="党员") as 党员人数 from worker group by 部门号;
16、统计各部门的工资和平均工资
select 部门号,sum(工资) as 总工资, avg(工资) as 平均工资 from worker group by 部门号;
17、列出总人数大于4的部门号和总人数
select 部门号,count(*) as 总人数 from worker group by 部门号 having count(*) > 4;

二、多表查询

1.创建student和score表
CREATE  TABLE student (
id  INT(10)  NOT NULL  UNIQUE  PRIMARY KEY ,
name  VARCHAR(20)  NOT NULL ,
sex  VARCHAR(4) ,
birth  YEAR,
department  VARCHAR(20) ,
address  VARCHAR(50)
);创建score表。SQL代码如下:
CREATE  TABLE score (
id  INT(10)  NOT NULL  UNIQUE  PRIMARY KEY  AUTO_INCREMENT ,
stu_id  INT(10)  NOT NULL ,
c_name  VARCHAR(20) ,
grade  INT(10)
);2.为student表和score表增加记录
向student表插入记录的INSERT语句如下:
INSERT INTO student VALUES( 901,'张老大', '男',1985,'计算机系', '北京市海淀区');
INSERT INTO student VALUES( 902,'张老二', '男',1986,'中文系', '北京市昌平区');
INSERT INTO student VALUES( 903,'张三', '女',1990,'中文系', '湖南省永州市');
INSERT INTO student VALUES( 904,'李四', '男',1990,'英语系', '辽宁省阜新市');
INSERT INTO student VALUES( 905,'王五', '女',1991,'英语系', '福建省厦门市');
INSERT INTO student VALUES( 906,'王六', '男',1988,'计算机系', '湖南省衡阳市');向score表插入记录的INSERT语句如下:
INSERT INTO score VALUES(NULL,901, '计算机',98);
INSERT INTO score VALUES(NULL,901, '英语', 80);
INSERT INTO score VALUES(NULL,902, '计算机',65);
INSERT INTO score VALUES(NULL,902, '中文',88);
INSERT INTO score VALUES(NULL,903, '中文',95);
INSERT INTO score VALUES(NULL,904, '计算机',70);
INSERT INTO score VALUES(NULL,904, '英语',92);
INSERT INTO score VALUES(NULL,905, '英语',94);
INSERT INTO score VALUES(NULL,906, '计算机',90);
INSERT INTO score VALUES(NULL,906, '英语',85);

要求:

3.查询student表的所有记录
select*from student;
4.查询student表的第2条到4条记录
select*from student limit 1,4;
5.从student表查询所有学生的学号(id)、姓名(name)和院系(department)的信息
mysql> select id,name,department from student;
6.从student表中查询计算机系和英语系的学生的信息
select*from student where department ="计算机系" or department="英语系";
7.从student表中查询年龄18~22岁的学生信息
select*from student where age between 18 and 22;
8.从student表中查询每个院系有多少人
select department,count(department) as 人数 from student group by department; 
9.从score表中查询每个科目的最高分
select c_name,max(grade) from score group by c_name;
10.查询李四的考试科目(c_name)和考试成绩(grade)
select c_name,grade from student,score where student.id=score.stu_id and student.name="李四";
11.用连接的方式查询所有学生的信息和考试信息
select*from student,score;
12.计算每个学生的总成绩
select student.name as 姓名, sum(score.grade) as 总成绩 from student join score on student.id=score.stu_id group by student.id,student.name;
13.计算每个考试科目的平均成绩
select c_name ,avg(grade) from score group by c_name;
14.查询计算机成绩低于95的学生信息
select*from student join score on (student.id=score.stu_id) where grade <95 and c_name="计算机";
15.查询同时参加计算机和英语考试的学生的信息
select*from student join score on (student.id=score.stu_id) where c_name="计算机" or c_name="英语" and ;
16.将计算机考试成绩按从高到低进行排序
select grade as 计算机成绩 from score where c_name="计算机" order by grade desc ;
17.从student表和score表中查询出学生的学号,然后合并查询结果
select id as 学号 from student union select stu_id as 学号 from score order by 学号;
18.查询姓张或者姓王的同学的姓名、院系和考试科目及成绩
select name,department,c_name,grade from student join score on (student.id=score.stu_id) where student.name like "张老六" or student.name like "王%";
19.查询都是湖南的学生的姓名、年龄、院系和考试科目及成绩
select name,(YEAR(CURDATE()) - birth) as 年龄,department,c_name as 考试科目,grade as 成绩 from student join score on(student.id=score.stu_id) and address like "湖南%";


http://www.ppmy.cn/news/1583697.html

相关文章

MySQL数据库精研之旅第四期:解锁库操作高阶技能

专栏&#xff1a;MySQL数据库成长记 个人主页&#xff1a;手握风云 目录 一、查看所有表 1.1. 语法 二、创建表 2.1. 语法 2.2. 示例 2.3. 表在磁盘上对应的⽂件 三、查看表结构 3.1. 语法 3.2. 示例 四、修改表 4.1. 语法 4.2. 示例 五、删除表 5.1. 语法 5.2.…

PETR学习笔记

论文地址&#xff1a;2203.05625 (arxiv.org) 代码地址&#xff1a;megvii-research/PETR: [ECCV2022] PETR: Position Embedding Transformation for Multi-View 3D Object Detection & [ICCV2023] PETRv2: A Unified Framework for 3D Perception from Multi-Camera Imag…

瑞数信息《BOTS自动化威胁报告》正式发布

在数字化时代&#xff0c;BOTS自动化攻击如同一场无声的风暴&#xff0c;正以前所未有的态势席卷全球网络空间。为了让各行业更好地应对自动化威胁挑战&#xff0c;瑞数信息作为BOTS自动化攻击防护领域的专业厂商&#xff0c;多年来持续输出BOTS自动化威胁报告&#xff0c;为各…

电动自行车/电动工具锂电池PCM方案--SH367003、SH367004、SH79F329

在消费电子系统中&#xff0c;如手机电池包&#xff0c;笔记本电脑电池包等&#xff0c;带有控制IC、功率MOSFETFE管以及其他电子元件的电路系统称为电池充放电保护板Protection Circuit Module &#xff08;PCM&#xff09;&#xff0c;而对于动力电池的电池管理系统&#xff…

【Matlab笔记_22】Matlab地图矩阵左右置换

有时候需要对矩阵进行左右置换&#xff0c;而非左右翻转&#xff0c;如地理经度数据重组&#xff0c;可以通过以下简单的代码实现 计算列数 numCols size(A, 2);获取输入矩阵 A 的列数&#xff0c;结果保存在 numCols 变量中。 确定中间列索引 midCol ceil(numCols / 2);通过…

LLM之Agent(十四)| 字节开源ComputerUse纯视觉驱动GUI 智能体模型 UI-TARS

Agent TARS 是字节跳动于 2025 年 3 月开源的多模态 AI 智能体&#xff0c;它能够像人类一样操作电脑、手机和网页&#xff0c;完成各种复杂任务。以下是其详细介绍&#xff1a; 一、简介 Agent TARS 是一款开源的多模态 AI 智能体&#xff0c;能够基于视觉理解网页内容&#…

高效内存管理:x86-64架构中的分页机制

在 x86-64 架构的世界里&#xff0c;内存分页机制扮演着举足轻重的角色&#xff0c;它就像是一座桥梁&#xff0c;连接着虚拟地址与物理地址。简单来说&#xff0c;内存分页机制就是将线性地址&#xff08;也就是虚拟地址&#xff09;切分成一个个固定大小的页&#xff0c;并把…

稳健投资新标杆,云济会布局国库券回购助推金融市场优化

【2025年3月21日】近日&#xff0c;云济会正式宣布启动其首个国库券回购计划&#xff0c;引发业内外广泛关注。这一举措被视为云济会积极响应国家经济战略、助推新中产财富管理升级的重要一步&#xff0c;也标志着新中产资本正以更高效、更稳健的方式深度融入国家金融体系。 据…