前言
本篇文章介绍MySQL语言中的DML和DQL语句,文章结尾有关于数据库实现鉴权展示内容的实操。
DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE
DQL语句 数据库查询语言: 查询数据SELECT。
DML语句
DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE
INSERT插入语句
语法:
完整插入:INSERT INTO 表名 VALUES(数据1、数据2。。。);
部分插入:INSERT INTO 表名(字段1、字段2) VELUES(数据1、数据2);
创建测试表
完整插入
完整插入:INSERT INTO 表名 VALUES(数据1、数据2。。。);
完整插入的时候要按照表字段的顺序进行数据插入 ,默认将输入的第一个数据插入到表的第一个字段以此类推。
部分插入
部分插入:INSERT INTO 表名(字段1、字段2) VELUES(数据1、数据2);
指定需要插入的字段,插入数据,按照自己指定的字段来插入对应的数据。
UPDATE更新数据
语法:UPDATE 表名 SET 列名=值 WHERE CONDITION;
测试
更新id为1的name为zhangsan。
DELETE删除数据
语法:DELETE FROM 表名 WHERE CONDITION;
测试
删除姓名为jack的数据
DQL语句
DQL语句 数据库查询语言: 查询数据SELECT。
在MySQL管理软件中,可以通过SQL语句中的DQL语言来实现数据的
在玩游戏的时候,我们查看自己的装备,道具等操作都是通过SELECT语句实现的,还有银行的余额等查询功能都是SELECT操作完成的。
简单查询
查询所有列信息:SELECT * FROM 表名; //这也是之前一直用的查询语句。
查询部分列信息:SELECT 列1,列2列3 FROM 表名;
准备表并插入数据
create table employee(id int,name varchar(50),age int);
查询所有信息
select * from employee;
查看表内的所有列信息。
查询部分信息
select name,age from employee;
查询employee表的name和age列。
条件查询
但条件查询where
将以完整查询为例实验。
select * from 表名 where condition
查询年龄为18的人员信息。
select * from employee where age=18;
多条件查询AND/OR
语法:select * from 表名 where condition AND condition
select * from 表名 where condition OR condition
1)查询id为1并且年龄为18的人员信息
2)查询id大于3或者年龄为19的人员信息
1)
2)
关键字BETWEEN AND 在什么之间
语法:select * from employee where 列 between 值1 and 值1;
查找id在1-3之间的员工信息。
查找id不在1-3之间的员工信息。
IN集合查询
语法:select * from 表名 where 列 in(值1,值2,值3);
查询该列符合in内数值的信息,用or也能实现但是效率并没有in的高。
查询年龄为19,24,16的人员信息。
select * from employee where age in(16,19,24);
查询年龄不在19,24,16的人员信息。
select * from employee where age not in(16,19,24);
IS NULL查询空值信息
插入两行数据:一个是name为空的数据一个是name为空格的数据。
查询name为空的人员信息。
select * from employee where name is null;
可以看到查到了6号人员信息7号人员信息并没有查到。
查询name不为空的人员信息。
select * from employee where name is not null;
发现7号人员的信息被查到了,因为7号人员的name是空格不是空。
LIKE模糊查询
当记不清楚需要查询人员的具体信息的时候可以使用like关键字进行查询。
语法:select * from 表名 where 列 like '部分信息%';
查询姓张的人员信息。
select * from employee where name like 'zhang%';
查询好像名字是以re结尾的人员信息。
select * from employee where name like '%re';
只知道人员名字前两个字母为na,并且知道该人员名字是四个字母的人员信息。
select * from employee where name like 'na__';
注意这里na后面是两个下划线,几个下划线代表后面有几个字母。
查询排序
查询升序排序:select * from 表名 ORDER BY 列名 ASC; //默认是以升序排序。
查询降序排序:select * from 表名 ORDER BY 列名 DESC;
查询升序排序
select * from 表名 ORDER BY 列名 ASC;
或
select * from 表名 ORDER BY 列名;
查询结果按年龄升序排序。
查询降序排序
select * from 表名 ORDER BY 列名 DESC;
查询结果按年龄降序排序。
多表查询
多表查询分为:多表连接查询、子查询
准备表
这里需要对employee表进行增加列的操作需要使用ALTER关键字进行操作。
语法:ALTER TABLE 表名 ADD 列名 列描述 FIRST/AFTER列名;
FIRST/AFTER列名:指定新加列的位置,可写可不写,不写的话默认加在表的最后一列
在employee表的末尾加上人员的部门编码以及人员等级列。
增加多列需要用“,”隔开。
alter table employee add num int,add level int;
并且创建两个表一个是部门信息表,一个是人员等级信息表。
准备数据
更新人员信息的部门编码以及人员等级,并且插入数据到部门信息表以及等级信息表。
完善人员信息表。
完善部门信息表
完善人员等级信息表。
交叉连接
生成笛卡尔积,它不使用任何匹配条件。
比如将A表的6行,B表的7行,最后结果6*7=42行。
select employee.id,employee.name,employee.age,employee.num,department.name from employee,department;
内连接
这里因为都能够匹配,所以现在在三个表中添加一行匹配不到的数据。
规定的两表的两列相同的数据才会显示出来。
语法:select A表.列,B表.列 from A表,B表 where A表.列=B表.列;
select employee.id,employee.name,employee.num,department.dep_name from employee,department where employee.num=department.code;
这里8号人员以及102部门都没有显示出来,因为没有匹配到
外连接
外连接分为左连接、右连接。
左连接:以左表为基础匹配右表的数据,这里不管左右两表有没有完全匹配,左表的内容都会被显示出来。
右连接:以右表为基础匹配左表的数据,这里不管左右两表有没有完全匹配,右表的内容都会被显示出来。
左连接
要求:查询所有人员所属部门,包括部门信息未存在的人员。
select * from employee left join department on employee.num=department.code;
可以看到人员信息表的信息都显示出来了,但是发现部门信息的102部门没有显示。
右连接
查看所有部门中年龄大于18的人员信息。
select * from employee right join department on employee.num=department.code and age>18;
这里使用了and,可能会有疑问为什么and后面的age不是用employee.age,因为and是在连接后处理的,连接后是一个新表,新表age就不用写employee.age了。
发现部门信息都会显示出来,人员只有匹配的才会显示出来。
带in的子查询
将一个查询语句的结果当做另一个查询语句的条件进行查询。
语法:select * from A表 where 列 in (select distinct 和A表能够匹配的列 from B表 condition);
需求:查询级别月薪大于10000的人员信息。
select * from employee where level in (select distinct level from dep_level where salary>10000);
原理:括号内的子查询,将dep_level表查到的月薪大于10000的level的信息传递到父查询的level字段中作为范围来查询。
查询员工年龄大于18的部门。
首先通过内连接的方法查看大于18岁人员的信息包括部门,再用子查询的方法查看结果是否一致。
带exists的子查询(会员VIP的应用场景)
EXISTS关字键字表示存在。在使用EXISTS关键字时,内层查询语句不返回查询的记录,而是返回一个真假值。
Ture或False,当返回Ture时,外层查询语句将进行查询;当返回值为False时,外层查询语句不进行查询
需求:如果sure是董事长,则查询所有人员的月薪。
select * from employee,dep_level where employee.level=dep_level.level and exists (select * from employee where level in (select distinct level from dep_level where name='董事长') and name='sure');
这里用了嵌套的方式来鉴别sure是不是董事长。
该查询往往用在身份鉴别、权限鉴别,根据身份权限来展示相应的内容,比如游戏充值VIP之后才可以看到的内容就会用到该查询,当然游戏中完成这个功能不会用这么复杂的sql语句,会使用一些if语句来判断。刚刚做的实操,董事长才有权限查看员工的工资。
需求:如果zhangsan是董事长,则显示所有员工的月薪。
select * from employee,dep_level where employee.level=dep_level.level and exists (select * from employee where level in (select distinct level from dep_level where name='董事长') and name='zhangsan');
这里使用子查询没有查询到结果,因为zhangsan不是董事长。