SQL学习(二)

本文详细介绍了SQL中的分页查询、经典子查询案例和联合查询,以及DML语言中的插入、修改和删除操作。此外,还讲解了DDL语言中的库和表管理,包括创建、修改和删除。文章还涵盖了事务的基本概念,如ACID属性、事务创建和视图的创建、修改与删除。最后讨论了delete与truncate在事务中的区别以及变量、存储过程和函数的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

具体学习视频请参考:https://www.bilibili.com/video/BV12b411K7Zu?

分页查询

应用场景:
当需要显示的数据,一页显示不全,需要分页提交sql请求
语法:
select 查询列表 from 表名【join type】join 表2 on 连接条件 where 筛选条件 group by 分组字段 having 分组后的筛选 order by 排序的字段 limit offset,size
offset 要显示条目的起始索引(起始索引从0开始)
size 要显示的条目个数

特点:

  • limit语句放在查询语句的最后
#案例1:查询前五条员工信息
SELECT *  FROM employees LIMIT 0,5;
SELECT *  FROM employees LIMIT 5;

#查询第11条到第25条的数据
SELECT * FROM employees LIMIT 10,15;

#有奖金的员工信息,并且工资较高的前10名显示出来
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 工资
FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY 工资 DESC
LIMIT 10;

经典子查询案例

#查询工资最低的员工信息:last_name,salary
#1.查询最低工资
SELECT MIN(salary)
FROM employees;
#2.查询最低工资等于1的
SELECT last_name,salary
FROM employees
WHERE salary=(
 SELECT MIN(salary)
 FROM employees
);

#查询工资最低的部门信息
SELECT *
FROM departments
WHERE department_id=(
 SELECT department_id
 FROM employees
 GROUP BY department_id
 ORDER BY salary
 LIMIT 1,1
);

#查询平均工资最低的部门信息和该部门的平均工资
#查询各个部门的平均工资并排序选出最低的部门编号
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary)
LIMIT 1,1;

SELECT d.*,ag
FROM departments d
INNER JOIN(
 SELECT AVG(salary) ag,department_id
 FROM employees
 GROUP BY department_id
 ORDER BY AVG(salary)
 LIMIT 1,1
) ag_dep
ON ag_dep.department_id=d.department_id;

#查询平均工资最高的job的信息
#查询各个各个job_id的平均工资
SELECT AVG(salary),job_id
FROM employees
GROUP BY job_id
ORDER BY AVG(salary) DESC
LIMIT 1,1;

SELECT j.*,ag_dep.ag
FROM jobs j
INNER JOIN(
 SELECT AVG(salary)ag,job_id
 FROM employees
 GROUP BY job_id
 ORDER BY AVG(salary) DESC
 LIMIT 1,1 
) ag_dep
ON ag_dep.job_id=j.`job_id`;

#查询平均工资高于公司平均工资的部门有哪些
#公司的平均工资
SELECT AVG(salary)
FROM employees;
#查询各个部门的平均工资以及其部门名
SELECT department_id,AVG(salary)
FROM employees
GROUP BY department_id;

SELECT department_id
FROM(
 SELECT department_id,AVG(salary) ag
 FROM employees
 GROUP BY department_id 
) ag_dep
WHERE ag_dep.ag>(
 SELECT AVG(salary)
 FROM employees 
);

#查询公司所有的manager的详细信息
#1查询所有员工的manager编号
SELECT DISTINCT manager_id
FROM employees;

SELECT *
FROM employees
WHERE employee_id IN (
 SELECT DISTINCT manager_id
 FROM employees
);
#查询各个部门中最高工资中最低的部门的最低工资是多少
SELECT MAX(salary),department_id
FROM employees
GROUP BY department_id
ORDER BY MAX(salary)
LIMIT 1,1;

#查询平均工资最高的部门的manager的详细信息
#1.工资最高的部门编号
SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary)
LIMIT 1,1;
#将departments和employees连接,筛选条件用1
SELECT d.*
FROM departments d
INNER JOIN employees e 
ON d.`manager_id`=e.`employee_id`
WHERE e.`department_id`=(
 SELECT department_id
 FROM employees
 GROUP BY department_id
 ORDER BY AVG(salary)
 LIMIT 1,1 
);

联合查询

union:联合,合并
将多条查询语句合并成一个结果
语法:
查询语句一
union
查询语句二

应用场景
要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的信息一致时

特点:

  • 要求多条查询语句的查询列数是一致的
  • 要求多条查询语句的每一列的类型和顺序最好一致
  • 使用union关键字默认去重,如果使用union all 可以包含重复项
#查询部门编号大于90或者邮箱中包含a的
SELECT * FROM employees WHERE department_id >90 OR email LIKE '%a%';

SELECT * FROM employees WHERE department_id >90
UNION 
SELECT * FROM employees WHERE email LIKE '%a%';

DML语言(数据操作语言)

数据操作语言

  • 插入:insert
  • 删除:delete
  • 修改:update

插入语句

语法:
第一种经典的插入方式:
insert into 表名(列名…) values(值1…)
注意:

  • 插入的值的类型要和列的类型一致或兼容
  • 不可以为NULL的列是必须要插入值的,可以为NULL的列是如何插入值的:两种方式
  • 插入的时候列的顺序是可以颠倒的
  • 列数和值的个数必须匹配
  • 可以省略列名,默认是所有列,而且列的顺序和表中的列的顺序是一致的

插入的方式二:
语法:
insert into 表名
set 列名=值,列名=值…

两种方式比较:

  • 方式一可以批量的插入多行,但是方式二不支持
  • 方式一支持子查询,方式二不支持
#插入
INSERT INTO beauty(id,NAME,sex,borndate,phone,photo,boyfriend_id)
VALUES(13,'唐艺昕','女','1999-8-12','1999213',NULL,2);

#利用方式一批量插入多行
INSERT INTO beauty(id,NAME,sex,borndate,phone,photo,boyfriend_id)
VALUES(13,'唐艺昕1','女','1999-8-12','1999213',NULL,2),
VALUES(14,'唐艺昕2','女','1999-8-12','1999213',NULL,2),
VALUES(15,'唐艺昕3','女','1999-8-12','1999213',NULL,2);

修改语句

语法:

  • 修改单表中的记录
    语法:
    update 表
    set 列=新值,列=新值…
    where 筛选条件;(满足条件再更新)
  • 修改多表的记录
    语法:
    sql92语法
    update 表1 别名,表2 别名
    set 列=值1,列=值2…
    where 连接条件
    and 筛选条件;

sql99语法:
update 表1 别名
【连接类型】 join 表2 别名
on 连接条件
set 列=值1,列=值2…
where 筛选条件;

#修改单表的记录
#案例1:修改beauty表中姓唐的电话为124923212
UPDATE beauty SET phone='378273821' WHERE NAME LIKE '唐%';

#修改多表的记录
#案例:修改张无忌的女朋友的手机号为114
UPDATE boys bo
INNER JOIN beauty b ON bo.`id`=b.`boyfriend_id`
SET b.`phone`='114'
WHERE bo.`boyName`='张无忌';

#修改没有男朋友的女神的男朋友id都为2
UPDATE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值