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


注意:这个操作慎用

  1. 只能对整表操作,不能像 DELETE 一样针对部分数据操作
  2. 实际上 MySQL 不对数据操作,所以比 DELETE 更快,但是TRUNCATE在删除数据的时候,并不经过真正的事物,所以无法回滚
  3. 会重置 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----基本查询,函数的主要内容,如果未能解决你的问题,请参考以下文章

SQL多个字段相加

MySQL的排序查询和单行函数

MySQL的排序查询和单行函数

Mysql 基础排序查询及常用函数

mysql中一张学生表,查询出单科成绩前十名学生的所有信息 和总分成绩前十名学生的所有信息 在线等

mySQL数据库的基本操作"方言"02