MySQL的DML与DQL
一、DML数据定义语言
DML语句主要用于对Table表格中的数据进行操作
insert 插入数据
update 修改数据
delete 删除数据
1、INSERT 插入数据
1>向所有列插入数据
语法:
INSERT INTO 表名 VALUES(值1,值2...)
#向student表中插入一行记录
INSERT INTO student VALUES(1,'小明',NULL,'133',NULL,'1992-2-8',true);
INSERT INTO student VALUES(2,'小强','男',NULL,"西安",'1993-2-8',true);
注意:全部插入时,如果某一列没有非空约束,
又不想给值,那么任何类型可以给NULL值,
不能不写手动插入NULL值后,默认值不起作用
2>向指定列下插入数据
语法: INSERT INTO 表名(列名1,列名2...)VALUES(值1,值2...)
#向name和phone两个字段插入值
INSERT INTO student(name,phone)VALUES('weige','135');
#向id,name和birth三个字段插入值
INSERT INTO student(id,name,birth)VALUES(NULL,'dxw',now());
注意:
1>部分插入时非空字段,如果没有给默认值,
插入时必须赋值
2>如果某个字段有默认值,部分插入时,
没有给这一列值,那么就会使用默认值
3>主键列如果设置了自增长,可以不用给值
他会自增长,即使插入NULL,也会自增长
2、UPDATE 修改数据
1>修改列下所有数据(慎用)
语法: UPDATE 表名 SET 列名1=值1,列名2=值2...;
#修改所有人的address为'西安市',birth为当前日期
UPDATE student SET address='西安市',birth=now();
2>根据条件修改列下面的值
语法: UPDATE 表名 SET 列名1=值1,列名2=值2 WHERE 条件列=条件值;
#将id为2的学生address改为'兰州',birth改为'1992-10-1'
UPDATE student SET address='兰州',birth='1992-10-1' WHERE id=2;
#将gender为NULL的学生gender改为'男'
UPDATE student SET gender='男'
WHERE gender IS NULL;
#将isMarried不为NULL的学生值都改为false(0)
UPDATE student SET isMarried = false WHERE isMarried IS NOT NULL;
#将id大于2的学生address修改为'陕西省'
UPDATE student SET address='陕西省' WHERE id>2;
#将除了id为4的学生外,其他人的name改为NULL
UPDATE student SET phone=NULL WHERE id<>4;
注意:
1>根据条件修改任何类型都可以使用=,>,,>=,<=做判断
2>如果值和NULL之间做比较
使用IS NULL和IS NOT NULL
3、DELETE 删除
1>删除表中所有数据(慎用)
语法: DELETE FROM 表名;
#删除student表中所有数据
DELETE FROM student;
2>根据条件来删除
语法: DELETE FROM 表名 WHERE 列名=值;
#删除2019年以前出生的学生
DELETE FROM student WHERE birth
#将phone为NULL的学生信息删除
DELETE FROM student WHERE phone IS NULL;
二、DQL数据查询语言
#打开数据库
USE lanou;
#删除表
DROP TABLE IF EXISTS myemp;
DROP TABLE IF EXISTS dept;
#员工表
CREATE TABLE myemp(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
sex CHAR(1) DEFAULT '男',
job VARCHAR(30),
salary DECIMAL(7,2),
hiredate DATE,
deptno INT
);
#部门表
CREATE TABLE dept(
deptno INT PRIMARY KEY,
dname VARCHAR(20),
location VARCHAR(20)
);
1、基本查询
1>查询数据表中所有数据(查询效率低)
语法:SELECT * FROM 表名;
2>查询表中某几列的数据
语法:SELECT 列1,列2......FROM 表名;
#查询员工表中所有员工的name和salary
SELECT name,salary FROM myemp;
3>对查询出来的数据指定列别名
语法:SELECT
列1 [AS] 别名1,
列2 [AS] 别名2
......
FROM 表名;
#查询每个员工的名字和年薪
SELECT name 名字,salary*12 年薪 FROM myemp;
4>去除重复列
如果有相同的数据,只让出现一次
语法:SELECT DISTINCT 列名 FROM 表名;
#查看员工表中有多少种职位job
SELECT DISTINCT job FROM myemp;
注意:
DISTINCT后面一般只会跟一个字段名
如果有多个字段,会根据这多个字段的组合去重
2、限制查询
1>查询比较条件
> < >= <= == != <>
#查询薪水大于5000的员工信息
SELECT *FROM myemp WHERE salary>5000;
#查询部门编号是NULL的员工信息
SELECT * FROM myemp WHERE deptno IS NULL;
2>AND和OR关键字
AND:查询出来的值必须同时满足多个条件,等同于&&
OR:查询出来的值只要满足多个条件之一即可,等同于||
#查询职位是销售,并且薪水大于5000的员工信息
SELECT * FROM myemp WHERE job='销售' AND salary>5000;
或
SELECT * FROM myemp WHERE job='销售' && salary>5000;
#查询职位是销售,或者薪水大于5000的员工信息
SELECT * FROM myemp WHERE job='销售' OR salary>5000;
或
SELECT * FROM myemp WHERE job='销售' || salary>5000;
3>IN和NOT IN关键字
值列表范围查询
IN(值1,值2......)表示当前列下面的值只要存在于后面列表范围之内,该行记录就可以被匹配出来,相当于OR
NOT IN(值1,值2......)取出不符合此列表的数据记录,相当于AND
#查询职位是'销售'或者'研发部'的员工信息
SELECT * FROM myemp WHERE job IN('销售','研发部');
#查询不是10号和20号部门的员工信息
SELECT * FROM myemp WHERE deptno NOT IN(10,20);
4>BETWEEN...AND
查询值在某个范围之内的数据,等价于>= && <=
#查询薪水是5000到8000之间的员工信息
SELECT * FROM myemp WHERE salary BETWEEN 5000 AND 8000;
#查询不是2015年到2018年入职的员工信息
SELECT * FROM myemp WHERE hiredate NOT BETWEEN '2015-1-1' AND '2018-12-31';
或
SELECT * FROM myemp WHERE year(hiredate) NOT BETWEEN 2015 AND 2018;
5>在列上使用函数或者表达式
表达式:
#查询年薪大于100000的员工信息
SELECT id,name,salary,salary*12 year_sal FROM
myemp where salary*12>100000;
#查询给每个员工涨薪1000后的薪水
SELECT id,name,salary,salary+1000 FROM myemp
WHERE salary IS NOT NULL;
函数:
#查看所有2017年以前入职的员工信息
SELECT * FROM myemp WHERE YEAR(hiredate)<2017;
#查看所有6月份入职的员工信息
SELECT * FROM myemp WHERE month(hiredate)=6;
3、模糊查询
当执行查询时,如果只知道一部分的数据,可以借助LIKE关键字进行模糊匹配,LIKE关键字需要借助两个通配符
% 0个到多个任意字符
_ 任意的单个字符
#查询名字中首字母不是'l'的员工信息
SELECT * FROM myemp WHERE name NOT LIKE 'l%';
#查询名字中第二个单词是'o'的员工信息
SELECT * FROM myemp WHERE LIKE '_o%';
#查询所有6月份入职的员工信息
SELECT * FROM myemp WHERE hiredate LIKE ‘%-06-%’;
4、排序查询
对列下面的值按照从小到大或者从大到小的顺序排序
语法:
SELECT 列1,列2......FROM myemp
[WHERE CONDITIONS] ORDER BY 排序列 [ASC]|DESC
ASC:数据按照从小到大的顺序排序,默认排序规则,可以省略不写
DESC:数据按照从大到小的顺序排序
从小到大排序规则:
数字: 1 2 3...
字符: abc...
日期:从前往后
NULL:会被当做最小值
#按照入职日期先后对员工进行排序
SELECT * FROM myemp ORDER BY hiredate;
#将薪资5000以上的员工从高到低排序
SELECT * FROM myemp WHERE salary>5000 ORDER BY salary DESC;
#按照字母表顺序对名字进行排序
SELECT * FROM myemp ORDER BY name;
多列排序
默认先按照第一列的排序规则进行排序,如果第一列相同再按照第二列的排序规则排序,依次类推...
#按照部门编号对员工进行升序排序,如果是同一个部门,按照薪水降序排序
SELECT * FROM myemp ORDER BY deptno ASC,salary DESC;