MySQL_5.DML语句基本语法

2023-12-14 23:29:19

DML语言介绍
其语句包括动词 insert、update、delete。它们分别用于添加、修改 和删除,也称为 动作查询语言
官方文档网址
https://dev.mysql.com/doc/refman/5.7/en/sql-data-manipulation-statements.html

1.insert into 语句语法
语法一:

INSERT INTO table_name ( field1, field2,...fieldN ) VALUES( value1, value2,...valueN );


语法二:

INSERT INTO table_name ( field1, field2,...fieldN ) VALUES
( value1, value2,...valueN ),
( value1, value2,...valueN ),
( value1, value2,...valueN );


语法三:

INSERT INTO table_name VALUES ( value1, value2,...valueN );

insert into 语句案例
# 创建一张学生表:

use yzjtestdb;
create table if not exists yzjtestdb.students(
id int(5) primary key comment '学生学号',
name varchar(10) not null comment '学生姓名',
age tinyint not null comment '学生年龄',
gender enum('男','女','保密') comment '学生性别')?
engine=innodb ?default charset=utf8 ?comment '员工表';


插入数据:
语法一插入

insert into yzjtestdb.students values(1,'漩涡鸣人',16,'男'); ?

commit;


语法二插入

insert into yzjtestdb.students ( id ,name ,age )values( 2,'宇智波佐助',16);?
commit;


语法三插入

insert into yzjtestdb.students ?values
( 3,'卡卡西',25,'男'),( 4,'李洛克',16,'男'),
( 5,'宇智波斑',100,'男'),( 6,'春野樱',16,'女');?
commit;

2.update 语句语法

UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]


update 语句案例
将名字为漩涡鸣人的列数据修改成宇智波鼬:

UPDATE yzjtestdb.students SET name = '宇智波鼬' where name = '漩涡鸣人';
commit;


将性别为男的学员年龄都 + 10:

UPDATE yzjtestdb.students SET age = age + 10 where gender = '男' and age < 50;
commit;
select * from yzjtestdb.students;?


修改性别为NULL的学员的名字和年龄:

UPDATE yzjtestdb.students SET name = '大蛇丸',age = 127 where gender is null;

3.delete 语句语法

DELETE FROM table_name [WHERE Clause]


delete 语句案例
删除性别为null 的学生,年龄大于100的学生:

delete from yzjtestdb.students where gender is null and age > 100;
commit;

查看

select * from yzjtestdb.students;?


删除性别为男的学生或者年龄大于50的学生:

delete from yzjtestdb.students where gender = '男' or age > 50;
commit;
select * from yzjtestdb.students;?

4.select 语句语法
select 字段/表达式 from 表名/视图名 where 查询条件;
# selct 子句:

where ??? ??? ??? ??? ????查询条件
group by ?? ??? ??? ??? ? 在字段内不同的数据分一组
having?? ??? ??? ??? ??? ?分组以后对于数据的过滤
limit?? ??? ??? ??? ??? ? 对于返回数据行数的限制
order by [asc|desc]?? ?? ?排序 asc:升序,默认 desc:降序

# select 表达式:
(1)变量
?

select 10 + 20;?? ??? ??? ?--查询运算
select 10 * 20;
select 10 - 20;
select 10 / 20;
select now();?? ??? ??? ?--查询当前时间


?? ??? ??? ??? ?
(2)from 子句
?? ??? ??? ??? ?

select * from yzjtestdb.yg;?? ??? ??? ??? ??? ??? ??? ??? ??? ??? --全列
select email from yzjtestdb.yg;?? ??? ??? ??? ??? ??? ??? ??? ??? --单列
select email,job_id from yzjtestdb.yg;?? ??? ??? ??? ??? ??? ??? ?--多列
select * from rwxx,ssgj;?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?  --多表
select * from rwxx x1 ,ssgj j1;?? ??? ??? ??? ??? ??? ??? ??? ??? --别名
select * from rwxx x1 ,ssgj j1 where x1.name = j1.name;?? ??? ??? --连接查询

(3)列连接

select name,concat(name,'-',country,'-',skills) from ssgj;?? ??? ??? ??? ??? ?
select name,concat(name,'-',country,'-',skills) "合并显示" from ssgj;?? ??? 

?

(4)虚拟表 dual ,提高兼容性

select 1 + 1 from dual;
select now() from dual;??

?

(5)SQL语句编写规则
大小写不敏感;
SQL语句可以占用多行,以分号结束,关键字不能拆成多行;

(6)SQL运算符

等于 = ?? ??? ??? ?id = 15;
大于 > ?? ??? ??? ?id > 15;
小于 < ?   ?? ??? ?id < 15;
大于等于 >=  ?? ?  id >= 15;
小于等于 <=  ??   ?id <= 15;
不等于 <> ???     ?id <> 15; ??
不等于 !=  ??     ?id != 15; ?
是空:?? ? ??? ?    is null;?
非空:???? ??? ?    is not null;


(6)模糊查询 [not] like ?: ?? ??? ?字段 like "%北京市%"; ?
? ?范围内 [not] between : ?? ?字段 between 1 and 15;
? ?在什么范围值内 [not] in : ??? ?字段 in ('范围值1','范围值2','范围值3');

# 案例:

use naruto;
select * from rwxx where age = 16;
select * from rwxx where age > 16;
select * from rwxx where age < 16;
select * from rwxx where age <> 16;
select * from rwxx where age >= 16;
select * from rwxx where age <= 16;
select * from rwxx where age between 16 and 25;
select * from rwxx where age not between 16 and 25;
select * from rwxx where age >= 16 and age <= 25;
select * from rwxx where age >= 16 && age <= 25;
select * from rwxx where age in (16,17,28,100);
select * from rwxx where age not in (16,17,28,100);
select * from rwxx where name like "%宇智波%";
select * from rwxx where name not like "%宇智波%";


(7)逻辑运算
?

非 : not
与 : and ?, &&
或 : or ?

# 组合查询案例:

use naruto;
select * from rwxx where age = 16 and gender = '男';?
select * from rwxx where age = 16 or name = '卡卡西';?
select * from ssgj where skills is null;
select * from ssgj where skills is not null;


(8)模糊查询like?

精确查询 ?  = ?
模糊查询 ? like ? ?
A%?? ? ?  A开头?? ??? ?
%A ? ?    A结尾
%A% ?     包含A
%A%C% ?   包含A和C
A%C ? ?   A开头C结尾

# 模糊查询案例:

select tel from yzjtestdb.yzjtest_yg where tel like '137%';?
select JOBTITLE from yzjtestdb.yzjtest_yg where JOBTITLE like '销售%';?
select region from yzjtestdb.yzjtest_yg where region like '%海%';?


(9)查询分组与排序

group by?? ?: 分组?
order by?? ?: 排序
# group by 分组
group by 列 {asc 升序|desc 降序},{with rollup} 组内聚合计算

# 分组常用到的函数:

max?? ?? ?最大值
min????? ?最小值
avg?? ?? ?平均值
sum?? ?? ?列/表达式总和
count ?? ?行数总和

# 分组案例:
案例1:统计(yzjtest_sales 销售表) 本月每个(商品消费分类、GOODS)销量单数
--不同类别商品分组

select count(*) ,GOODS from yzjtest_sales group by goods;


--默认升序

select count(*) ,GOODS from yzjtest_sales group by 2 order by 1;??

??? ?
?--降序?? ?

select count(*) ,GOODS from yzjtest_sales group by 2 order by 1 desc ; ??


?--限制输出一行?? ?

select count(*) ,GOODS from yzjtest_sales group by 2 order by 1 desc limit 1;


--案例2:统计(yg员工表)本月共发了多少工资 (工资、SALARY)

select sum(SALARY) from yg;


--案例3:统计(yzjtest_yg 员工表)不同地区(REGION)、不同部门(DEPT)共发了多少工资(SALARY)

select REGION,DEPT,sum(SALARY) from yzjtest_yg group by 1,2;


--案例4:统计(yzjtest_yg 员工表)不同地区(REGION)、共发了多少工资(SALARY)

select REGION,sum(SALARY) from yzjtest_yg group by 1;


--案例5:with rollup 利用组合条件进行排序后,再次统计

select REGION,DEPT,sum(SALARY) from yzjtest_yg group by 1,2 with rollup ;


--案例6:统计(yzjtest_yg 员工表)不同地区(REGION)、发了总数工资(SALARY)超过两百五十万

select sum(SALARY),REGION from yzjtest_yg group by REGION having sum(SALARY) > 2500000;


(10)限制行数?
limit : 限制行数?
# limit 案例:
案例1:查询YG表限制输出5行

select * from yzjtestdb.yg limit 5;


案例2:查询YG表从第3行开始,显示4行

select * from yzjtestdb.yg limit 3,4;


案例3:配合分组函数使用

select count(*) ,GOODS from yzjtest_sales group by 2 order by 1 limit 3;


(11)去除重复记录?

distinct ?? ?: 去除重复记录?


# distinct 案例:
案例1:去除yzjtest_yg表 sex 字段重复记录

select sex from yzjtest_yg;?? ??? ??? ??? ?--先查看重复记录
select distinct sex ?from yzjtest_yg;?? ??? ?--sex字段去重


(12)union和union all

union?? ? : 无重并集,把多个结果组合并后去重
union all : 有重并集,把多个结果组合并不去重


# union 案例:
案例1:查询rwxx表、ssgj表的name字段合并去重

select name from naruto.rwxx union select name from naruto.ssgj;


# union all案例:
案例1:查询rwxx表、ssgj表的name字段合并不去重

select name from naruto.rwxx union all select name from naruto.ssgj;


(13)for update
for update?? ? : 锁表,悲观锁,生产环境切勿使用这条语句
案例1:将rwxx表锁住

select * from naruto.rwxx for update;

5.select 高级查询连接查询和子查询
(1)select 高级查询之连接查询 join
SQL JOIN 子句用于把来自两个或多个表的行结合起来返回数据,基于这些表之间的共同字段
join连接分为3大类:

自然连接 NATURAL JOIN:自然连接是在两张表中寻找那些数据类型和列名都相同的字段,然后自动地将他们连接起来,并返回所有符合条件按的结果。
内连接 INNER JOIN: ? ?如果表中有至少一个匹配,则返回行外连接
左外连接 LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
右外连接 RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
全外连接 FULL JOIN: 只要其中一个表中存在匹配,则返回行 (mysql不支持)

SQL join案例:
案例1:自然连接 NATURAL JOIN

select * from naruto.rwxx natural join naruto.ssgj;

案例2:内连接 INNER JOIN

select * from naruto.rwxx ?a inner join naruto.ssgj b on a.name = b.name ;?? ??? ??? ??? ??? ?--写法1
select * from naruto.rwxx ?a , naruto.ssgj b where a.name = b.name ;?? ??? ??? ?--写法2
select * from naruto.rwxx ?a inner join naruto.ssgj b using(name);?? ??? ??? ??? ??? ??? ?--写法3
select a.name,a.age,b.country,b.skills from naruto.rwxx ?a inner join naruto.ssgj b on a.name = b.name ;?? ??? ??? ??? ??? ?

案例3:左外连接 left join / left outer join

select * from naruto.rwxx r left outer join naruto.ssgj s on r.name = s.name;

案例4:又外连接 right join / right outer join

select * from naruto.rwxx r right outer join naruto.ssgj s on r.name = s.name;

案例5:交叉连接 cross join

select * from naruto.rwxx r cross join naruto.ssgj s ;


(2)select 高级查询之子查询?
selct 子查询是将一个查询语句嵌套在另一个查询语句中,在特定情况下,一个查询语句的条件需要另一个查询语句来获取,
内层查询(inner query)语句的查询结果,可以为外层查询(outer query)语句提供查询条件。
子查询分为:
单行子查询:最多返回一行
多行子查询:返回一行或者多行
子查询可以返回单一值(标量子查询)、一个行(标量子查询)、一个列(标量子查询)、一个表(标量子查询)。

# 子查询案例表:

scott.dept ?? ??? ??? ??? ?部门表?
scott.emp ?? ??? ??? ??? ? 雇员表?
scott.salgrade ?? ??? ??? ?工资等级表
scott.bonus?? ??? ??? ??? ?工资表?? ?

案例1:简单子查询,统计当前部门和员工的数量。

select count(*) from scott.dept; ??? ??? ?--先统计部门数量
select count(*) from scott.emp;?? ? ??? ??? ?--先统计员工数量
select now() 当前时间,
(select count(*) from scott.dept) 部门数量,
(select count(*) from scott.emp) 员工数量
from dual;

案例2:通过查询dept子查询emp表找出“经理”职位的员工是在哪些城市

select * from dept;
select * from emp;
select loc from dept where deptno in (select deptno from emp where job = '经理' );

案例3:求哪一个城市支付的最高薪水

select * from dept where deptno = (select deptno from emp where sal = ( select max(sal) from emp ));

案例4:通过emp员工表、salgrade 工资等级表找到“董事长”职位在工资等级表是个什么级别

select * from salgrade where (select sal from emp where job = '董事长') between losal and hisal;

案例5:通过部门表dept 找出员工表emp 的岗位是“会计”的职位
exists | not exists
exists 子句会将子查询所返回的结果分成TRUE,FALSE状态,如果子查询结果有返回,将结果反回给上一层TRUE状态,
如果子查询结果没有返回,将反馈一个FALSE状态,exists 子句接收到状态值TRUE以后将会对外部查询的表输出数据(假设外部表有数据),
如果状态值为FLASE,外部表则不输出数据。
not exists 子句则反之,接收到状态值为FALSE的输出外部表的数据,接收到状态值为TRUE将不输出外部表的数据。

select * from emp where exists ( select * from bonus ); ? ?? ??? ? --不返回 ? ? ? ? ?
select * from emp where not exists ( select * from bonus );?? ??? ? --返回
select * from emp where exists (select * from dept where dname like '%会计%' and deptno = emp.deptno) ;

案例6:如果有平均工资不小于1500的部门信息则查询所有部门信息(使用not exists)

select * from dept where not exists ( select deptno,avg(sal) from emp group by deptno having avg(sal) < 1500);

案例7:通过emp员工表查询哪些“job”岗位的工资比“job”岗位办事员的高(多行子查询)
单行子查询:子查询返回的行数是单行的。
多行子查询:子查询返回的行数是多行的。

单行子查询案例,查询EMP员工表谁工资比 SMITH 员工高。
标红子查询返回单行

select ename,sal from emp where sal > (select sal from emp where ename = 'SMITH') order by 2 desc;?

多行子查询案例,通过emp员工表查询哪些“job”岗位的工资比“job”岗位办事员的高。
标红子查询返回多行

select job from emp where sal > (select sal from emp where job = '办事员'); ? ?-- error
select job from emp where sal > all (select sal from emp where job = '办事员'); -- true

all 子句的用法:

> all ?| > any?? ???  ?大于子查询结果的所有值
< all ?| < any?? ??? ? 小于子查询结果的所有值
= all ?| = any?? ???  ?等于子查询结果的所有值
>= all | >= any?? ??? ?大于等于子查询结果的所有值
<= all | <= any?? ??? ?小于等于子查询结果的所有值
!= all | != any?? ??? ?不等于子查询结果的所有值



?

SELECT NAME,salary FROM employees?
WHERE salary > ALL ( SELECT salary FROM employees WHERE department_id = 6 )?
ORDER BY salary;

文章来源:https://blog.csdn.net/mmmmm168m/article/details/134876478
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。