MySql的常见的语句总结

2023-11-18

目录

MySql的高级查询语句

数据准备

查询中常用的DISTINCT、IN、BETWEEN,OR、DESC/ASC、COUNT、MAX、LIMIT等关键字

 SQL中关于日期的函数

 SQL的分组查询和多表查询

sql的子查询以及UNION和以及UNION ALL、NOTIN的使用

 SQL语句中的条件查询

SQL语句中的连接查询


MySql的常见的增删改查语句:

查:SELECT * from pet;

增:INSERT INTO pet VALUES(‘**’,‘**’,‘**’);

改:UPDATE pet SET **=‘**’ where **=‘**’;

删:DELETE from pet where **=‘**’

MySql的高级查询语句

数据准备

首先我们先准备数据和表,下面创建的是学生表,由no、name、sex、brithday、class五个字段组成。

CREATE TABLE student (
    no VARCHAR(20) PRIMARY KEY,
    name VARCHAR(20) NOT NULL,
    sex VARCHAR(10) NOT NULL,
    birthday DATE, -- 生日
    class VARCHAR(20) -- 所在班级
);

然后我们创建教师表,教师表由no、name、sex、brithday、profession、department六个字段组成。

CREATE TABLE teacher (
    no VARCHAR(20) PRIMARY KEY,
    name VARCHAR(20) NOT NULL,
    sex VARCHAR(10) NOT NULL,
    birthday DATE,
    profession VARCHAR(20) NOT NULL, -- 职称
    department VARCHAR(20) NOT NULL -- 部门
);

接下来是课程表,课程表由no、name、t_no组成,其中t_no代表的是教师表中的no字段。其中t_no是一个外键约束。

CREATE TABLE course (
    no VARCHAR(20) PRIMARY KEY,
    name VARCHAR(20) NOT NULL,
    t_no VARCHAR(20) NOT NULL, -- 教师编号
    -- 表示该 tno 来自于 teacher 表中的 no 字段值
    FOREIGN KEY(t_no) REFERENCES teacher(no) 
);

接下来创建的是成绩表,成绩表由s_no,c_no,degree三个字段组成。其中s_no和c_no都是外键约束,并且设置s_no和c_no为联合主键。

CREATE TABLE score (
    s_no VARCHAR(20) NOT NULL, -- 学生编号
    c_no VARCHAR(20) NOT NULL, -- 课程号
    degree DECIMAL,	-- 成绩
    -- 表示该 s_no, c_no 分别来自于 student, course 表中的 no 字段值
    FOREIGN KEY(s_no) REFERENCES student(no),	
    FOREIGN KEY(c_no) REFERENCES course(no),
    -- 设置 s_no, c_no 为联合主键
    PRIMARY KEY(s_no, c_no)
);

接下来我们使用sql语句为创建的这四个表加入数据。

-- 添加学生表数据
INSERT INTO student VALUES('101', '曾华', '男', '1977-09-01', '95033');
INSERT INTO student VALUES('102', '匡明', '男', '1975-10-02', '95031');
INSERT INTO student VALUES('103', '王丽', '女', '1976-01-23', '95033');
INSERT INTO student VALUES('104', '李军', '男', '1976-02-20', '95033');
INSERT INTO student VALUES('105', '王芳', '女', '1975-02-10', '95031');
INSERT INTO student VALUES('106', '陆军', '男', '1974-06-03', '95031');
INSERT INTO student VALUES('107', '王尼玛', '男', '1976-02-20', '95033');
INSERT INTO student VALUES('108', '张全蛋', '男', '1975-02-10', '95031');
INSERT INTO student VALUES('109', '赵铁柱', '男', '1974-06-03', '95031');

-- 添加教师表数据
INSERT INTO teacher VALUES('804', '李诚', '男', '1958-12-02', '副教授', '计算机系');
INSERT INTO teacher VALUES('856', '张旭', '男', '1969-03-12', '讲师', '电子工程系');
INSERT INTO teacher VALUES('825', '王萍', '女', '1972-05-05', '助教', '计算机系');
INSERT INTO teacher VALUES('831', '刘冰', '女', '1977-08-14', '助教', '电子工程系');

-- 添加课程表数据
INSERT INTO course VALUES('3-105', '计算机导论', '825');
INSERT INTO course VALUES('3-245', '操作系统', '804');
INSERT INTO course VALUES('6-166', '数字电路', '856');
INSERT INTO course VALUES('9-888', '高等数学', '831');

-- 添加添加成绩表数据
INSERT INTO score VALUES('103', '3-105', '92');
INSERT INTO score VALUES('103', '3-245', '86');
INSERT INTO score VALUES('103', '6-166', '85');
INSERT INTO score VALUES('105', '3-105', '88');
INSERT INTO score VALUES('105', '3-245', '75');
INSERT INTO score VALUES('105', '6-166', '79');
INSERT INTO score VALUES('109', '3-105', '76');
INSERT INTO score VALUES('109', '3-245', '68');
INSERT INTO score VALUES('109', '6-166', '81');

查询中常用的DISTINCT、IN、BETWEEN,OR、DESC/ASC、COUNT、MAX、LIMIT等关键字

DISTINCT关键字用来去重,可以查询到表中不重复的列。如下图所示,我们可以查询到teacher表中的所有的不重复的部门。而不是返回很多重复的查询结果

 使用in可以一次查询规定中的多个值,具体的查询语句格式如下所示,可以一次性查询degree为85或86或88的所有行:

select * from score where degree in (85,86,88);

使用or表示关系,与in的区别在于,in只能是一个字段的选择,而or可以是两个字段的判断。下面这个查询语句可以查询到班级号为95301或者性别为女的所有的学生。

select * from student where class=‘95031’ or sex=‘女’;

使用DESC或者ASC可以将查询到的数据按照升序或者降序排列。SQL语句格式如下所示,可以将查询到的数据按照class的升序或者降序排列:

select * from student order by class desc;
select * from student order by class asc;

也可以联合使用升序和降序,下面这个语句是将查询到的数据按照c_no的升序排序,如果c_no相同,就按照degree的降序排序。

select * from score order by c_no asc,degree desc;

我们还可以使用count计算表中某一字段有多少个,如下所示这个sql语句可以查询class为95301的学生有多少个:

select count(*) from student where class='95301';

我们还可以使用MAX、MIN查询某个字段的最大值或者最小值对应的行,具体的查询格式如下所示,该sql语句可以查询degree最大的行的s_no和c_no:

select s_no,c_no from score where degree=(select MAX(degree) from score);

对于一些数据量较大的查询结果,我们也可以使用limit取前几行数据,数据格式如下所示,下面这行语句的意思是将查询的数据按照degree的降序排序,并去、从0开始取前1行数据。

select s_no,c_no,degree from score order by degree desc limit 0,1;

 使用BETWEEN可以实现某个字段在某个范围的查询。如下所示的语句可以查询degree的范围在60到80之间的数据。

select * from score where degree between 60 and 80;

 SQL中关于日期的函数

now()返回当前日期时间,使用的sql语句为select now(),查询出的格式为2021-03-17 14:44:06;

curdate()返回当前日期,使用的sql语句为select curdate();查询的格式为2021-03-17。

curtime()返回当前时间,使用的sql语句为select curtime();返回的格式为14:46:00。

date(date)提取时间的日期部分,使用的sql语句为select date(now());,返回的格式为2021-03-17。

DATEDIFF(date1,date2)计算两个日期之间间隔的天数,(时分秒不参与计算)。

SELECT TIMESTAMPDIFF(DAY,'2012-10-01','2013-01-13');这里的TIMESTAMPDIFF是计算两个日期的天数差

SELECT TIMESTAMPDIFF(MONTH,'2012-10-01','2013-01-13');这里是计算两个日期的月差

SELECT TIMESTAMPDIFF(second,'2012-10-01 11:00:00','2013-01-13 12:00:00');这里是计算两个日期之间的秒差

DATE_FORMAT(date,"日期格式"),SQL语句为select DATE_FORMAT(now(),"%Y-%m-%d")。按照自定义格式输出日期,将now()换成具体的字段。

 SQL的分组查询和多表查询

对于分组查询,我们通常是将查询的某个分组里面的所有数据的平均数,或者是总数等等。常见的分组查询语句如下所示。该查询语句是以c_no为分组查询score表中的c_no,以及每个分组的平均值和总数。其中c_no是模糊查询,查询的是以3开头的c_no。

其中HAVING表示条件判断,通常与group by联合使用,用以对分组后的组别进行判断。

SELECT c_no, AVG(degree), COUNT(*) FROM score GROUP BY c_no HAVING COUNT(c_no) >= 2 AND c_no LIKE '3%';

对于多表查询,是指将两个表或者多个表通过外键约束将两个表或者多个表的某些行连接在一起,并将两个表中的字段组合在一起返回。具体的示例如下所示。其中name是student表中的字段,而c_no和degree是score表中的字段,两个表通过student.no=score.s_no作为条件判断。

select name,c_no,degree from student,score where student.no=score.s_no;

sql的子查询以及UNION和以及UNION ALL、NOTIN的使用

sql的子查询是指在一个查询的select语句中有两个查询的语句,其中的一个的查询作为另外一个查询的条件,就被称为子查询。具体的sql语句的格式如下所示。该sql语句先使用SELECT no FROM student WHERE class = '95031'查询到了class为95031的所有no,然后再查询到的no作为条件,查询score表中的s_no,c_no,degree。

SELECT s_no, c_no, degree FROM score
WHERE s_no IN (SELECT no FROM student WHERE class = '95031');

 UNION用来连接查询出来的两个不同的数据,查询的语句和效果如下所示。该查询语句的意义是查询计算机系和电子工程系中不同职称的教师。

SELECT * FROM teacher WHERE department = '计算机系' AND profession NOT IN (
    SELECT profession FROM teacher WHERE department = '电子工程系'
) UNION SELECT * FROM teacher WHERE department = '电子工程系' AND profession NOT IN (
    SELECT profession FROM teacher WHERE department = '计算机系'
);

UNION操作会对查询出来的两组结果进行去重处理且排序,而UNION ALL是将查询出来的结果联合在一起,并没有去重和排序的处理,具体的区别如下所示:

 

 SQL语句中的条件查询

条件查询是指在查询的时候用到 > 、< 等作为值的判断,具体的sql语句的格式如下所示,该语句的意思是查询比s_no为105的最大的degree要小的数据。

SELECT * FROM score WHERE degree < (
    (SELECT MAX(degree) from score where s_no='105')
);

条件查询还可以与分组查询结合起来,具体的格式如下所示,该查询语句可以查询以class为分组条件,且组内数据大于1的组。

SELECT class FROM student WHERE sex = '男' GROUP BY class HAVING COUNT(*) > 1;

条件查询也可以和all和any联合使用,any表示符合sql语句中的任意条件,具体的sql语句的格式如下所示。该sql语句的含义是 3-105 成绩中,只要有一个大于从 3-245 筛选出来的任意行就符合条件。该sql语句的意思是在 3-105 每一行成绩中,都要大于从 3-245 筛选出来全部行才算符合条件。

SELECT * FROM score WHERE c_no = '3-105' AND degree > ANY(
    SELECT degree FROM score WHERE c_no = '3-245'
) ORDER BY degree DESC;

 条件查询和all联合使用的格式如下所示:

SELECT * FROM score WHERE c_no = '3-105' AND degree > ALL(
    SELECT degree FROM score WHERE c_no = '3-245'
);

SQL语句中的连接查询

连接查询是将两个表的通过某个字段查询合在一起,虽然从效果上来说连接查询和多表查询的结果一样,但是连接查询时先做hash再匹配,查询效率是O(logN),效率较高。对于多表查询的话,先查询再筛选,效果是O(n^2),效率较慢。连接查询又被分为内连接,左外连接,右外连接和全外连接。

对于连接查询的测试,我们需要先准备一些数据,数据准备的sql语句的代码如下所示,我们创建了两个表,分别是person表和card表。对于person表来说,有三个字段,分别为id、name、cardID。card表有两个字段,分别是id和name。

CREATE TABLE person (
    id INT,
    name VARCHAR(20),
    cardId INT
);

CREATE TABLE card (
    id INT,
    name VARCHAR(20)
);

INSERT INTO card VALUES (1, '饭卡'), (2, '建行卡'), (3, '农行卡'), (4, '工商卡'), (5, '邮政卡');

INSERT INTO person VALUES (1, '张三', 1), (2, '李四', 3), (3, '王五', 6);

对于内连接的话,可以使用INNER JOIN将两个表连接在一起,具体的查询语句如下所示,其中on表示要执行某个条件,查询结果如下所示:

SELECT * FROM person INNER JOIN card on person.cardId = card.id;

内连接是将符合要求的两个表的字段拼接在一起。

左外连接是指完整显示左边的表,右边的表如何符合条件就显示,不符合条件就补充null,左外连接的语句为 LEFT JOIN。查询语句和查询结果如下所示:

SELECT * FROM person LEFT JOIN card on person.cardId = card.id;

右外连接是指完整显示右边的表,左边的表如果符合条件就显示,不符合条件就补null。

SELECT * FROM person RIGHT JOIN card on person.cardId = card.id;

全外连接时指完整显示两张表的全部数据。全外连接是通过UNION实现的,sql语句和效果如下所示。 

SELECT * FROM person LEFT JOIN card on person.cardId = card.id
UNION
SELECT * FROM person RIGHT JOIN card on person.cardId = card.id;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySql的常见的语句总结 的相关文章

随机推荐

  • mysql怎么替换部分字符串

    mysql替换部分字符串的方法 1 使用REPLACE 函数 语法 REPLACE 字符串 查找值 替换值 2 使用INSERT 函数 语法 INSERT 字符串 替换开始位置 要替换的字符数 替换值 mysql替换部分字符串 1 使用RE
  • 多租户mysql架构_团队开发框架实战—多租户架构

    1 对多租户的理解 多租户定义 多租户技术或称多重租赁技术 简称SaaS 是一种软件架构技术 是实现如何在多用户环境下 此处的多用户一般是面向企业用户 共用相同的系统或程序组件 并且可确保各用户间数据的隔离性 简单讲 在一台服务器上运行单个
  • XSS 跨站脚本

    XSS 跨站脚本 一 什么是XSS XSS Cross site Scripting 中文名跨站脚本攻击 其原理是攻击者利用浏览器执行前端代码 HTML CSS JavaScript 的特性 将恶意的JavaScript代码插入到页面中 当
  • LVGL动态图GIF实现 v7 version

    lvglv8 1以上的版本自带动态图库 github网址 LVGL GitHub 主要包含四个文件 gifdec c gifdec h lv gif c lvgif h 目录 lvgl release v8 1 lvgl release v
  • Cortex-AX系列性能对比

    首先要明确一个概念 Cortex并不是一种架构 而是ARM的一个系列 Cortex A系列 而我们通常意义的ARM7 ARM9 ARM11才是所谓的架构 同时需注意 Cortex A5 Cortex A8 Cortex A9 Cortex
  • ELF文件格式

    在介绍ELF格式之前 先简单说明一下可执行文件的生成流程 1 编写C源文件 或汇编源文件 2 准备共享库格式的目标文件 shared object file 如数学库 标准库 2 用编译器 compiler 将C编译成可重定位格式的目标文件
  • 关于pickle的load,loads等

    基础知识 python自带的file函数只能存储和读取字符串格式的数据 pickle可以存储和读取成其他格式比如list dict的数据 来自 https www zhihu com question 38355589 如需更详细 关于lo
  • 三十八、java版 SpringCloud分布式微服务云架构之Java 网络编程

    Java 网络编程 网络编程是指编写运行在多个设备 计算机 的程序 这些设备都通过网络连接起来 java net 包中 J2SE 的 API 包含有类和接口 它们提供低层次的通信细节 你可以直接使用这些类和接口 来专注于解决问题 而不用关注
  • windows定时自动备份

    windows定时自动备份 1 创建bat脚本 1 本地备份 复制以下代码保存该文件 修改文件名为以 bat结尾的文件 echo off echo 正在复制 C a 文件夹的内容至 D b 文件夹下 xcopy C a D b e I d
  • pip 命令行“ImportError: No Module Named Typing”

    pip遇到ImportError No Module Named Typing 原因在于运行的是python2版本 升级到python3就不会有这个问题 但是因为Mac中同时有python2和python3 可以把pip安装在python3
  • 如何写出高效的sql的一点想法及oracle常用hint用法

    author skate time 2009 05 15 如何写出高效的sql的一点想法 迷糊的问题 1 什么样的sql 才算是高效的sql呢 2 sql为什么不走索引 如何让sql走索引 即改变sql的执行计划3 索引有哪几种 4 什时候
  • 多显示器设置检测不到_那些与显示设置相关的事

    点击上方 蓝字 点击右上角 选 设为星标 标星 防走丢 那些与显示设置相关的事 本文阅读目录 显示分辨率的概念与设置 刷新率的概念与设置 不能满屏显示的原因 显卡控制面板 控制台的概念 多显示器设置 一 显示分辨率的概念与设置 显示分辨率
  • mysql 第10 天

    变量 1 定义 declare DECLARE var name type DEFAULT value 例如 定义一个 DATE 类型的变量 名称是 last month start DECLARE last month start DAT
  • 【话题】感觉和身边其他人有差距怎么办?也许自我调整很重要

    每个人能力有限 水平高低不同 我们身在大环境里 虽然在同一个起跑线上 但是时间久了 你会发现 并越来越感觉到和身边其他人有了差距 慢慢的会有一定的落差感 怎么办呢 通过此篇文章我们来简单聊聊 目录 一 焦虑怎么办 1 接受自己的不完美 2
  • P1182 数列分段 Section II

    题目描述 对于给定的一个长度为N的正整数数列 A 现要将其分成 M M N 段 并要求每段连续 且每段和的最大值最小 关于最大值最小 例如一数列 4 2 4 5 1 要分成 3 段 将其如下分段 4 2 4 5 1 第 1 段和为 6 第
  • java jsonarray 追加_我们如何在Java中将JSONArray添加到JSONObject?

    该JSON是用于交换数据的基于文本的格式 它是轻量级的组件 与语言无关 我们还可以将JSONArray添加到JSONObject 我们需要首先将一些项目添加到ArrayList中 并将此列表传递给JSONArray类的put 方法 最后使用
  • go dll 传char*

    go调用dll中方法参数为 char类型 tiger1103 2017 12 25 10 58发布 1224浏览 问与答 我有一个dll库 里面有一个C实现的方法 int GetPeopleName char strTmp int strL
  • stateflow基础知识之(时序逻辑)

    stateflow状态转移和动作过程中 可以使用两种类型的时序逻辑 基于事件和绝对时间 基于事件的时序逻辑可跟踪重复发生的事件 绝对时间时序逻辑则基于 Stateflow 图的仿真时间定义时间段 要对这些重复事件或仿真时间进行操作 可以使用
  • 总结:对Java内存模型JMM的理解

    JMM规定了线程的工作内存和主内存的交互关系 以及线程之间的可见性和程序的执行顺序 一方面 要为程序员提供足够强的内存可见性保证 另一方面 对编译器和处理器的限制要尽可能地放松 JMM对程序员屏蔽了CPU以及OS内存的使用问题 能够使程序在
  • MySql的常见的语句总结

    目录 MySql的高级查询语句 数据准备 查询中常用的DISTINCT IN BETWEEN OR DESC ASC COUNT MAX LIMIT等关键字 SQL中关于日期的函数 SQL的分组查询和多表查询 sql的子查询以及UNION和