MySQL----基本查询,函数
Posted 4nc414g0n
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL----基本查询,函数相关的知识,希望对你有一定的参考价值。
基本查询,函数
基本查询
以下均为例子(无语法):
①增加create
创建:略,例子:
CREATE TABLE students (
->id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
->sn INT NOT NULL UNIQUE COMMENT 'number',
->name VARCHAR(20) NOT NULL,
->qq VARCHAR(20)
->);
单行全列插入:
INSERT INTO students VALUES (100, 10000, 'name', NULL);
多行指定插入:
INSERT INTO students (id, sn, name) VALUES (102, 20001, 'name1'), (103, 20002, 'name2');
同步更新操作:(主键 或者 唯一键 对应的值已经存在而导致插入失败)
INSERT INTO students (id, sn, name) VALUES (100, 10010, '唐大师') ON DUPLICATE KEY UPDATE sn = 10010, name = 'name3';
通过函数ROW_COUNT();
可以获取到影响的行数:
- 0 row affected: 表中有冲突数据,但冲突数据的值和 update 的值相等
- 1 row affected: 表中没有冲突数据,数据被插入
- 2 row affected: 表中有冲突数据,并且数据已经被更新
替换:
REPLACE INTO students (sn, name) VALUES (20001, 'name4');
注意
:
- 1 row affected: 主键 或者 唯一键 没有冲突,则直接插入;
- 2 row affected: 主键 或者 唯一键 如果冲突,则删除后再插入**
②删除delete
DELETE
有一张成绩表:
例子:
- 删除jackD同学的考试成绩
- 删除整张表数据
先观察此表的auto_increment属性的列(17)
删除表数据
插入数据:
可以发现id仍接上次未删除表数据前的id自增
表结构仍有auto increment项
截断表
TRUNCATE [TABLE] table_name
注意:这个操作慎用
- 只能对整表操作,不能像 DELETE 一样针对部分数据操作;
- 实际上 MySQL 不对数据操作,所以比 DELETE 更快,但是TRUNCATE在删除数据的时候,并不经过真正的事物,所以无法回滚
- 会重置 AUTO_INCREMENT 项
注意: 截断整表数据,注意影响行数是 0,所以实际上没有对数据真正操作
truncate与drop,delete的对比:
- truncate与drop是DDL语句,执行后无法回滚;delete是DML语句,可回滚
- truncate只能作用于表;delete,drop可作用于表、视图等
- truncate会清空表中的所有行,但表结构及其约束、索引等保持不变;drop会删除表的结构及其所依赖的约束、索引等
- truncate会重置表的自增值;delete不会
- truncate不会激活与表有关的删除触发器;delete可以
- truncate后会使表和索引所占用的空间会恢复到初始大小;delete操作不会减少表或索引所占用的空间,drop语句将表所占用的空间全释放掉
③查询retrieve
SELECT
有一张成绩表:
注意:通常情况下不建议使用 * 进行全列查询
- 查询的列越多,意味着需要传输的数据量越大;
- 可能会影响到索引的使用。(索引待后面课程讲解)
全列查询:
SELECT * FROM table1;
指定列查询:
SELECT id, name, english FROM table1;
查询字段为表达式:
SELECT id, name, english + 10 FROM table1;
为查询结果指定别名:
SELECT id, name, chinese + math + english (as) total FROM table1;
(as可省)
去重:
SELECT DISTINCT math FROM table1;
WHERE
运算符 | 说明 |
---|---|
>, >=, <, <= | 大于,大于等于,小于,小于等于 |
= | 等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL |
<=> | 等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1) |
!=, <> | 不等于 |
BETWEEN a0 AND a1 | 范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1) |
IN (option, …) | 如果是 option 中的任意一个,返回 TRUE(1) |
IS NULL | 是 NULL |
IS NOT NULL | 不是 NULL |
LIKE | 模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符 |
例子:
- 英语不及格的同学及英语成绩 ( < 60 )
- 语文成绩在 [80, 90] 分的同学及语文成绩
- 数学成绩是 64 或者 73 或者 98 或者 78 分的同学及数学成绩
- 姓jack的同学 及 jack()同学
% 匹配任意多个(包括 0 个)任意字符
_ 匹配严格的一个任意字符
__ 匹配严格的两个任意字符,以此类推
- 语文成绩好于英语成绩的同学
- 总分在 200 分以下的同学
注意(别名不能用到where中):不能写为select name,chinese+math+english as total from table1 where total<200;
where是select之前的操作,where并不识别total
- 语文成绩 > 80 并且不姓jack的同学
- jack()同学,否则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80
NULL 的查询
- 查询qq不为空的同学即qq
- NULL 和 NULL 的比较,= 和 <=> 的区别
排序
注意:
- ASC 为升序(从小到大)
- DESC 为降序(从大到小)
- 默认为 ASC
例子:
- 同学及数学成绩,按数学成绩升序显示
- 同学及 qq 号,按 qq 号排序显示
注意
:NULL 视为比任何值都小- 查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示
- 查询同学及总分,由高到低
注意
:先select再order by别名可以在order by使用
- 查询姓jack的同学或者姓danny的同学数学成绩,结果按数学成绩由高到低显示
筛选分页结果
对未知表进行查询时,最好加一条 LIMIT 1,避免因为表中数据过大,查询全表数据导致数据库卡死
注意: 起始下标为 0
- 从 0 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
- 从 s 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n;
- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;
例子:
- 按 id 进行分页,每页 3 条记录,分别显示 第 1、2、3 页
④修改update
例子:
- 将jackD同学的数学成绩变更为 80 分
- 将jackA同学的数学成绩变更为 60 分,语文成绩变更为 70 分
- 将总成绩倒数前三的 3 位同学的数学成绩减上 30 分
- 将所有同学的语文成绩更新为原来的 2 倍
⑤查询结果插入
创建两张结构一样的表table1,table2
table1中插入数据
将 table1 的去重数据插入到 table2:INSERT INTO table2 SELECT DISTINCT * FROM table1;
⑥聚合函数
函数 | 说明 |
---|---|
COUNT([DISTINCT] expr) | 返回查询到的数据的 数量 |
SUM([DISTINCT] expr) | 返回查询到的数据的 总和,不是数字没有意义 |
AVG([DISTINCT] expr) | 返回查询到的数据的 平均值,不是数字没有意义 |
MAX([DISTINCT] expr) | 返回查询到的数据的 最大值,不是数字没有意义 |
MIN([DISTINCT] expr) | 返回查询到的数据的 最小值,不是数字没有意义 |
例子:
- 统计班级共有多少同学
注意:NULL不会记入结果
- 统计本次考试的数学成绩分数个数
count(DISTINCT math)
显示的是去重成绩
- 统计数学成绩总分
- 统计平均总分
- 返回英语最高分
- 返回 > 70 分以上的数学最低分
⑦GROUP BY
在select中使用group by 子句可以对指定列进行分组查询
select column1, column2, .. from table group by column;
有一个雇员数据库,包含,EMP员工表 DEPT部门表 SALGRADE工资等级表
例子:
- 显示每个部门的平均工资和最高工资
- 显示每个部门的每种岗位的平均工资和最低工资
- 显示平均工资低于2000的部门和它的平均工资
注意
:having只能和group by混用
,顺序是昨晚统计之后再筛选
,别名可以在having使用
,having和where可以同时使用
,having和where起作用的时间不同
⑧总结
SQL查询中各个关键字的执行先后顺序:
from > on> join > where > group by > with > having > select > distinct > order by > limit
别名能否本子句使用,取决于别名被设置的位置,以及你的子句的执行顺序
函数
时间
函数名称. | 描述 |
---|---|
current_date () | 当前日期 |
current_time() | 当前时间 |
current_timestamp () | 当前时间戳 |
date (datetime) | 返回datetime参数的日期部分 |
date_add(date, interval d_value_type) | 在date中添加日期或时间 interva1后的数值单位可以是: year minute second day |
date_sub(date, interval d_value_type) | 在date中减去日期或时间 interval后的数值单位可以是: year minute second day |
datediff (date1, date2) | 两个日期的差,单位是天 |
now () | 当前日期时间 |
年月日:
时分秒:
时间戳:
计算两个日期之间相差多少天:
例子:请查询在2分钟内发布的帖子
有一个留言板msg:有内容content和发送时间sendtime
select * from msg where date_add(sendtime, interval 2 minute) > now();
字符串
函数名称. | 描述 |
---|---|
charset (str) | 返回字符串字符集 |
concat(string2 [, …) | 连接字符串 |
instr (s tring, substring) | 返回subs tring在s tring中出现的位置,没有返回0 |
ucase(string2) | 转换成大写. |
lcase (string2) | 转换成小写. |
left (string2, length) | 从s tring2中的左边起取length个字符 |
length(string) | string的长度 |
replace(str, search str, replace. str) | 在str中用replace_ str替换search_ str . |
strcmp(string1, string2) | 逐字符比较两字符串大小 |
substring(str. position [, length]) | 从str的postion开始,取length个字符(第三个默认参数为字符长度) |
ltrim (string) rtrim (string) trim (string) | 去除前空格或后空格 |
concat例如:
select concat(name, 'string',chinese,'string',math,'string') as 'total' from student;
以首字母小写的方式显示所有员工的姓名:select concat(lcase(substring(ename, 1, 1)),substring(ename,2)) from emp;
数学
函数名称. | 描述 |
---|---|
abs (number) | 绝对值函数 |
bin (decimal_ number) | 十进制转换二进制 |
hex (decima lNumber) | 转换成十六进制 |
conv (number, from_ base, to_ base) | 任意进制转换 |
ceiling (number) | 向上去整 |
floor (number) | 向下去整 |
format (number, decimal places) | 格式化,保留小数位数 |
hex (decima lNumber) | 转换成十六进制 |
rand () | 返回随机浮点数,范围[0.0, 1.0) |
mod (number, denominator ) | 取模,求余 |
其他
函数名称. | 描述 |
---|---|
user() | 查询当前用户 |
md5(str) | 对一个字符串进行md5摘要,摘要后得到一个32位字符串 |
database() | 显示当前正在使用的数据库 |
password() | 显示密码,mysql数据库使用该函数对用户加密 |
ifnull(val1, val2) | 如果val1为null,返回val2,否则返回val1的值 |
以上是关于MySQL----基本查询,函数的主要内容,如果未能解决你的问题,请参考以下文章