Mysql基础【操作表中数据入门查询】

一、DML

DML主要是对数据进行增(insert)删(delete)改(update)操作。

(一)、添加数据

语法格式:

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

create table
Student

insert into Student  (id,name,age) values(1,"dongtianchi",18);
insert into Student  (id,name,age) values(2,"fengxudong",19);

Mysql基础【操作表中数据入门查询】_第1张图片

案例

表名:student
 表中字段: 
 学员ID, sid int 
 姓名, sname varchar(20) 
 年龄, age int 
 性别, sex char(1) 
 地址, address varchar(40) 
 # 创建学生表 
 CREATE TABLE student( 
   sid INT, 
   sname VARCHAR(20), 
   age INT, 
   sex CHAR(1), 
   address VARCHAR(40) 
 ); 

向学生表中添加数据,3种方式
方式1: 插入全部字段, 将所有字段名都写出来

INSERT INTO student (sid,sname,age,sex,address) 
VALUES(1,'孙悟空',20,'男','花果山'); 

方式2: 插入全部字段,不写字段名

INSERT INTO student VALUES(2,'孙悟饭',10,'男','地球'); 

方式3:插入指定字段的值

INSERT INTO category (cname) VALUES('白骨精'); 

批量添加数据

 INSERT INTO 表名(列名1,列名2,) VALUES(1,2,),(1,2,),(1,2,);
 INSERT INTO 表名 VALUES(1,2,),(1,2,),(1,2,);

INSERT INTO student VALUES
(2,'孙悟饭',10,'男','地球'),
(3,'孙悟饭1',10,'男','地球'); 

(二)、 修改数据

语法格式1:不带条件的修改

update 表名 set 列名 =

语法格式2:带条件的修改

update 表名 set 列名 =[where 条件表达式:字段名 =]

1)不带条件修改,将所有的性别改为女(慎用!!)

UPDATE student SET sex = '女';

2)带条件的修改,将sid 为3的学生,性别改为男

UPDATE student SET sex = '男' WHERE sid = 3;

3)一次修改多个列, 将sid为 2 的学员,年龄改为 20,地址改为 北京

UPDATE student SET age = 20,address = '北京' WHERE sid = 2; 

(三)、 删除数据

删除数据

 DELETE FROM 表名 [WHERE 条件] ;

1)删除 sid 为 1 的数据

DELETE FROM student WHERE sid = 1;
  1. 删除所有数据
DELETE FROM student; 
  1. 如果要删除表中的所有数据,有两种做法
  1. delete from 表名; 不推荐. 有多少条记录 就执行多少次删除操作. 效率低
  2. truncate table 表名: 推荐. 先删除整张表, 然后再重新创建一张一模一样的表. 效率高
truncate table student; 

二、 DQL 查询表中数据

DQL:查询语法

SELECT 
    字段列表(想要查询的字段)
FROM 
    表名列表 (来源表) 
WHERE 
    条件列表 
GROUP BY
    分组字段  
HAVING
    分组后条件
ORDER BY
    排序字段
LIMIT
    分页限定

准备初试数据

#创建员工表
  表名 emp
  表中字段:
  eid 员工id,int
  ename 姓名,varchar
  sex 性别,char
  salary 薪资,double
  hire_date 入职时间,date
  dept_name 部门名称,varchar
  
# 删除emp表
drop table if exists emp;
#创建员工表
CREATE TABLE emp(
  eid INT,
  ename VARCHAR(20),
  sex CHAR(1),
  salary DOUBLE,
  hire_date DATE,
  dept_name VARCHAR(20)
);
#添加数据
INSERT INTO emp VALUES(1,'孙悟空','男',7200,'2013-02-04','教学部');
INSERT INTO emp VALUES(2,'猪八戒','男',3600,'2010-12-02','教学部');
INSERT INTO emp VALUES(3,'唐僧','男',9000,'2022-09-08','教学部');
INSERT INTO emp VALUES(4,'白骨精','女',5000,'2022-10-07','市场部');
INSERT INTO emp VALUES(5,'蜘蛛精','女',5000,'2022-09-14','市场部');
INSERT INTO emp VALUES(6,'玉兔精','女',200,'2022-03-14','市场部');
INSERT INTO emp VALUES(7,'林黛玉','女',10000,'2019-10-07','财务部');
INSERT INTO emp VALUES(8,'黄蓉','女',3500,'2022-09-14','财务部');
INSERT INTO emp VALUES(9,'吴承恩','男',20000,'2022-03-14',NULL);
INSERT INTO emp VALUES(10,'孙悟饭','男', 10,'2020-03-14','财务部');
INSERT INTO emp VALUES(11,'兔八哥','女', 300,'2022-03-14','财务部');

(一)、 简单查询

  • 查询多个字段
 SELECT 字段列表 FROM 表名;
 SELECT * FROM 表名; -- 查询所有数据
  • 去除重复记录
SELECT DISTINCT 字段列表 FROM 表名;
  • 起别名
 AS: AS 也可以省略
  1. 查询emp中的 所有数据
SELECT * FROM emp; -- 使用 * 表示所有列
  1. 查询emp表中的所有记录,仅显示id和name字段
SELECT eid,ename FROM emp; 
  1. 将所有的员工信息查询出来,并将列名改为中文
# 使用 AS关键字,为列起别名
SELECT
  eid AS '编号',
  ename AS '姓名' ,
  sex AS '性别',
  salary AS '薪资',
  hire_date '入职时间', -- AS 可以省略
  dept_name '部门名称'
FROM emp;
  1. 查询一共有几个部门
使用去重关键字 distinct
-- 使用distinct 关键字,去掉重复部门信息 
SELECT DISTINCT dept_name FROM emp; 

  1. 将所有员工的工资 +1000 元进行显示
SELECT ename , salary + 1000 FROM emp

(二)、 条件查询

1) 语法

 SELECT 字段列表 FROM 表名 WHERE 条件列表;

条件
条件列表可以使用以下运算符

Mysql基础【操作表中数据入门查询】_第2张图片

2) 条件查询练习

# 查询员工姓名为黄蓉的员工信息
# 查询薪水价格为5000的员工信息
# 查询薪水价格不是5000的所有员工信息
# 查询薪水价格大于6000元的所有员工信息
# 查询薪水价格在500010000之间所有员工信息
# 查询薪水价格是36007200或者20000的所有员工信息

代码实现

# 查询员工姓名为黄蓉的员工信息
SELECT * FROM emp WHERE ename = '黄蓉';
# 查询薪水价格为5000的员工信息
SELECT * FROM emp WHERE salary = 5000;
# 查询薪水价格不是5000的所有员工信息
SELECT * FROM emp WHERE salary != 5000;
SELECT * FROM emp WHERE salary <> 5000;
# 查询薪水价格大于6000元的所有员工信息
SELECT * FROM emp WHERE salary > 6000;
# 查询薪水价格在500010000之间所有员工信息
SELECT * FROM emp WHERE salary BETWEEN 5000 AND 10000;
# 查询薪水价格是36007200或者20000的所有员工信息
-- 方式1: or
SELECT * FROM emp WHERE salary = 3600 OR salary = 7200 OR salary = 20000;
-- 方式2: in() 匹配括号中指定的参数
SELECT * FROM emp WHERE salary IN(3600,7200,20000);

3)模糊查询练习

模糊查询使用like关键字,可以使用通配符进行占位:
(1)_ : 代表单个任意字符
(2)% : 代表任意个数字符

# 查询含有'精'字的所有员工信息
SELECT * FROM emp WHERE ename LIKE '%精%';
# 查询以'孙'开头的所有员工信息
SELECT * FROM emp WHERE ename LIKE '孙%';
# 查询第二个字为'兔'的所有员工信息
SELECT * FROM emp WHERE ename LIKE '_兔%';
# 查询没有部门的员工信息
SELECT * FROM emp WHERE dept_name IS NULL;
-- SELECT * FROM emp WHERE dept_name = NULL;
# 查询有部门的员工信息
SELECT * FROM emp WHERE dept_name IS NOT NULL;

(三)、排序查询

1)语法

 SELECT 字段列表 FROM 表名 ORDER BY 排序字段名1 [排序方式1],排序字段名2 [排序方式2];

上述语句中的排序方式有两种,分别是:

  • ASC : 升序排列 (默认值)
  • DESC : 降序排列

注意:如果有多个排序条件,当前边的条件值一样时,才会根据第二条件进行排序

2) 练习

  1. 单列排序
    使用 salary 字段,对emp 表数据进行排序 (升序/降序)
-- 默认升序排序 ASC
SELECT * FROM emp ORDER BY salary;
-- 降序排序
SELECT * FROM emp ORDER BY salary DESC;
  1. 组合排序
    同时对多个字段进行排序, 如果第一个字段相同 就按照第二个字段进行排序,以此类推
    在薪水排序的基础上,再使用id进行排序, 如果薪水相同就以id 做降序排序
-- 组合排序 
SELECT * FROM emp ORDER BY salary DESC, eid DESC; 

(四)、 聚合函数

1) 概念

之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对某一列的值进行计算,然后返回一个单一的值(另外聚合函数会忽略null空值。);

2) 聚合函数分类

Mysql基础【操作表中数据入门查询】_第3张图片

3) 聚合函数语法

 SELECT 聚合函数名(列名) FROM;

注意:null 值不参与所有聚合函数运算

4) 练习

#1 查询员工的总数
#2 查看员工总薪水、最高薪水、最小薪水、薪水的平均值
#3 查询薪水大于4000员工的个数
#4 查询部门为'教学部'的所有员工的个数
#5 查询部门为'市场部'所有员工的平均薪水

#1 查询员工的总数
-- 统计表中的记录条数 使用 count()
SELECT COUNT(eid) FROM emp; -- 使用某一个字段
SELECT COUNT(*) FROM emp; -- 使用 *
SELECT COUNT(1) FROM emp; -- 使用 1,* 效果一样
-- 下面这条SQL 得到的总条数不准确,因为count函数忽略了空值
-- 所以使用时注意不要使用带有null的列进行统计
SELECT COUNT(dept_name) FROM emp;
#2 查看员工总薪水、最高薪水、最小薪水、薪水的平均值
-- sum函数求和, max函数求最大, min函数求最小, avg函数求平均值
SELECT
SUM(salary) AS '总薪水',
MAX(salary) AS '最高薪水',
MIN(salary) AS '最低薪水',
AVG(salary) AS '平均薪水'
FROM emp;
#3 查询薪水大于4000员工的个数 
SELECT COUNT(*) FROM emp WHERE salary > 4000; 

#4 查询部门为'教学部'的所有员工的个数 
SELECT COUNT(*) FROM emp WHERE dept_name = '教学部'; 

#5 查询部门为'市场部'所有员工的平均薪水 
SELECT AVG(salary) AS '市场部平均薪资' FROM emp 
WHERE dept_name = '市场部';

(五)、 分组查询

1) 语法

 SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 [HAVING 分组后条件过滤];

注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义

-- 按照性别进行分组操作 
SELECT * FROM emp GROUP BY sex; -- 注意 这样写没有意义 

在这里插入图片描述

2) 练习

1.通过性别字段 进行分组,求各组的平均薪资

SELECT sex, AVG(salary) FROM emp GROUP BY sex;

2:

#1.查询所有部门信息 
#2.查询每个部门的平均薪资 
#3.查询每个部门的平均薪资, 部门名称不能为null 
#1. 查询有几个部门 
SELECT dept_name AS '部门名称' FROM emp GROUP BY dept_name; 
#2.查询每个部门的平均薪资 
SELECT dept_name AS '部门名称', AVG(salary) AS '平均薪资' FROM emp GROUP BY dept_name;

#3.查询每个部门的平均薪资, 部门名称不能为null 
SELECT dept_name AS '部门名称', 
AVG(salary) AS '平均薪资' 
FROM emp 
WHERE dept_name IS NOT NULL GROUP BY dept_name; 

3:

# 查询平均薪资大于6000的部门. 

分析:

  1. 需要在分组后,对数据进行过滤,使用 关键字 hiving
  2. 分组操作中的having子语句,是用于在分组后对数据进行过滤的,作用类似于where条件。

sql实现

# 查询平均薪资大于6000的部门 
-- 需要在分组后再次进行过滤,使用 having 
SELECT dept_name , AVG(salary) FROM emp 
WHERE dept_name IS NOT NULL GROUP BY dept_name 
HAVING AVG(salary) > 6000 ; 

where 和 having 区别:

  • 执行时机不一样:where 是分组之前进行限定,不满足where条件,则不参与分组,而having是分组之后对结果进行过滤。
  • 可判断的条件不一样:where 不能对聚合函数进行判断,having 可以。

(六)、 分页查询

大家在很多网站都见过类似的效果,如京东、百度、淘宝等。分页查询是将数据一页一页的展示给用户看,用户也可以通过点击查看下一页的数据。
在这里插入图片描述

接下来我们先说分页查询的语法。

1) 语法

SELECT 字段1,字段2... FROM 表名 LIMIT offset , length; 
# limit offset , length; 关键字可以接受一个 或者两个 为0 或者正整数的参数 
# offset 起始行数,0开始记数, 如果省略 则默认为 0.
# length 返回的行数

注意: 上述语句中的起始索引是从0开始

2) 练习

# 查询emp表中的前5条数据
-- 参数1 起始值,默认是0 , 参数2 要查询的条数
SELECT * FROM emp LIMIT 5;
SELECT * FROM emp LIMIT 0 , 5;
# 查询emp表中 从第4条开始,查询6-- 起始值默认是从0开始的.
SELECT * FROM emp LIMIT 3 , 6;

分页操作 每页显示3条数据

-- 分页操作 每页显示3条数据
SELECT * FROM emp LIMIT 0,3; --1SELECT * FROM emp LIMIT 3,3; --22-1=1 1*3=3
SELECT * FROM emp LIMIT 6,3; -- 第三页
-- 分页公式 起始索引 = (当前页 - 1) * 每页条数
-- limit是MySql中的方言

从上面的练习推导出起始索引计算公式:

 起始索引 = (当前页码 - 1) * 每页显示的条数
第一页数据 1-1 *5    0
第二页数据 2-1 *5     5
第三页     3-1 *5     10

你可能感兴趣的:(mysql,数据库,java)