DML/DQL
DML
INSERT 实现数据的 插入
实例:
DELETE 实现数据的 删除
实例:
UPDATE 实现数据的 更新
实例1:
实例2:
实例3:
DQL
DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE
DQL语句 数据库查询语言:查询数据SELECT
语法:完整插入 INSERT INTO ___表名___ VALUES(值1,值2,值3...值n);
部分插入 INSERT INTO ___表名___ (列名,列名) VALUES(值1,值2);
实例:
1.首先创建一个表
2.插入数据
语法:DELETE FROM ___表名____ WHERE CONDITION;
实例:
.删除数据
语法:UPDATE 表名 SET 列名=值 WHERE CONDITION;
实例1:
1.准备一张表
mysql> create table t6(id int, name varchar(20));
2.插入数据
mysql> insert into t6 values (1,'aa'); mysql> insert into t6 values (2,'bb');
3.更新数据 ----->把bb 改成 cc
mysql> update t6 set name='cc' where id=2;
4.查询结构
mysql> select * from t6;
实例2:
更新数据库的登录密码
mysql> update mysql.user set authentication_string=password("QianFeng@123456") where user="root";
实例3:
在MySQL管理软件中,可以通过SQL语句中的DQL语言来实现数据的
从数据表中提取满足特定条件的记录
- 单表查询
- 多表联合查询
DQL基础语法:
1.首先创建一个表
mysql> create database company;
mysql> CREATE TABLE company.employee5(
id int primary key AUTO_INCREMENT not null,
name varchar(30) not null,
sex enum('male','female') default 'male' not null,
hire_date date not null,
post varchar(50) not null,
job_description varchar(100),
salary double(15,2) not null,
office int,
dep_id int
);
插入数据
mysql> insert into company.employee5(name,sex,hire_date,post,job_description,salary,office,dep_id) values
('jack','male','20180202','instructor','teach',5000,501,100),
('tom','male','20180203','instructor','teach',5500,501,100),
('robin','male','20180202','instructor','teach',8000,501,100),
('alice','female','20180202','instructor','teach',7200,501,100),
('aofa','male','20180202','hr','hrcc',600,502,101),
('harry','male','20180202','hr',NULL,6000,502,101),
('emma','female','20180206','sale','salecc',20000,503,102),
('christine','female','20180205','sale','salecc',2200,503,102),
('zhuzhu','male','20180205','sale',NULL,2200,503,102),
('gougou','male','20180205','sale','',2200,503,102);
2.简单查询
#查看所有列
SELECT * FROM 表名;
#查部分列
SELECT 列1,列2,列3 FROM 表名;
#通过四则运算查询(查看年薪)
SELECT name, salary, salary*14 FROM employee5;
3.条件查询
单条件查询 WHERE
a.查询hr部门的员工姓名
SELECT name,post FROM employee5 WHERE post='hr';
多条件查询AND/OR
a.查询hr部门的员工姓名,并且工资大于1000
SELECT name,salary FROM employee5 WHERE post='hr' AND salary>1000;
b.查询所有部门的员工姓名,并且工资是6000或者8000的员工
SELECT name, salary FROM employee5 WHERE salary=6000 OR salary=8000
关键字BETWEEN AND 在什么之间
a.需求:查一查薪资在5000到15000
SELECT name,salary FROM employee5 WHERE salary BETWEEN 5000 AND 15000;
b.需求:不在5000~15000呢?请使用NOT
SELECT name,salary FROM employee5 WHERE salary NOT BETWEEN 5000 AND 15000;
关键字IN集合查询
a.工资可能是4000,也可能是5000,还有可能是9000,怎么查
OR可以组合多条件,效率如何? SELECT name, salary FROM employee5 WHERE salary=4000 OR salary=5000 OR salary=6000 OR salary=9000 ;
关键字IS NULL
a.没有岗位描述的
空 SELECT name,job_description FROM employee5 WHERE job_description IS NULL;
非空 SELECT name,job_description FROM employee5 WHERE job_description IS NOT NULL;
关键字LIKE模糊查询
a.好像有个员工姓阿
SELECT * FROM employee5 WHERE name LIKE 'al%'; SELECT * FROM employee5 WHERE name LIKE 'al___';
4.排序查询
实例:
a.例如以工资升序排列
SELECT * FROM 表名 ORDER BY 工资的列名 ASC;
b.例如以工资降序排列
SELECT * FROM 表名 ORDER BY 工资的列名 DESC;
c.工资最高的前五名
SELECT * FROM employee5 ORDER BY salary DESC LIMIT 5;
5.多表查询
创建员工信息表:
#创建表结构
create table info(
name char(50),
age int,
dep_num int,
level_num int);
#查询表结构
desc info;
#插入数据
insert into info values
('zhangsan',23,101,1),
('lisi',25,102,2),
('wangwu',30,102,3),
('zhaosi',30,103,4),
('sunba',35,NULL,NULL);
#查询表
select * from info;
创建部门信息表:
#创建表结构
create table department(
dep_num int,
dep_name varchar(50),
dep_des varchar(100));
#插入数据
insert into department values
(101,'hr','recruit,training'),
(102,'tec','system,network,service'),
(103,'exp','C++,python,php'),
(104,'admin','administrator');
#查看表结构
desc department;
#查看表
select * from department;
示图:
多表的连接查询:
a.交叉连接
特点:全部组合(A表5行,B表7行,最后5*7=35行)
生成笛卡尔积,它不使用任何匹配条件
select info.name,info.age,info.dep_num,department.dep_name from info,department;
b.内连接
特点:两列相同时,才会显示
语法:SELECT 字段列表 FROM 表1 , 表2 WHERE 表1.字段 = 表2.字段;
select info.name,info.age,info.dep_num,department.dep_name from info,department where info.dep_num = department.dep_num;
c.外连接
特点:两列相同时显示,并,已左/右表为主。
语法:A表 left join B表 on 条件是
外连接(左连接 left join on)
找出所有员工及所属的部门,包括没有部门的员工
查看所有员工的部门信息。
select info.name,info.age,info.dep_num,department.dep_name from info left join department on info.dep_num = department.dep_num;
外连接(右连接right join on)
显示所有的部门的员工信息。
select info.name,info.age,info.dep_num,department.dep_name from info right join department on info.dep_num = department.dep_num;
子查询:
子查询是指:父查询 需要 依赖 子查询的结果。
子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字
还可以包含比较运算符:= 、 !=、> 、<等
EXISTS关字键字表示存在。在使用EXISTS关键字时,内层查询语句不返回查询的记录,而是返回一个真假值。
Ture或False,当返回Ture时,外层查询语句将进行查询;当返回值为False时,外层查询语句不进行查询
1. 带IN关键字的子查询(范围)
查询员工年龄大于等于25岁的部门
select dep_num,dep_name from department where dep_num in (select distinct dep_num from info where age >=25);
2. 带EXISTS关键字的子查询(返回值)
如果部门101存在(返回为真),查询所有员工信息。
true select * from info where exists (select * from department where dep_num=102); false select * from info where exists (select * from department where dep_num=105);