3.dml语句、运算符、函数
dml语句、运算符、函数
DML
DML(Data Manipulation Language)语句: 数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括 insert(增加)、delete(删除)、udpate(修改) 和select(查询) 等。
表的管理
插入数据
-
- insert into 表名[字段名] values (值1,[值2]);
值要与数据类型相同,大小必须在列的规定范围,一一映射;字符和日期型数据包含在单引号中;不指定值为插入空值(null)
- insert into 表名[字段名] values (值1,[值2]);
一次性插入多条数据
-
- INSERT INTO 表名 【字段名1,字段名2】VALUES(record1_value1,record1_value2,....,record1_valuesn),(record2_value1,record2_value2,....,record2_valuesn),(record3_value1,record3_value2,....,recordn_valuesn);
- INSERT INTO 表名 【字段名1,字段名2】VALUES(record1_value1,record1_value2,....,record1_valuesn),(record2_value1,record2_value2,....,record2_valuesn),(record3_value1,record3_value2,....,recordn_valuesn);
更新数据
-
- update 表名 set 修改内容 where 修改条件;(后面这个其实就是一个匹配的条件,set后为修改的数据)
- update 表名 set 修改内容 where 修改条件;(后面这个其实就是一个匹配的条件,set后为修改的数据)
同时更新多条数据
-
- update 表1名 a,表2名 b set a.sal=a.sal*b.deptno,b.deptname=a.ename where a.deptno=b.deptno;
其中a,b是两个表的别名(当然不起别名也是可以的)。上一语句的意思是:当表1的deptno与表2的deptno相同时,将表1的sal更新成表1的sal*表2的deptno积,将表2的deptname更新成表1的ename。
- update 表1名 a,表2名 b set a.sal=a.sal*b.deptno,b.deptname=a.ename where a.deptno=b.deptno;
删除表中数据
-
- delete from 表名 [where 字段=值];
删除多个表中数据
- delete a,b from emp a,dept b where a.deptno=b.deptno and a.deptno=3;
- delete a,b from emp a,dept b where a.deptno=b.deptno and a.deptno=3;
- delete from 表名 [where 字段=值];
用于删除表的所有数据
-
- truncate table <表名>
- truncate table <表名>
查询所有字列
-
- select * from 表名;
- select * from 表名;
查询一部分列(建议查询所有列也用这种)
-
- select 字段1[,字段2..] from 表名;
- select 字段1[,字段2..] from 表名;
去重复数据
-
- select [distinct] * from 表名
- select [distinct] * from 表名
列 起别名
select 字段1 as 别名1,字段2 as 别名2,..from 表名
中文需要加 ' 号,英文不用
where子句-条件查询
用where 关键字
select * from 表名 where 字段名=对应值;
除了‘=’外,还可以使用>、<、>=、<=、!=等比较运算符;
多个条件之间还可以使用or、and 等逻辑运算符进行多条件联合查询。
select * from 表名 where deptno=1 and sal<3000;
范围(between and)查询
- select * from student where english between 80 and 90;
查询英语分数在80到90之间的同学
模糊查询
- [NOT] LIKE '字符串';
NOT :可选参数,字段中的内容与指定的字符串不匹配时满足条件。
字符串:指定用来匹配的字符串。“字符串”可以是一个很完整的字符串,也可以包含通配符。- 查询名字中间有金的,且姓为一位的名字:select * from 表名 where name LIKE '_金%';
- 支持百分号“%”通配符和下划线“_” 通配符
- %通配符代表零个或多个任意字符,_通配符代表一个字符在不知道是啥的时候用_通配符
- 下划线通配符一次只匹配一个字符
order by子句---默认升序
指定排序的列,排序的列即可是表中的列名,也可以是select 语句后指定的列名。
- Asc升序 Desc降序
select * from strdent order by math,english DESC;
注意:只有english降序了,math默认升序,所以想要math也升序在math后也加desc
注意事项
- 如果delete 和truncate删除表数据时如果不加where子句筛选将删除所有数据,delete删除可撤销
- * 号代表所有列不建议使用,它将减慢查询效率
- 可以使用mysql运算符做运算,不过一般不用数据库做计算,因为会减慢存储速度
- 数据库很灵活它可以根据计算出来的列而查询等等
运算符具体例子去看教程去吧
- 算数运算符
- + 加法运算 用于获得一个或多个值的和
- - 减法运算 用于从一个值中减去另一个值
- * 乘法运算 使数字相乘,得到两个或多个值的乘积
- / 除法运算,返回商 用一个值除以另一个值得到商
%,MOD 求余运算,返回余数 用一个值除以另一个值得到余数 - 语法:MOD(a,b)
例:SELECT MOD (7,3) ;
- NOT 或者 ! 逻辑非
- 当操作数为 0(假)时,返回值为 1;
- 当操作数为非零值时,返回值为 0;
- 当操作数为 NULL 时,返回值为 NULL。
- 在使用运算符运算时,一定要注意运算符的优先级,如果不能确定计算顺序,最好使用括号,以保证运算结果的正确。
- 当所有操作数都为非零值并且不为 NULL 时,返回值为 1;
- 当一个或多个操作数为 0 时,返回值为 0;
- 操作数中有任何一个为 NULL 时,返回值为 NULL。
- 注意:AND 运算符可以有多个操作数,但要注意多个操作数运算时,AND 两边一定要使用空格隔开,不然会影响结果的正确性。
- 当两个操作数都为非 NULL 值时,如果有任意一个操作数为非零值,则返回值为 1,否则结果为 0;
- 当有一个操作数为 NULL 时,如果另一个操作数为非零值,则返回值为 1,否则结果为NULL;
- 假如两个操作数均为 NULL 时,则返回值为 NULL。
- 当任意一个操作数为 NULL 时,返回值为 NULL;
- 对于非 NULL 的操作数,如果两个操作数都是非 0 值或者都是 0 值,则返回值为 0;
- 如果一个为0值,另一个为非 0 值,返回值为 1。
- 当操作数为 0(假)时,返回值为 1;
- = 等于
= 运算符用来比较两边的操作数是否相等,相等的话返回 1,不相等的话返回 0- 若有一个或两个操作数为 NULL,则比较运算的结果为 NULL。
- 若两个操作数都是字符串,则按照字符串进行比较。
- 若两个操作数均为整数,则按照整数进行比较。
- 若一个操作数为字符串,另一个操作数为数字,则 MySQL 可以自动将字符串转换为数字。
- 注意:NULL 不能用于 = 比较。
<=> 操作符和 = 操作符类似,不过 <=> 可以用来判断 NULL 值,具体语法规则为- 当两个操作数均为 NULL 时,其返回值为 1 而不为 NULL;
- 而当一个操作数为 NULL 时,其返回值为 0 而不为 NULL。
- 与 = 的作用相反,<> 和 != 用于判断数字、字符串、表达式是否不相等。对于 <> 和 !=,如果两侧操作数不相等,返回值为 1,否则返回值为 0;如果两侧操作数有一个是 NULL,那么返回值也是 NULL。
- <= 是小于等于运算符,用来判断左边的操作数是否小于或者等于右边的操作数;如果小于或者等于,返回值为 1,否则返回值为 0;如果两侧操作数有一个是 NULL,那么返回值也是 NULL。
- >= 是大于等于运算符,用来判断左边的操作数是否大于或者等于右边的操作数;如果大于或者等于,返回值为 1,否则返回值为 0;如果两侧操作数有一个是 NULL,那么返回值也是 NULL。
- > 是大于运算符,用来判断左边的操作数是否大于右边的操作数;如果大于,返回值为 1,否则返回值为 0;如果两侧操作数有一个是 NULL,那么返回值也是 NULL。
- < 是小于运算符,用来判断左边的操作数是否小于右边的操作数;如果小于,返回值为 1,否则返回值为 0;如果两侧操作数有一个是 NULL,那么返回值也是 NULL。
- IS NULL 或 ISNULL 运算符用来检测一个值是否为 NULL,如果为 NULL,返回值为 1,否则返回值为 0。ISNULL 可以认为是 IS NULL 的简写,去掉了一个空格而已,两者的作用和用法都是完全相同的。
- IS NOT NULL 运算符用来检测一个值是否为非 NULL,如果是非 NULL,返回值为 1,否则返回值为 0。
- BETWEEN AND 运算符用来判断表达式的值是否位于两个数之间,或者说是否位于某个范围内,它的语法格式如下:
- expr BETWEEN min AND max
expr 表示要判断的表达式,min 表示最小值,max 表示最大值。如果 expr 大于等于 min 并且小于等于 max,那么返回值为 1,否则返回值为 0。
- expr BETWEEN min AND max
- 若有一个或两个操作数为 NULL,则比较运算的结果为 NULL。
- 注意:比较运算符可以用于比较数字、字符串和表达式的值。注意,字符串的比较是不区分大小写的。
- | 位或 a | b 5 | 8
- & 位与 a & b 5 & 8
- ^ 位异或 a ^ b 5 ^ 8
- ~ 位取反 ~a ~5
- << 位左移 a << b 5 << 2,表示整数 5 按位左移 2 位
- >> 位右移 a >> b 5 >> 2,表示整数 5 按位右移 2 位
- 总结:位运算中的&、|、~和逻辑运算中的&&、||、!非常相似。

- 在无法确定优先级的情况下,可以使用圆括号“()”来改变优先级,并且这样会使计算过程更加清晰。
- + 加法运算 用于获得一个或多个值的和
in和no tin
- in:IN 运算符用来判断表达式的值是否位于给出的列表中
- not in:NOT IN 用来判断表达式的值是否不存在于给出的列表中
语法: -
- expr IN ( value1, value2, value3 ... valueN )
- expr NOT IN ( value1, value2, value3 ... valueN )
- expr 表示要判断的表达式,value1, value2, value3 ... valueN 表示列表中的值。MySQL 会将 expr 的值和列表中的值逐一对比。
- expr IN ( value1, value2, value3 ... valueN )
函数
函数就是输入值然后得到相应的输出结果,输入值称为参数(parameter),输出值称为返回值。
SELECT、INSERT、UPDATE 和 DELETE 语句及其子句(例如 WHERE、ORDER BY、HAVING 等)中都可以使用 MySQL 函数。例如,数据表中的某个数据是负数,现在需要将这个数据显示为整 数,这时就可以在 SELECT 语句中使用绝对值函数。
数学相关函数
-
- ABS 求绝对值
- SQRT 求二次方根
- MOD 求余数
- CEIL 和 CEILING 两个函数功能相同,都是返回不小于参数的最小整数,即向上取整
- FLOOR 向下取整,返回值转化为一个BIGINT
- RAND 生成一个0~1之间的随机数,传入整数参数是,用来产生重复序列
- ROUND 对所传参数进行四舍五入
- SIGN 返回参数的符号
- POW 和 POWER 两个函数的功能相同,都是所传参数的次方的结果值
- SIN 求正弦值
- ASIN 求反正弦值,与函数 SIN 互为反函数
- COS 求余弦值
- ACOS 求反余弦值,与函数 COS 互为反函数
- TAN 求正切值
- ATAN 求反正切值,与函数 TAN 互为反函数
- COT 求余切值
- ABS 求绝对值
时间日期和相关函数
-
- CURDATE 和 CURRENT_DATE 两个函数作用相同,返回当前系统的日期值
- CURTIME 和 CURRENT_TIME 两个函数作用相同,返回当前系统的时间值
- NOW 和 SYSDATE 两个函数作用相同,返回当前系统的日期和时间值
- UNIX_TIMESTAMP 获取UNIX时间戳函数,返回一个以 UNIX 时间戳为基础的无符号整数
- FROM_UNIXTIME 将 UNIX 时间戳转换为时间格式,与UNIX_TIMESTAMP互为反函数
- MONTH 获取指定日期中的月份
- MONTHNAME 获取指定日期中的月份英文名称
- DAYNAME 获取指定曰期对应的星期几的英文名称
- DAYOFWEEK 获取指定日期对应的一周的索引位置值
- WEEK 获取指定日期是一年中的第几周,返回值的范围是否为 0〜52 或 1〜53
- DAYOFYEAR 获取指定曰期是一年中的第几天,返回值范围是1~366
- DAYOFMONTH 获取指定日期是一个月中是第几天,返回值范围是1~31
- YEAR 获取年份,返回值范围是 1970〜2069
- TIME_TO_SEC 将时间参数转换为秒数
- SEC_TO_TIME 将秒数转换为时间,与TIME_TO_SEC 互为反函数
- DATE_ADD 和 ADDDATE 两个函数功能相同,都是向日期添加指定的时间间隔
- DATE_SUB 和 SUBDATE 两个函数功能相同,都是向日期减去指定的时间间隔
- ADDTIME 时间加法运算,在原始时间上添加指定的时间
- SUBTIME 时间减法运算,在原始时间上减去指定的时间
- DATEDIFF 获取两个日期之间间隔,返回参数 1 减去参数 2 的值
- DATE_FORMAT 格式化指定的日期,根据参数返回指定格式的值
- WEEKDAY 获取指定日期在一周内的对应的工作日索引
- CURDATE 和 CURRENT_DATE 两个函数作用相同,返回当前系统的日期值
字符串相关的函数
聚合函数
流程控制函数
使用范围
-
- 数学函数主要用于处理数字。这类函数包括绝对值函数、正弦函数、余弦函数和获得随机数的函数等。
- 字符串函数主要用于处理字符串。其中包括字符串连接函数、字符串比较函数、将字符串的字母都变成小写或大写字母的函数和获取子串的函数等。
- 日期和时间函数主要用于处理日期和时间。其中包括获取当前时间的函数、获取当前日期的函数、返回年份的函数和返回日期的函数等。
- 条件判断函数主要用于在 SQL 语句中控制条件选择。其中包括 IF 语句、CASE 语句和 WHERE 语句等。
- 系统信息函数主要用于获取 MySQL 数据库的系统信息。其中包括获取数据库名的函数、获取当前用户的函数和获取数据库版本的函数等。
- 加密函数主要用于对字符串进行加密解密。其中包括字符串加密函数和字符串解密函数等。
- 数学函数主要用于处理数字。这类函数包括绝对值函数、正弦函数、余弦函数和获得随机数的函数等。
代码练习:
#order dy(默认升序) 字段 desc(逆序) #查询eternity里age列以逆序排列,id列以升序(因为它默认升序) SELECT id,age FROM eternity ORDER BY id,age DESC ; #创建一个员工表employee CREATE TABLE employee( id INT, NAME VARCHAR(20), gender VARCHAR(20), birthday DATE, entry_date DATE, job VARCHAR(30), salary DOUBLE, RESUME LONGTEXT#longtext:大型文本类型 ); ALTER TABLE employee MODIFY id INT PRIMARY KEY AUTO_INCREMENT;#只有自增列,而且这个只能是键 #查询employee表的所有列,不建议用,它会减慢查询速度 SELECT * FROM employee; #插入数据 insert into 表名 values(值1,值2...);要与字段一一对应 INSERT INTO employee VALUES(2,'鬼谷','男','1918-08-08','2021-09-28','枪兵',6000,'aggggfgagag'); INSERT INTO employee(NAME,gender,birthday,entry_date,job,salary,RESUME) VALUES('鬼谷子','男','1918-08-08','2021-09-28','射手',6000,'aggggfgagag'); INSERT INTO employee(NAME,gender,birthday,entry_date,job,salary,RESUME) VALUES('鬼谷子','男','1918-08-08','2021-09-28','射手',6000,'aggggfgagag'); #修改: update 表名 set 修改内容 where 条件; UPDATE employee SET id=1 WHERE id=2; UPDATE employee SET NAME='saber',job='大不列颠国国王' WHERE id=1 AND NAME='saber'; UPDATE employee SET salary=452 WHERE id=4; SELECT NAME,id,job,salary FROM employee; #把saber的工资加1000 UPDATE employee SET salary=salary + 1000 WHERE id=1; #delete删除 : 语法:delete from 表名 where 条件; DELETE FROM employee WHERE id=3; #产出表数据 DELETE FROM employee; #truncate删除:清空表 语法:truncate 表名;或truncate table 表名; TRUNCATE employee; #双击栏位下的列名 用语句查询 SELECT id,`name`,`gender`,`birthday`,`entry_date`,`job`,`salary`,`resume` FROM employee; #查询一部分列 SELECT id,NAME FROM employee; #去重:distinct 语法:select distinct 字段 from employee; SELECT DISTINCT NAME FROM employee; #计算 SELECT id+10,NAME,salary FROM employee; #起别名 /*<表名> [AS] <别名> 其中各子句的含义如下: <表名>:数据库中存储的数据表的名称。 <别名>:查询时指定的表的新名称。 AS关键字可以省略,省略后需要将表名和别名用空格隔开。 注意:表的别名不能与该数据库的其它表同名。字段的别名不能与该表的其它字段同名。在条件表达式中不能使用字段的别名,否则会出现“ERROR 1054 (42S22): Unknown column”这样的错误提示信息。*/ SELECT id AS '身份证',NAME AS emname FROM employee; #给id和salary+6 SELECT NAME,(id+salary)+10 AS '沙雕' FROM employee; #查询salary=7000和id=1的 SELECT * FROM employee WHERE salary=7000 AND id=3; #in(set)运算符:显示再in列表值所在的行 #查询salary列表7000和6000的行 SELECT *FROM employee WHERE salary IN(7000,6000); #查询所有name以子结尾的 语法:字段 Like '%子' SELECT * FROM employee WHERE NAME LIKE '%子' ; #查询所有的name中第一个字和谷字 语法:字段 Like '_谷' SELECT * FROM employee WHERE NAME LIKE '_谷' ; #or 或 查询鬼开头或子结尾的 SELECT * FROM employee WHERE NAME LIKE '鬼%' OR '%子'; #<> 不等于 查询salary不等于7000的 SELECT * FROM employee WHERE salary <> 7000; #IS NULL:为空 select * from employee where name IS NULL; #is not null;不为空 select * from employee where name IS NOT NULL; #NOT 非 SELECT * FROM employee where not name='鬼谷';

浙公网安备 33010602011771号