精华内容
下载资源
问答
  • 2018-06-21 21:48:05







    更多相关内容
  • 该内容是本人博客练习sql使用的原素材,主要有:创建sql语句和插入大量数据。让你将更多的精力放在sql语句的其他学习方向上,而不再需要自己做创建sql语句和插入大量数据这样既浪费时间又毫无技术含量的工作。
  • MYSQL_DQL思维导图

    2018-09-24 14:33:52
    SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。1. 数据查询语言DQL数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块:SELECT <字段名表>FROM...
  • SQL(DQL

    2021-01-27 13:25:41
    1.字段(列)控制 1)查询所有列 SELECT*FROM表名; SELECT*FROMemp;-->其中“*”表示查询所有列2)查询指定列 SELECT列1[,列2,...列N]FROM表名;SELECTempno,ename,sal,commFROM
  • SQL中DQL语言笔记

    2021-08-03 20:46:41
    SQL中DQL语言笔记
  • DQL DQL:data Query language 数据查询语言 格式:select[distinct] 字段1,字段2 from 表名 where 控制条件 (distinct: 显示结果时,是否去除重复列 给哪一列去重就在哪一列字段前加入distinct) 学生表 (1)...
  • 3,DQL(DataQueryLanguage):数据查询语言,用来查询记录(数据); 4,DCL(DataControlLanguage):数据控制语言,用来定义访问权限和安全级别。 举例说明 1,DDL 用来定义数据库对象:库、表、列等; 适用范围...
  • DQL(Data Query Language 数据查询语言) SELECT 语法 SELECT [ALL | DISTINCT] { * | table.* | [table.field1 [as alias1][,table.field2] [as alias2][,...]]} FROM table_name [as table_alias] [left | out | ...
  • 强化学习(八)-深度Q学习(DeepQ-learning-DQL-DQN)原理及相关实例 深度学习原理.pdf
  • MySQL基础(DDL、DML、DQL

    万次阅读 多人点赞 2022-05-16 19:50:29
    我们开发应用程序的时候,程序中的所有数据...SQL是用来存取关系数据库的语言,具有定义、操纵、控制和查询关系型数据库的四方面功能(DDL、DML、DQL、DCL)。所以针对四方面功能,我们学习对数据库的增、删、改、查。

    数据库相关概念

    什么是数据库

    保存数据的仓库。它体现我们电脑中,就是一个软件或者文件系统。然后把数据都保存这些特殊的文件中,并且需要使用固定的语言(SQL语言/语句)去操作文件中的数据。

    • 存储数据的仓库,数据是具有组织的进行存储
    • 英文名:DataBase,简称 DB

    数据库的优点

    数据库是按照特定的格式将数据存储在文件中,通过SQL语句可以方便的对大量数据进行操作,数据库是对大量的信息进行管理的高效的解决方案。

    常见的数据库

    常见的关系型数据库管理系统

    我们开发应用程序的时候,程序中的所有数据,最后都需要保存到专业软件中。这些专业的保存数据的软件我们称为数据库。我们学习数据库,并不是学习如何去开发一个数据库软件,我们学习的是如何使用数据库以及数据库中的数据记录的操作。而数据库软件是由第三方公司研发。

    在这里插入图片描述

    • Oracle:它是Oracle公司的大型关系型数据库。系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、安全可靠的。但是它是收费的。
    • MYSQL:早期由瑞典一个叫MySQL AB公司开发的,后期被sun公司收购,再后期被Oracle收购。体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。MySQL6.x版本也开始收费。
    • DB2 :IBM公司的数据库产品,收费的。常应用在银行系统中.
    • SQLServer:MicroSoft 公司收费的中型的数据库。C#、.net等语言常使用。
    • SyBase:Sybase公司的。 已经淡出历史舞台。提供了一个非常专业数据建模的工具PowerDesigner。

    常用数据库:Java开发应用程序主要使用的数据库:MySQL(5.6)、Oracle、DB2。(原因:开源,免费,功能足够强大,足以应付web开发)

    关系型数据库

    在开发软件的时候,软件中的数据之间必然会有一定的关系存在。比如商品和客户之间的关系,一个客户是可以买多种商品,而一种商品是可以被多个客户来购买的。

    需要把这些数据保存在数据库中,同时也要维护数据之间的关系,这时就可以直接使用上述的那些数据库。而上述的所有数据库都属于关系型数据库。

    关系型数据:设计数据库的时候,需要使用E-R实体关系图来描述。

    E-R 是两个单词的首字母,E表示Entity实体 R表示Relationship 关系。

    • 1.数据表中的数据之间必然会有一定的关系存在,比如商品和客户之间的关系,一个客户是可以买多种商品,而一种商品是可以被多个客户来购买的。
    • 2.设计数据库的时候,可以使用ER实体关系图来描述表之间的关系,E表示Entity 实体 , R表示Relationship 关系
    • 3.实体:可以理解成我们Java程序中的一个对象。比如商品,客户等都是一个实体对象。在E-R图中使用 矩形(长方形) 表示。
    • 4.属性:实体对象中是含有属性的,比如商品名、价格等。针对一个实体中的属性,我们称为这个实体的数据,在E-R图中使用椭圆表示。
    • 5.关系:实体和实体之间的关系:在E-R图中使用菱形表示。

    需求: 使用E-R图描述 客户、商品、订单之间的关系
    在这里插入图片描述

    MySQL数据库

    SQL简介

    什么是SQL

    Structured Query Language结构化查询语言。SQL语句不依赖于任何平台,对所有的数据库是通用的。学会了SQL语句的使用,可以在任何的数据库使用,但都有特有内容。SQL语句功能强大、简单易学、使用方便。

    SQL特点

    SQL语句是一个非过程性的语言,每一条SQL执行完都会有一个具体的结果出现。多条语句之间没有影响

    SQL作用

    SQL语句主要是操作数据库,数据表,数据表中的数据记录

    SQL通用语法

    1. SQL语句可以单行或多行书写,以分号结尾。
    2. 可使用空格和缩进来增强语句的可读性。
    3. MySQL数据库的SQL语句不区分大小写,关键字开发中一般大写.
    4. 三种注释
      - 单行注释: -- 注释内容
      - 多行注释: /* 注释内容 */
      - # 注释内容:(mysql特有的单行注释)

    SQL分类
    SQL是用来存取关系数据库的语言,具有定义、操纵、控制和查询关系型数据库的四方面功能。所以针对四方面功能,我们将SQL进行了分类。

    1. DDL(Data Definition Language)数据定义语言
      用来定义数据库对象:数据库,表,列等。关键字:create drop alter truncate(清空数据记录) show等

    2. DML(Data Manipulation Language)数据操作语言★★★

      在数据库表中更新,增加和删除记录。如 update(更新), insert(插入), delete(删除) 不包含查询

    3. DQL(Data Query Language) 数据查询语言★★★★★
      数据表记录的查询。关键字select。

    4. DCL(Data Control Language)数据控制语言(了解)

      是用来设置或更改数据库用户或角色权限的语句,如grant(设置权限),revoke(撤销权限),begin transaction等。这个比较少用到。

    在这里插入图片描述

    MySQL 目录结构

    在这里插入图片描述

    MySQL 数据库连接

    MySQL是一个需要账户名密码登录的数据库,登陆后使用,它提供了一个默认的root账号,使用安装时设置的密码即可登录。

    启动数据库服务:在打开dos窗口中输入net start MySQL命令
    在这里插入图片描述
    关闭数据库服务:在打开dos窗口中输入net stop MySQL命令
    在这里插入图片描述
    连接MySQL:登录格式1:mysql -u用户名 -p密码

    mysql -uroot -p123456
    

    在这里插入图片描述
    登录格式2:mysql[-h连接主机ip地址 -P端口号3306] -u 用户名 -p 密码

    mysql -h 127.0.0.1 -P 3306 -u root -p 123456
    

    在这里插入图片描述
    如果连接的是本机:可以省略 -h -P 主机IP和端口。这样就可以登录mysql数据库了

    退出exit命令
    在这里插入图片描述
    显示数据库: show databases;
    在这里插入图片描述

    SQL_DDL_操作数据库

    DDL_创建和查看数据库

    创建数据库:

    1.直接创建数据库

    create database 数据库名;
    

    2.判断数据库是否存在并创建(如果不存在,则创建)

    create database if not exists 数据库名;
    

    3.创建数据库并指定字符集(编码表)

    create database 数据库名 character set 字符集;
    

    说明:字符集就是编码表名,在mysql中utf8

    查看数据库:

    1.查看所有数据库

    show databases;
    

    2.查看某个数据库的定义信息

    show create database 数据库名;
    

    3.查看当前使用的数据库

    select database();
    

    使用和切换数据库:

    use 数据库名;
    

    DDL_修改和删除数据库

    修改数据库:

    1.修改数据库字符集

    -- alter 表示修改
    alter database 数据库名 default character set 新字符集;
    

    注意:如果修改数据库指定的编码表是utf8,记住不能写utf-8

    Java中的常用编码对应mysql数据库中的编码

    JavaMySQL
    UTF-8utf8
    GBKgbk
    GB2312gb2312
    ISO-8859-1latin1

    删除数据库:

    1.直接删除

    -- drop 删除数据库
    drop database 数据库名;
    

    2.删除数据库时判断是否存在(如果存在,则删除)

    drop database if exists 数据库名;
    

    SQL_DDL_操作数据表

    DDL_数据库约束

    约束的概念:

    • 约束是作用于表中列上的规则,用于限制加入表的数据

    • 约束的存在保证了数据库中数据的正确性、有效性和完整性

    约束的分类:

    约束名称关键字描述
    非空约束NOT NULL保证列中所有数据不能有null空值
    唯一约束UNIQUE保证列中所有数据各不相同
    主键约束PRIMARY KEY主键是一行数据的唯一标识,要求非空且唯一
    检查约束CHECK保证列中的值满足某一条件
    默认约束DEFAULT保存数据时,未指定值则采用默认值
    外键约束FOREIGN KEY外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性

    MySQL5.7不支持检查约束,但写入语句不会报错,MySQL8.0版本支持检查约束

    非空约束

    非空约束用于保证列中所有数据不能有NULL值

    1.建表时添加约束

    -- 创建表时添加非空约束
    create table 表名(
        列名 数据类型 not null,
        ...
    );
    

    2.建完表之后添加约束

    -- 建完表之后添加约束
    alter table 表名 modify 字段名 数据类型 not null;
    

    3.删除约束

    alter table 表名 modify 字段名 数据类型;
    

    唯一约束

    唯一约束用于保证列中所有数据各不相同

    1.创建表时添加唯一约束

    -- 方式1
    create table 表名(
        字段名 数据类型 UNIQUE,
        ...
    );
    -- 方式2
    create table 表名(
        字段名 数据类型,
        ...
        [CONSTRAINT] [约束名称] UNIQUE(列名)
    );
    

    2.建完表之后添加唯一约束

    -- 建完表后添加唯一约束
    alter table 表名 modify 字段名 数据类型 UNIQUE;
    

    3.删除唯一约束

    alter table 表名 drop index 字段名;
    

    主键约束

    • 主键是一行数据的唯一标识,要求非空且唯一
    • 一张表只能有一个主键

    1.创建表时添加主键约束

    create table 表名(
        字段名 数据类型 PRIMARY KEY [AUTO_INCREMENT],
        -- [AUTO_INCREMENT] 当不指定值时自动增长
        ...
    );
    create table 表名(
        列名 数据类型,
        [CONSTRAINT] [约束名称] PRIMARY KEY(列名)
    )
    

    2.建完表之后添加主键约束

    alter table 表名 add PRIMARY KEY(字段名);
    

    3.删除主键约束

    alter table 表名 drop PRIMARY KEY;
    

    默认约束

    保存数据时,未指定值则采用默认值

    1.创建表时添加默认约束

    create table 表名(
        字段名 数据类型 default 默认值,
        ...
    );
    

    2.建完表后添加默认约束

    alter table 表名 alter 列名 set DEFAULT 默认值;
    

    3.删除约束

    alter table 表名 alter 列名 drop DEFAULT;
    

    DDL_创建和查看和表

    前提 :创建数据库db1并使用这个数据库

    -- 创建数据库
    create database db1;
    -- 使用数据库
    use db1;
    

    创建表:

    create table 表名(
        字段名1 字段类型 约束条件,
        字段名2 字段类型 约束条件,
        ...
        字段名n 字段类型 约束条件
    );
    -- 注意:最后一个字段不加逗号
    

    创建一个表结构和其他表结构相同的表

    create table 表名 like 其他表名;
    

    MySQL中常用的数据类型
    在这里插入图片描述
    案列需求:

    设计一张学生表,要求如下:

    • 学号,要求唯一主键,自增
    • 姓名,不能为空,且唯一
    • 性别,只有男和女,默认值为null
    • 班级,字符串类型
    • 入学时间,取值为年、月、日
    • 数学成绩,double类型,默认为60分
    • 英语成绩,double类型,没有默认值
    create table students(
        id int primary key auto_increment,
        name varchar(10) not null unique,
        sex enum('男','女') default null,
        class varchar(10),
        starttime date,
        math int default 60,
        english int
    ); 
    

    在这里插入图片描述
    查看表:

    1.查看某个数据库中所有的表

    show tables;
    

    2.查看表结构

    desc 表名;
    

    3.查看创建表的SQL语句

    show create table 表名;
    -- 根据该语句查看上面案列的建表sql语句
    show create table students;
    

    在这里插入图片描述

    DDL_删除表和修改表的结构

    删除表:

    1.直接删除

    drop table 表名;
    

    2.删除表时判断表是否存在(如果存在,则删除)

    drop table if exists 表名;
    

    修改表:

    1.修改表名

    alter table 旧表名 rename to 新表名;
    

    2.向表中添加一个字段(一列)

    alter table 表名 add 字段名 数据类型;
    

    3.修改表中字段数据类型

    alter table 表名 modify 字段名 新的数据类型;
    

    4.修改表中字段名(列名)和数据类型

    alter table 表名 change 字段名 新的字段名 新的数据类型;
    

    5.删除表中字段(列)

    alter table 表名 drop 字段名;
    

    SQL_DML_操作数据库

    DML_插入表数据

    1.插入全部字段

    -- 全部字段写出来
    insert into 表名(字段1,字段2,...) values(1,2,...);
    -- 插入全部不写字段名
    insert into 表名 values(1,2,...);
    -- 给案例中的表插入数据
    insert into students(id,name,sex,class,starttime,math,english) values(1,'张三','男','高三1班','2022-03-02',80,69);
    insert into students values(2,'李四','女','高三2班','2022-03-01',70,80);
    

    在这里插入图片描述
    2.插入部分数据

    -- 插入姓名,班级,入学时间,英语成绩
    -- id默认增长,性别默认null,数学默认60
    insert into students(name,class,starttime,english) values('王五','高三3班','2022-03-02',78);
    

    在这里插入图片描述
    说明:插入部分数据的时候,要求列名一定书写出来。

    3.批量插入数据

    insert into 表名 values(字段值1, 字段值2...),
    (字段值1, 字段值2...),
    (字段值1, 字段值2...);
    

    没有添加数据的字段会使用NULL

    注意:

    • 值与列一一对应。有多少个列,就需要写多少个值。如果某一个列没有值,可以使用null,表示插入空。

    • 值的数据类型,与列被定义的数据类型要相匹配,并且值的长度,不能够超过定义的列的长度。

    • 字符串:插入字符类型的数据,建议写英文单引号括起来。在mysql中,使用单引号表示字符串

    • date 时间类型的数据也得使用英文单引号括起来: 如yyyy-MM-dd

    DML_更新表数据

    1.不带条件修改数据

    update 表名 set 字段名=新的值,字段名=新的值,...;
    -- 注意:不带条件的修改是将数据表中的整列都做修改
    -- 修改students表中math的值为90
    update students set math=90;
    

    在这里插入图片描述
    2.带条件修改数据

    update 表名 set 字段名=新的值,字段名=新的值,... where 条件;
    -- 修改students表中王五的性别为男,数学成绩设置为70
    update students set sex='男',math=70 where name='王五';
    

    在这里插入图片描述
    3.关键字说明

    UPDATE: 表示修改记录 
    SET: 要改哪个字段
    WHERE: 设置条件
    

    4.注意

    • 不带条件的更新数据库记录:UPDATE 表名 SET 字段名=新的值;是将整个表中修改的列修改
    • 带条件:UPDATE 表名 SET 字段名=新的值 WHERE 条件

    DML_删除表记录

    1.不带条件删除

    DELETE -- 删除记录
    DELETE FROM 表名;
    表还在,可以操作,只是删除数据。
    

    2.带条件删除

    DELETE FROM 表名 WHERE 条件;
    -- 删除学生表中的王五的信息
    DELETE FROM students WHERE name='王五';
    

    在这里插入图片描述
    3.truncate删除表记录(属于DDL)

    truncate table 表名;
    

    4.truncate和delete区别

    • delete是将表中的数据一条一条删除
    • truncate是将整个表摧毁,重新创建一个新的表,新的表结构和原来表结构一模一样

    SQL_DQL_ 简单查询数据

    准备一张学生表,在这张表上进行查询操作
    在这里插入图片描述

    DQL_基础查询

    1.查询所有数据

    select * from 表名;
    -- 查询学生表中所有的数据
    select * from students;
    

    在这里插入图片描述
    2.查询指定列的数据

    select 字段名1,字段名2,... from 表名;
    -- 查询姓名和班级这两个字段
    select name,class from students;
    

    在这里插入图片描述
    3.查询到的字段设置别名

    select 字段名1 as 别名1,字段名2 as 别名2 from 表名;
    -- 查询students表中的字段并设置别名
    select id as 学号,name as 姓名,sex as 性别,class as 班级 , starttime as 入学时间 from students;
    

    在这里插入图片描述
    4.查询到的数据去重

    -- DISTINCT  去重复
    -- 查询班级字段结果不出现重复的
    select DISTINCT class from students;
    

    在这里插入图片描述

    DQL_条件查询

    1.条件查询语法

    select 字段名1,字段名2,... where 条件列表;
    

    2.条件运算符

    符号功能
    >大于
    <小于
    >=大于等于
    <=小于等于
    =等于
    <>或!=不等于
    BETWEEN…AND…在某个范围内(都包括)
    IN(…)多选一
    LIKE模糊查询,_单个任意字符,%多个任意字符
    IS NULL为空
    IS NOT NULL不为空
    AND 或 &&与,并且
    OR 或 ||或,或者
    NOT 或 !非,不是

    3.查询数学成绩大于80并且性别为男的学生

    -- 两个条件同时满足
    select * from students where math > 80 and sex='男';
    

    在这里插入图片描述
    4.查询英语成绩在60-80之间的学生

    -- BETWEEN 值1 AND 值2 -- 表示从值1到值2范围,包头又包尾
    select * from students where english between 60 and 80;
    select * from students where english>=60 && english<=80;
    

    在这里插入图片描述
    5.查询学号为1或者2或者3的学生

    -- in里面的每个数据都会作为一次条件,只要满足条件的就会显示
    select * from students where id in (1,2,3);
    

    在这里插入图片描述

    DQL_模糊查询

    LIKE:表示模糊查询

    select * from 表名 where 字段名 like '通配字符';
    

    MySQL通配符有两个:

    • %:表示0个或多个字符(任意字符)
    • _:表示一个字符

    1.查找名字中以开头的学生

    -- '孙%'表示孙后面有任意个字符
    select * from students where name like '孙%';
    

    在这里插入图片描述
    2.查找名字中以开头的两个字的学习

    -- '孙_'表示孙后面只能有一个字符
    select * from students where name like '孙_';
    

    在这里插入图片描述

    DQL_查询排序

    通过ORDER BY子句,可以将查询出的结果进行排序(排序只是显示方式,不会影响数据库中数据的顺序)

    -- ASC:升序排序(默认)
    -- DESC:降序排序
    select 字段 from 表名 order by 排序字段 [ASC|DESC];
    

    1.单列排序

    -- 查询学生的数学成绩按照升序排序
    select * from students order by math ASC;
    

    在这里插入图片描述
    2.组合排序

    -- 查询数学成绩升序的基础上,英语成绩降序
    -- 组合排序就是先按第一个字段进行排序,如果第一个字段相同,才按第二个字段进行排序,依次类推。
    select * from students order by math ASC,english DESC;
    

    在这里插入图片描述

    DQL_ 聚合函数

    之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个结果值;另外聚合函数会忽略空值,对于null不作为统计。

    1.五个聚合函数

    函数名功能
    count(列名)统计数量(一般选用不为null的列)
    max(列名)最大值
    min(列名)最小值
    sum(列名)求和
    avg(列名)平均值

    2.聚合函数语法

    select 聚合函数名(列名) from 表名;
    

    注意:null 值不参与所有聚合函数运算

    3.查询学生总数

    select count(id) from students;
    -- 通常使用
    select count(*) from students;
    

    在这里插入图片描述
    4.查询最高分和最低分

    -- 查询数学最高分和英语最低分
    select max(math),min(english) from students;
    

    在这里插入图片描述
    5.求和求平均值

    -- 求该表数学总分和平均值
    select sum(math),avg(math) from students;
    

    在这里插入图片描述
    6.ifnull()函数

    -- ifnull(列名,默认值)函数表示判断该列是否为空值,如果为null,返回默认值,如果不为空,返回实际值
    ifnull(math,60); -- 如果数学成绩为null时,返回60,如果不为null,就返回实际值
    

    DQL_分组查询

    分组: 按照某一列或者某几列。把相同的数据,进行合并输出。

    1.注意

    • 按照某一列进行分组,目的为了统计使用。
    • 聚合函数:分组之后进行计算
    • 通常select后面的内容是被分组的列,以及聚合函数
    • sql语句中的where后面不允许添加聚合函数
    • 可以使用having条件,表示分组之后的条件,在having后面可以书写聚合函数

    2.查询各个班级的数学成绩总和

    -- 查询每个班的数学成绩总和
    select class,sum(math) from students group by class;
    

    在这里插入图片描述
    3.having用法

    having必须和group by 一起使用,having和where的用法一模一样,where怎么使用having就怎么使用,where不能使用的,having也可以使用,比如说where后面不可以使用聚合函数,但是在having后面是可以使用聚合函数的。

    -- 查询每个班数学总成绩大于300分的班级并显示总成绩
    select class,sum(math) from students group by class having sum(math)>300;
    

    在这里插入图片描述
    4.where和having的区别

    • having 通常与group by 分组结合使用。 where 和分组无关。

    • having 可以书写聚合函数 (聚合函数出现的位置: having 之后),例如having中的 聚合函数(count,sum,avg,max,min),是不可以出现where条件中。

    • where 是在分组之前进行过滤的,having 是在分组之后进行过滤的。

    DQL_分页查询

    1.应用和概念

    比如我们登录京东,淘宝,返回的商品信息可能有几万条,不是一次全部显示出来。是一页显示固定的条数。假设我们一每页显示5条记录的方式来分页。
    在这里插入图片描述

    -- 起始索引:从0开始,索引是0表示数据表第一行数据
    select 字段列表 from 表名 limit 起始索引,查询条目数;
    

    计算公式:起始索引=(当前页码-1)* 每页显示的条数

    注意:

    • 分页查询limit是MySQL数据库的方言
    • Oracle分页查询使用rownumber
    • SQLServer分页查询使用top

    2.分页查询

    -- 查询学生表中数据,每四条数据为一页
    select * from students limit 0,4;
    select * from students limit 4,4;
    select * from students limit 8,4;
    select * from students limit 12,4;
    ...
    -- 注意:最后一行不够查询条目数,有多少就显示多少
    

    3.返回前几条或者中间某几行数据

    -- 2表示分页查询的索引,对应数据表是第3行数据,4表示每页显示4条数据
    -- 查询从第三行数据开始查询之后的四条数据
    select * from students limit 2,4;
    

    在这里插入图片描述
    4.SQL执行顺序

    SELECT 字段名(5) FROM 表名(1) WHERE 条件(2) GROUP BY 分组列名(3) HAVING 条件(4) ORDER BY 排序列名(6) LIMIT 跳过行数, 返回行数(7);
    执行顺序:1234567
    

    顺序:1234567

    展开全文
  • 学习mysql查询命令,可以帮助你快速掌握,里面的东西比较齐全,知识比较详细,可观性较强,希望里面的东西能够帮助到你
  • 1.3 数据查询语言(DQL)   数据查询语言(Data Query Language, DQL)是SQL语言中,负责进行数据查询而不会对数据本身进行修改的语句,这是最基本的SQL语句。保留字SELECT是DQL(也是所有SQL)用得最多的动词,...

    在这里插入图片描述

    一、常用开发工具

    1. Navicate


    Navicat是一套快速、可靠并价格相宜的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设。它的设计符合数据库管理员、开发人员及中小企业的需要。Navicat 是以直觉化的图形用户界面而建的,让你可以以安全并且简单的方式创建、组织、访问并共用信息。

    http://www.navicat.com.cn/

    pojie方式:https://www.jb51.net/database/710931.html

    在这里插入图片描述

    在这里插入图片描述

    再手动激活

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    搞定,就可以使用了

    2. SQLyog

    MySQL可能是世界上最流行的开源数据库引擎,但是使用基于文本的工具和配置文件可能很难进行管理。SQLyog提供了完整的图形界面,即使初学者也可以轻松使用MySQL的强大功能。其拥有广泛的预定义工具和查询、友好的视觉界面、类似 Excel 的查询结果编辑界面等优点。

    https://www.webyog.com/product/sqlyog

    3. 使用客户端工具

    1:创建一个数据库;选择编码为utf-8

    2: 创建数据表

    3: 往数据表里面存储数据

    二、SQL语句基础

      结构化查询语言(Structured Query Language)简称SQL,结构化查询语言是一种数据库查询和程序设计语言,用于存放数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统,可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。
    在这里插入图片描述

    1.SQL分类

    1.1 数据定义语言(DDL)

      数据定义语言 (Data Definition Language, DDL) 是SQL语言集中,负责数据结构定义与数据库对象定义的语言,由CREATE、ALTER与DROP三个语法所组成,最早是由 Codasyl (Conference on Data Systems Languages) 数据模型开始,现在被纳入 SQL 指令中作为其中一个子集。

    1.2 数据操纵语言(DML)

      数据操纵语言(Data Manipulation Language, DML)是SQL语言中,负责对数据库对象运行数据访问工作的指令集,以INSERT、UPDATE、DELETE三种指令为核心,分别代表插入、更新与删除。

    1.3 数据查询语言(DQL)

      数据查询语言(Data Query Language, DQL)是SQL语言中,负责进行数据查询而不会对数据本身进行修改的语句,这是最基本的SQL语句。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有FROM,WHERE,GROUP BY,HAVING和ORDER BY。这些DQL保留字常与其他类型的SQL语句一起使用。

    1.4 数据控制语言(DCL)

      数据控制语言 (Data Control Language) 在SQL语言中,是一种可对数据访问权进行控制的指令,它可以控制特定用户账户对数据表、查看表、预存程序、用户自定义函数等数据库对象的控制权。由 GRANT 和 REVOKE 两个指令组成。DCL以控制用户的访问权限为主,GRANT为授权语句,对应的REVOKE是撤销授权语句。

    2.DDL

       数据定义语言 (Data Definition Language, DDL) ,它主要包括三个关键字:create ,alter , drop(数据库关键字不分大小写 ),主要操作对象 有数据库、表、索引、视图等.

    2.1 操作数据库

    创建数据库

    create databases 数据库名称;
    

    使用这个数据库

    use 数据库名称;
    

    删除这个数据库

    drop database 数据库名称;
    

    注意:执行的SQL语句不区分大小写,一个SQL语句末尾要加上;

    2.2 操作表结构

      表【TABLE】是数据库中存储数据的载体。

    2.2.1 语法结构

      然后我们来看下DDL是如何来操作表【TABLE】的。

    CREATE TABLE 表名称
    (
    列名称1 数据类型,
    列名称2 数据类型,
    列名称3 数据类型,
    ....
    )
    

      创建一张用户表

    CREATE TABLE T_USER(
    id int(3) ,
    user_name varchar(30) 
    )
    

    2.2.2 添加注释

      为了让别人能清楚我们定义的字段的含义,我们需要给我们创建的字段添加对应的注释来说明。

    CREATE TABLE T_USER(
    id int(3) ,
    user_name varchar(30) COMMENT '用户名'
    )COMMENT='用户表'
    

      或者在建表后添加

    ALTER TABLE t_user
    	MODIFY COLUMN user_name varchar(20) COMMENT 'aaa' ;
    

    2.2.3 删除表

      删除表通过DROP关键字来实现

    DROP TABLE T_USER;
    

    2.2.4 修改表

    添加字段

    ALTER TABLE T_USER ADD address VARCHAR(2);
    

    修改字段类型

    ALTER TABLE T_USER MODIFY address VARCHAR(50);
    

    修改字段名称

    ALTER TABLE T_USER RENAME COLUMN address TO address666;
    

    删除字段

    ALTER TABLE T_USER DROP COLUMN address666;
    

    2.2.5 表结构的约束

    非空约束

    ALTER TABLE T_USER 
    	CHANGE id id INT NOT NULL COMMENT '主键';
    

    或者在建表的时候指定

    # 删除表
    DROP TABLE T_USER;
    CREATE TABLE T_USER(
    id INT(5) NOT NULL COMMENT  '主键',
    user_name VARCHAR(20) COMMENT '账号' ,
    age INT(2) COMMENT '年龄' DEFAULT 18
    )COMMENT='用户表' ;
    

    默认值

    DROP TABLE T_USER;
    CREATE TABLE T_USER(
    id INT(5)  NOT NULL COMMENT  '主键',
    user_name VARCHAR(20) COMMENT '账号' ,
    age INT(2) COMMENT '年龄' DEFAULT 18
    )COMMENT='用户表' ;
    

    唯一约束

      该字段中不能出现相同的值,null除外

    DROP TABLE T_USER;
    CREATE TABLE T_USER(
    id INT(5)  UNIQUE COMMENT  '主键',
    user_name VARCHAR(20) COMMENT '账号' ,
    age INT(2) COMMENT '年龄' DEFAULT 18
    )COMMENT='用户表' ;
    

    建表后设置字段的唯一约束条件

    ALTER TABLE t_user add CONSTRAINT unique_name UNIQUE(user_name);
    alter table t_user add unique (user_name);
    

    主键

      能唯一标识一条记录的字段,不能为空,唯一约束,只能有一个主键。

    DROP TABLE T_USER;
    CREATE TABLE T_USER(
    id INT(5)  PRIMARY KEY COMMENT  '主键',
    user_name VARCHAR(20) COMMENT '账号' ,
    age INT(2) COMMENT '年龄' DEFAULT 18
    )COMMENT='用户表' ;
    

    联合主键:多个字段组合的信息是不能出现重复的

    ALTER TABLE t_user
      ADD PRIMARY KEY (id, user_name);
    

    外键

      外键就是在主表中可以重复出现,但是它的值是另一个表的主键,外键使两个表相关,外键可约束表的数据的更新,外键和主键表联系,数据类型要统一,长度(存储大小)要统一,在更新数据的时候会保持一致性

    # 删除表
    DROP TABLE T_USER;
    CREATE TABLE T_USER(
    id INT(5)  PRIMARY KEY COMMENT  '主键',
    user_name VARCHAR(20) COMMENT '账号' ,
    age INT(2) COMMENT '年龄' DEFAULT 18,
    deptid INT(30) ,
    CONSTRAINT FK_DEPT_ID FOREIGN KEY(deptid) REFERENCES T_DEPT(dept_id)
    )COMMENT='用户表' ;
    
    ALTER TABLE T_USER ADD
    	CONSTRAINT FK_DEPT_ID FOREIGN KEY(deptid) REFERENCES T_DEPT(dept_id)
    

    注意:外键字段的级联关系,如果我们要删除外键对应的主键记录,那么必须要先删除该注解对应的所有的外键记录,否则删除不成功,

    实际开发中我们对主键的使用比较少。

    check

      粒度更细的约束。

    DROP TABLE T_USER;
    CREATE TABLE T_USER(
    id INT(5)  PRIMARY KEY COMMENT  '主键',
    user_name VARCHAR(20) COMMENT '账号' ,
    age INT(3) COMMENT '年龄' ,
    CHECK (age > 0 AND age < 40)
    )COMMENT='用户表' ;
    

    between and

    in not in or

    2.2.6 字段类型

    MySQL 中定义数据字段的类型对你数据库的优化是非常重要的。

    MySQL 支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

    数值类型

    在这里插入图片描述

    日期和时间类型

    在这里插入图片描述

    字符串类型

    在这里插入图片描述

    char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。

    CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换

    3.DML

      数据操纵语言(Data Manipulation Language, DML)是SQL语言中,负责对数据库对象运行数据访问工作的指令集,以INSERT、UPDATE、DELETE三种指令为核心,分别代表插入、更新与删除。

    3.1 INSERT

    插入单行记录

    INSERT into 列名(列名,。。)values(,)
    

    插入多行记录

    复制表结构和数据

     create table t_student_beifen as select * from t_student
    

    复制表结构

     create table t_student_beifen as select * from t_student where 1 <> 1
    

    把其他表结构中的数据插入到表中:

      insert into t_student(id,stuname) select id,stuname from t_student01 
    

    可以在单行插入的后面添加多个插入的信息列。

    # 插入语句后面可以跟多个插入的信息
    insert into t_user (user_name,age)values('烤鱼1',22),('烤鱼2',22),('烤鱼3',22);
    

    3.2 UPDATE

    语法结构

    update 表名 set 字段名=值,字段名=值。。 where 。。。
    

    案例:

    创建一张学生表

    CREATE TABLE t_student
    (
    	id int(3) primary key,
        stuname varchar(30) not null,
        sex char(3) ,
        birthday date
    )
    

    把学生表中的性别全部改成女

    update t_student set sex = '女' ;
    

    把’张三’的性别改成’男’

    update t_student set sex = '男' where stuname = '张三';
    

    把出生日期改成当前时间now()

    # select now() 
    update t_student set birthday = now() 
    

    把性别为女的 所有的出生日期改成2022-01-18

    # 直接把一个字符串复制给了一个 date 类型的数据
    # str_to_date 把字符串转换为日期类型
    update t_student set birthday = str_to_date('2022-01-18','%Y-%m-%d') where sex = '女';
    

    从别的表把值设置到本表中

    create table t_student_1 as select * from t_student;
    update t_student_1 t1,t_student t2 set t1.stuname = t2.stuname where t1.id = t2.id;
    

    3.3 DELETE

    delete删除:

    delete from t_student where id = 1;
    # 如果不带where 条件 那么表示删除该表中的所有的记录 慎用!!!  删表跑路
    delete from t_student ; 
    # delete insert update 语句都会走事务处理,也就是我们需要显示的commit和rollback;
    

    truncate删除:

    # truncate 直接清空表结构中的所有的数据,效率高,但是不能回滚。
    TRUNCATE TABLE t_user_1 # where 1 = 1;
    

    4.DQL

      数据查询语言(Data Query Language, DQL)是SQL语言中,负责进行数据查询而不会对数据本身进行修改的语句,这是最基本的SQL语句。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有FROM,WHERE,GROUP BY,HAVING和ORDER BY。这些DQL保留字常与其他类型的SQL语句一起使用。

    4.1 单表查询

    查询语句的语法规则

    SELECT <字段列表>
    FROM <表名>
    [WHERE <查询条件>]
    [ORDER BY <排序字段>]
    [GROUP BY <分组字段>]
    # select NOW() 
    

    为查询准备的表结构

    CREATE TABLE t_student (
    id int(3) primary key auto_increment ,
    stuname varchar(30) not null ,
    age int(3) ,
    sex varchar(3) ,
    birthday date ,
    address varchar(50),
    class_id int(3)
    );
    
    CREATE TABLE t_class(
    class_id varchar(30) PRIMARY KEY ,
    class_name varchar(30) UNIQUE ,
    class_desc varchar(50)
    );
    

    单表查询不带条件的查询

    # 1.查询出所有的学生信息  所有的学生的所有字段的信息
    select * from t_student ;
    
    # 2.查询出所有的学生的姓名和性别
    select stuname,sex from t_student;
    
    # 3.对查询的表和列设置对应的别名
    select stuname as '姓名' ,sex as "性别" from t_student;
     # 别名简写可以省略 as  和 单引号
     select stuname 名称 ,sex 性别 from t_student;
    
    # 表也可以取别名
    select t_student.stuname ,t_student.sex from t_student;
    select t1.stuname,t1.sex from t_student as t1;
    select t1.stuname,t1.sex from t_student  t1;
    
    
    # 自己增加查询的字段
    select stuname,sex,18 常量 from t_student;
    
    # 4.查询出所有的学生信息,并且显示的形式是【张三】18【岁】
    select stuname,age,concat('【',stuname,'】',age,'【岁】') from t_student;
    

    单表查询带条件的

    # 5.查询出学生表中张三的所有的信息
    select * from t_student where stuname = '张三';
    
    # 6.查询出学生表中年龄在18到22之间的学生的所有信息
    select * from t_student where age >=18 and age <= 22;
    select * from t_student where age BETWEEN 18 and 22 ;
    
    # 7.查询出学生表中编号为1和3的学生信息
    
    select * 
    from t_student
    where id = 1 or id = 3;
    
    select * from t_student where id in (1,3)
    
    # 8.查询出学生表中地址信息为空的学生信息
    # 不行 # 
    # select * from t_student where address = '';
    # select * from t_student where address = null;
    select * from t_student where address is null;
    # 不为空的情况
    select * from t_student where address is not null;
    
    # 9.查询出所有姓张的学生的所有信息 -- 模糊查询 like
    select * from t_student where stuname like '张%' ;
    # 如果不加% 其实和=差不多
    select * from t_student where stuname like '张三';
    
    select * from t_student where stuname like '%三%';
    
    
    # 10.查询出学生表中年龄大于20的男同学的所有信息
    select * from t_student where age > 20 and sex = '男'
    
    # 11 查询出学生表中年龄大于20或者住址在长沙的同学的所有信息
    select * from t_student where age  > 20 or address like '%长沙%'
    
    # 12 查询出所有的学生信息,根据id降序  desc 降序 asc 升序【默认就是升序,也就是 asc可以省略】
    select * 
    from t_student 
    order by id desc;
    
    select * 
    from t_student 
    order by id asc;
    
    select * 
    from t_student 
    order by id ;
    
    # 排序我们可以根据多个字段来排列,前面的字段优先排序
    # 先根据age降序排列,如果age有相同的信息,那么再根据id升序排序
    select * from t_student order by age desc ,id asc; 
    
    select * from t_student order by age desc ,id desc; 
    

    4.2 聚合函数

    聚合函数一般用于统计

    # 聚合函数  -- 一般用于统计
    # 1.统计学员的总数  count 统计某列中非空的数据的条数
    select count(*) from t_student ;
    select count(id) from t_student ;
    select count(address) from t_student;
    select count(birthday) from t_student;
    ## 在实际开发中我们使用 count(1) 来统计,效率会更高
    select 1,id from t_student ;
    select count(1) from t_student ;
    
    # 2.统计班级中学生最大的年龄
    select max(age) from t_student ;
    
    # 3.统计班级中学习最小的年龄
    select min(age) from t_student ;
    
    # 4.统计班级中的学员的平均年龄
    select avg(age) from t_student ;
    
    # 5.统计班级中学员的年龄总和
    select sum(age) from t_student ;
    

    4.3 分组查询

    语法规则

    SELECT <字段列表>
    FROM <表名>
    [WHERE <查询条件>]
    [ORDER BY <排序字段>]
    [GROUP BY <分组字段>]
    [HAVING <分组后的查询条件>]
    

    分组查询通常用于统计,一般和聚合函数配合使用

    :分组查询有一个原则,就是 select 后面的所有列中没有使用聚合函数的列,必须出现在group by后面

    4.4 常用函数

    4.4.1 数字函数

    函数说明
    ABS(x)返回x的绝对值
    AVG(expression)返回一个表达式的平均值,expression 是一个字段
    CEIL(x)/CEILING(x)返回大于或等于 x 的最小整数
    FLOOR(x)返回小于或等于 x 的最大整数
    EXP(x)返回 e 的 x 次方
    GREATEST(expr1, expr2, expr3, …)返回列表中的最大值
    LEAST(expr1, expr2, expr3, …)返回列表中的最小值
    LN返回数字的自然对数
    LOG(x)返回自然对数(以 e 为底的对数)
    MAX(expression)返回字段 expression 中的最大值
    MIN(expression)返回字段 expression 中的最大值
    POW(x,y)/POWER(x,y)返回 x 的 y 次方
    RAND()返回 0 到 1 的随机数
    ROUND(x)返回离 x 最近的整数
    SIGN(x)返回 x 的符号,x 是负数、0、正数分别返回 -1、0 和 1
    SQRT(x)返回x的平方根
    SUM(expression)返回指定字段的总和
    TRUNCATE(x,y)返回数值 x 保留到小数点后 y 位的值(与 ROUND 最大的区别是不会进行四舍五入)

    案例

    # 数字函数
    # abs函数  取绝对值
    select abs(-100) ;
    
    # avg() 取平均值
    select avg(age) from t_student;
    
    # CEIL(x)/CEILING(x)
    select ceil(2.5) ;
    select ceil(avg(age) ) from t_student;
    select ceiling(3) ;
    select ceil(3) ;
    
    # floor
    select floor(2.5) ;
    
    # exp e的3次方
    select exp(3) ;
    
    # GREATEST(expr1, expr2, expr3, …) 返回列表中的最大值
    select GREATEST(1,4,5,3,9,2) ;
    
    # LEAST(value1,value2,...) 返回列表中的最小值
    select LEAST(1,4,5,3,9,2) ;
    
    # LN 自然对数
    select ln(2) ;
    
    # LOG(x) 
    select log(20) ;
    
    
    # POW(x,y) 返回x的y次方
    select POW(2,3) ;
    
    # RAND() 返回0~1的随机值
    select RAND() ;
    
    # ROUND(x) 返回离x最近的整数
    select round(5.12) ;
    
    # SIGN(x) 判断x的符号 大于0 等于0 小于0  1 0 -1
    select sign(99),sign(0),sign(-199);
    
    # SQRT(x) x的平方根
    select SQRT(9);
    
    # TRUNCATE(x,y)
    select TRUNCATE(3.15926,3),TRUNCATE(3.15926,2) ;
    

    4.4.2 字符串函数

    函数说明
    ASCII(s)返回字符串 s 的第一个字符的 ASCII 码
    LENGTH/CHAR_LENGTH(s)/CHARACTER_LENGTH(s)返回字符串 s 的字符数
    CONCAT(s1,s2…sn)字符串 s1,s2 等多个字符串合并为一个字符串
    FIND_IN_SET(s1,s2)返回在字符串s2中与s1匹配的字符串的位置
    FORMAT(x,n)函数可以将数字 x 进行格式化 “#,###.##”, 将 x 保留到小数点后 n 位,最后一位四舍五入
    INSERT(s1,x,len,s2)字符串 s2 替换 s1 的 x 位置开始长度为 len 的字符串
    LOCATE(s1,s)从字符串 s 中获取 s1 的开始位置
    LCASE(s)/LOWER(s)将字符串 s 的所有字母变成小写字母
    UCASE(s)/UPPER(s)将字符串 s 的所有字母变成大写字母
    TRIM(s)去掉字符串 s 开始和结尾处的空格
    LTRIM(s)去掉字符串 s 开始处的空格
    RTRIM(s)去掉字符串 s 结尾处的空格
    SUBSTR(s, start, length)从字符串 s 的 start 位置截取长度为 length 的子字符串
    SUBSTR/SUBSTRING(s, start, length)从字符串 s 的 start 位置截取长度为 length 的子字符串
    POSITION(s1 IN s)从字符串 s 中获取 s1 的开始位置
    REPEAT(s,n)将字符串 s 重复 n 次
    REVERSE(s)将字符串s的顺序反过来
    STRCMP(s1,s2)比较字符串 s1 和 s2,如果 s1 与 s2 相等返回 0 ,如果 s1>s2 返回 1,如果 s1<s2 返回 -1
    # 字符串函数
    # ASCII  查看第一个字符的ASCII值
    select ascii('ABC'),ascii('BC');
    
    # length 返回字符串的长度 字符个数
    select length('abcd1234'),CHAR_LENGTH('abcd1234');
    
    # CONCAT(s1,s2…sn) 字符串拼接
    select id,stuname ,age,concat('【',id,'】',stuname)  from t_student
    
    # FIND_IN_SET(s1,s2) 返回在字符串s2中与s1匹配的字符串的位置
    select FIND_IN_SET("c","a,b,c,d,e,f,g");
    select FIND_IN_SET('c','a,b,c,d,e,f,g');
    
    # FORMAT(x,n) 函数可以将数字 x 进行格式化 “#,###.##”, 将 x 保留到小数点后 n 位,最后一位四舍五入
    select FORMAT(19999999999.5678,2);
    
    # INSERT(s1,x,len,s2) 字符串 s2 替换 s1 的 x 位置开始长度为 len 的字符串
    select INSERT("www.baidu.com",5,5,"sinax") ;
    
    
    # LOCATE(s1,s) 从字符串 s 中获取 s1 的开始位置
    select LOCATE("a","bcdaefg");
    
    # LCASE(s)/LOWER(s) 转换为小写
    # UCASE(s)/UPPER(s) 转换为大写
    select lcase('ABCedfgDDDddd'),LOWER('ABCedfgDDDddd'),UCASE('ABCedfgDDDddd'),UPPER('ABCedfgDDDddd') ;
    
    # TRIM(s)  去掉字符串 s 开始和结尾处的空格
    # LTRIM(s) 去掉字符串 s 开始空格
    # RTRIM(s)  去掉字符串 s 结尾处的空格
    select TRIM(' abc def '),LTRIM(' abc def '),RTRIM(' abc def ');
    
    
    # SUBSTR(s, start, length)  SUBSTRING 从字符串 s 的 start 位置截取长度为 length 的子字符串
    select substr("abcdefg1234566",4,5) ;
    
    # POSITION(s1 IN s) 从字符串 s 中获取 s1 的开始位置
    select POSITION("123" in "abcdefg1235")
    
    # REPEAT(s,n) 将字符串 s 重复 n 次
    select REPEAT("hello-",5);
    
    # REVERSE(s) 将字符串s的顺序反过来
    select REVERSE("abcdefg") ;
    
    # STRCMP(s1,s2) 比较字符串 s1 和 s2,如果 s1 与 s2 相等返回 0 ,如果 s1>s2 返回 1,如果 s1<s2 返回 -1
    
    select STRCMP("abc","abc") ,STRCMP("a1","a2"),STRCMP("a2","a1") ;
    

    4.4.3 日期函数

    函数说明
    CURDATE()/CURRENT_DATE()返回当前日期
    CURRENT_TIME()/CURTIME()返回当前时间
    CURRENT_TIMESTAMP()返回当前日期和时间
    ADDDATE(d,n)计算起始日期 d 加上 n 天的日期
    ADDTIME(t,n)时间 t 加上 n 秒的时间
    DATE()从日期或日期时间表达式中提取日期值
    DAY(d)返回日期值 d 的日期部分
    DATEDIFF(d1,d2)计算日期 d1->d2 之间相隔的天数
    DATE_FORMAT(f)按表达式 f的要求显示日期 d
    DAYNAME(d)返回日期 d 是星期几,如 Monday,Tuesday
    DAYOFMONTH(d)计算日期 d 是本月的第几天
    DAYOFWEEK(d)日期 d 今天是星期几,1 星期日,2 星期一,以此类推
    EXTRACT(type FROM d)从日期 d 中获取指定的值,type 指定返回的值
    type可取值为:
    MICROSECOND
    SECOND
    MINUTE
    HOUR
    DAY
    WEEK
    MONTH
    QUARTER
    YEAR
    SECOND_MICROSECOND
    MINUTE_MICROSECOND
    MINUTE_SECOND
    HOUR_MICROSECOND
    HOUR_SECOND
    HOUR_MINUTE
    DAY_MICROSECOND
    DAY_SECOND
    DAY_MINUTE
    DAY_HOUR
    YEAR_MONTH
    DAYOFWEEK(d)日期 d 今天是星期几,1 星期日,2 星期一,以此类推
    UNIX_TIMESTAMP()得到时间戳
    FROM_UNIXTIME()时间戳转日期
    # 日期时间函数
    select now();
    # CURDATE()/CURRENT_DATE() 返回当前日期
    select CURDATE(),CURRENT_DATE() ;
    
    # CURRENT_TIME()/CURTIME() 返回当前时间
    select CURTIME() , CURRENT_TIME() ;
    
    # now() CURRENT_TIMESTAMP() 返回当前日期和时间
    select now(),CURRENT_TIMESTAMP() ;
    
    # ADDDATE(d,n) 计算起始日期 d 加上 n 天的日期
    select ADDDATE("2022-01-26",6) ,ADDDATE(now(),10) ;
    
    # ADDTIME(t,n) 时间 t 加上 n 秒的时间
    select ADDTIME('2022-01-02 11:11:11',59),ADDTIME(now(),60*60)
    
    # DATE() 从日期或日期时间表达式中提取日期值
    select date('2022-01-02 11:11:11') ,date(now());
    
    # DAY(d) 返回日期值 d 的日期部分
    select day('2022-01-02 11:11:11'),day(now()) ;
    
    
    # DATEDIFF(d1,d2) 计算日期 d1->d2 之间相隔的天数
    select DATEDIFF("2021-12-23","2022-01-01") ,DATEDIFF("2022-01-01","2021-12-23");
    
    # DATE_FORMAT(f) 按表达式 f的要求显示日期 d
    select DATE_FORMAT(now(),"%Y-%m-%d %r")  ,DATE_FORMAT(now(),"%Y-%m-%d %H:%I:%S");
    
    # DAYNAME(d) 返回日期 d 是星期几,如 Monday,Tuesday
    select DAYNAME(now()),DAYNAME("2022-02-14")
    
    # DAYOFMONTH(d) 计算日期 d 是本月的第几天
    select DAYOFMONTH(now()),DAYOFMONTH("2022-02-14");
    
    # DAYOFWEEK(d) 日期 d 今天是星期几,1 星期日,2 星期一,以此类推
    select DAYOFWEEK(now()) ,DAYOFWEEK("2022-02-14");
    
    # EXTRACT(type FROM d) 从日期 d 中获取指定的值,type 指定返回的值
    select EXTRACT(DAY from now())
    			,EXTRACT(WEEK from now())
    			,EXTRACT(HOUR from now())
    			,EXTRACT(SECOND from now())
    			,EXTRACT(MINUTE from now())
    			
    	# UNIX_TIMESTAMP() 获取时间戳
    	select UNIX_TIMESTAMP('2022-01-01')
    	
    	# FROM_UNIXTIME() 根据时间戳转换为日志
    	select FROM_UNIXTIME(1640966400) ;
    	
    
    

    4.4.4 高级函数

    CASE函数,类似于Java中Switch语句

    语法:

    CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    WHEN conditionN THEN resultN
    ELSE result
    END;

    # 高级函数
    # case函数
    
    select * from t_student ;
    select 
       id,stuname,age
    	 ,case
    	    when age < 18 then '[0-18]'
    			when  age BETWEEN 18 and 20 then '[18-20]'
    			when  age BETWEEN 20 and 30 then '[20-30]'
    			else '[30以上]'
    	 end
    from t_student 
    

    在这里插入图片描述

    IF函数

    IF()函数在条件为TRUE时返回一个值,如果条件为FALSE则返回另一个值。

    语法:IF(condition, value_if_true, value_if_false)

    # IF语句 
    select 
       t.* ,if(age >=18,'成年人','青少年'),if(sex='男',1,0)
    from t_student t
    

    在这里插入图片描述

    IFNULL函数

    如果表达式为NULL,则IFNULL()函数返回指定的值。如果表达式为NOT NULL,则此函数返回表达式。

    语法:IFNULL(expression, alt_value)

    # IFNULL 函数
    select t.* ,ifnull(address,"中国") from t_student t
    

    在这里插入图片描述

    ISNULL函数

    ISNULL()函数返回1或0,具体取决于表达式是否为NULL。如果expression为NULL,则此函数返回1.否则,返回0。

    语法:ISNULL(expression)

    # ISNULL() 函数
    select t.* ,ISNULL(address) from t_student t;
    

    在这里插入图片描述

    NULLIF函数

    NULLIF()函数比较两个表达式,如果它们相等则返回NULL。 否则,返回第一个表达式。

    语法:NULLIF(expr1, expr2)

    # NULLIF函数 如果两个表达式相同就返回null,否则返回第一个表达式
    select NULLIF('a','b'),NULLIF('a1','a1') ;
    

    在这里插入图片描述

    CAST函数

    CAST()函数将(任何类型的)值转换为指定的数据类型。

    语法:CAST(value AS datatype)

    # CAST函数
    select CAST('2022-02-13' as DATE) ;
    select CAST('2022-02-13 12:12:24' as TIME) ;
    select CAST(97 as CHAR) ;
    select CAST(5-20 as SIGNED) ;
    select CAST(12.666 as DECIMAL);
    select CAST('66' as BINARY);
    

    4.5 多表查询

    4.5.1 交叉连接

    交叉连接是不带WHERE 子句的多表查询,它返回被连接的两个表所有数据行的笛卡尔积

    SELECT *
    FROM T_A , T_B
    

    案例

    # 交叉连接
    select t1.* ,t2.*
    from t_student t1,t_class t2;
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HOXXadOP-1644764461096)(img\image-20220213150351624.png)]

    4.5.2 内连接

    在交叉连接的基础上增加连接的条件,不需要连接无效的记录

    SELECT * 
    FROM T_A INNER JOIN T_B ON T_A.SID = T_B.SID
    # 等价于
    SELECT * 
    FROM T_A,T_B
    WHERE T_A.SID = T_B.SID
    

    案例

    # 内连接 : 在交叉连接的基础上增加连接的条件,不需要连接无效的记录
    select t1.*,t2.*
    from t_student t1 INNER JOIN t_class t2 
    	on t1.class_id = t2.class_id # on 关键字后面的是连接的条件
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gkVMeXwE-1644764461096)(img\image-20220213150913627.png)]

    4.5.3 外连接

    左连接

    select t1.*, t2.*  from t_student t1  left  outer   join t_class t2 on t1.classid=t2.id
    

    右连接

    select t1.*, t2.*  from t_student t1  right   join  t_class t2 on t1.classid=t2.id
    

    全连接

    select t1.*, t2.*  from t_student t1  full   join t_class t2 on t1.classid=t2.id
    

    案例

    # 外连接: 找到学生表中的所有的学生信息及对应的班级信息
    # 内连接只会保留满足连接条件的记录
    # 左外连接: 在内连接的基础上保留了左侧表结构中不满足连接条件的记录
    select  t1.*,t2.*
    from t_student t1 LEFT JOIN t_class t2
    	on t1.class_id = t2.class_id
    # 右外连接:在内连接的基础上保留了右侧表结构中不满足连接条件的记录
    select t1.*,t2.*
    from  t_Class t1 RIGHT JOIN t_student t2
    on t1.class_id = t2.class_id
    
    select t1.*,t2.*
    from t_class t1 LEFT JOIN t_student t2
    on t1.class_id = t2.class_id
    
    # 全连接
    # 全连接的作用是 在内连接的基础上保留的左右两边不满足条件的记录,但是在MySQL中已经移除了全连接,但是在Oracle或者其他的数据库中是存在的。
    select  t1.*,t2.*
    from t_student t1 LEFT JOIN t_class t2
    	on t1.class_id = t2.class_id;
    	
    # 对应的全连接操作
    
    select  t1.*,t2.*
    from t_student t1 FULL JOIN t_class t2
    	on t1.class_id = t2.class_id;
    
    select t1.*,t2.*
    from t_class t1 LEFT JOIN t_student t2
    on t1.class_id = t2.class_id;
    
    select t1.*,t2.*
    from t_class t1 FULL JOIN t_student t2
    on t1.class_id = t2.class_id;
    

    等价于 : union 与union all区别

    select t1.*, t2.*  from t_student t1  left  outer   join t_class t2 on t1.classid=t2.id
               union 
                select t1.*, t2.*  from t_student t1  right   join  t_class t2 on t1.classid=t2.id
    
    select t1.*, t2.*  from t_student t1  left  outer   join t_class t2 on t1.classid=t2.id
               union all  
                select t1.*, t2.*  from t_student t1  right   join  t_class t2 on t1.classid=t2.id
    

    union和union all都能实现结果集的合并

    union合并结果集后会取出重复的记录

    在这里插入图片描述

    union all 合并结果集后不会移除重复的记录

    在这里插入图片描述

    4.5.4 子查询

    	# 子查询 嵌套查询
    	# 查询出班级为 java1班 的所有的学员信息
    	select  t1.*
    	from t_student t1
    	where class_id in (
            select t_class.class_id from t_class where t_class.class_name = 'java1班'  or t_class.class_name = 'java2班'
        ) 
    	# 如果在子查询中只有一条记录那么我们可以用=来替代in
    		select  t1.*
    	from t_student t1
    	where class_id  = (
            select t_class.class_id from t_class where t_class.class_name = 'java1班' or t_class.class_name = 'java2班'
        )
    
    
    	select  t1.*
    	from t_student t1
    	where EXISTS  # exists 存在于的含义  外表中的记录存在于子表中 就满足条件 否则就过滤掉
    	(
            select t_class.class_id from t_class where t_class.class_name = 'java1班'  and t1.class_id = t_class.class_id
        )
    

    4.6 综合案例

    drop table student;
    create table student (
    id int(3) PRIMARY KEY ,
    name varchar(20) not null,
    sex varchar(4),
    birth int(4),
    department varchar(20),
    address varchar(50));
    
    
    # 创建score表。SQL代码如下:
    drop table score;
    create table score(
       id int(3)   PRIMARY KEY ,
       stu_id int(3)  not null,
       c_name varchar(20) ,
       grade int(3)
    )
    
    -- 向student表插入记录的INSERT语句如下:
    insert into student values(901,'张老大','男',1985,'计算机系','北京市海淀区');
    insert into student values(902,'张老二','男',1986,'中文系','北京市昌平区');
    insert into student values(903,'张三','女',1990,'中文系','湖南省永州市');
    insert into student values(904,'李四','男',1990,'英语系','辽宁省阜新市');
    insert into student values(905,'王五','女',1991,'英语系','福建省厦门市');
    insert into student values(906,'王六','男',1988,'计算机系','湖南省衡阳市');
    -- 向score表插入记录的INSERT语句如下:
    insert into score values(1,901,'计算机',98);
    insert into score values(2,901,'英语',80);
    insert into score values(3,902,'计算机',65);
    insert into score values(4,902,'中文',88);
    insert into score values(5,903,'中文',95);
    insert into score values(6,904,'计算机',70);
    insert into score values(7,904,'英语',92);
    insert into score values(8,905,'英语',94);
    insert into score values(9,906,'计算机',90);
    insert into score values(10,906,'英语',85);
    
    SELECT * from student;
    select * from score;
    
    1、查询student表的第2条到4条记录 
           
    	 select * from student LIMIT 1,3;
    	 
    2、从student表查询所有学生的学号(id)、
               姓名(name)和院系(department)的信息
        
    		select id '学号' ,name as '姓名' ,department 院系
    		from student t
           
    3、从student表中查询计算机系和英语系的学生的信息
       
    	 select  *
    	 from student t
    	 where t.department = '计算机系' or t.department='英语系'
    	 
    	 select  *
    	 from student t
    	 where t.department in ('计算机系','英语系')
            
    4、从student表中查询年龄25~30岁的学生信息
       select *,EXTRACT(year from now()) ,EXTRACT(year from now())-birth age 
    	 from student where (EXTRACT(year from now()) - birth) BETWEEN 30 and 40;	 
             
    5、从student表中查询每个院系有多少人 
    select t.department,count(1)
    from student t
    group by t.department
         
    6、从score表中查询每个科目的最高分
    select s.c_name,max(grade)
    from score s 
    group by  s.c_name
         
     
    7、查询李四的考试科目(c_name)和考试成绩(grade)
         注意: '=' 只有在确定结果是一个的情况下使用,不确定的使用用 'in'
    	 
    	 select c_name,grade
    	 from score
    	 where stu_id in (
    		select id from student where name = '李四'
    	 )
    	 
    	 # 通过exists
    	 select c_name ,grade
    	 from score s
    	 where EXISTS (
    		select id from student where name = '李四' and student.id = s.stu_id
    	 )
    	 
    	 # 通过左连接来实现
    	 select  t1.*
    	 from score t1 RIGHT join ( select * from student where name = '李四') t2
    	 on t1.stu_id = t2.id ;
    	 
    	 select  t1.*,t2.*
    	 from score t1 RIGHT join student t2
    	 on t1.stu_id = t2.id 
    	 where t2.name = '李四'
          
    8、用内连接的方式查询所有学生的信息和考试信息
    
        select  t1.*,t2.*
    		from student t1 INNER JOIN score t2
    		on t1.id = t2.stu_id
          
    9、计算每个学生的总成绩
    	select stu_id,sum(grade)
    	from score 
    	group by stu_id 
    	
    	
    	select stu_id,(select name from student where id = stu_id) 姓名,sum(grade)
    	from score 
    	group by stu_id 
    	
    	select t1.name,sum(t2.grade)
    	from student t1 INNER JOIN score t2
    	on t1.id = t2.stu_id
    	group by t1.name
           
             
    10、计算每个考试科目的平均成绩
    
    select c_name,TRUNCATE(avg(grade),2) 平均分
    from score 
    group by c_name
           
    
    11、查询计算机成绩低于95的学生信息
    
     select *
    from student
    where id in (
    	select stu_id from score where c_name = '计算机' and grade < 95
    ) 
    
     select *
    from student
    where EXISTS (
    	select stu_id from score where c_name = '计算机' and grade < 95 and student.id = stu_id
    ) 	
    
           
    12、查询同时参加计算机和英语考试的学生的信息
         select * from score; 
    		 
    		# 首先查询出 参加计算机的学员
    		select * from score where c_name = '计算机'
    		
    		select * from score where c_name = '英语'
    		
    		select * from student where id in (
    		select stu_id from score where  stu_id in (
    			select stu_id from score where c_name = '计算机' )
    			and c_name = '英语' )
    
    13、将计算机考试成绩按从高到低进行排序
    select *
    from score 
    where c_name = '计算机'
    order by grade desc
        
            
    14、从student表和score表中查询出学生的学号,
         然后合并查询结果 UNIONunion all
    		 
    		 select id 
    		 from student 
    		 union
    		 select stu_id
    		 from score
    		 
    		 select id 
    		 from student 
    		 union all
    		 select stu_id
    		 from score
       
                
    15、查询姓张或者姓王的同学的姓名、院系和考试科目及成绩
       select name 姓名, department 院系, c_name 考试科目 ,grade 成绩
    	 from student t1 left join score t2 on t1.id = t2.stu_id
    	 where t1.name like '张%' or t1.name like '王%'
    	 
    	 
    	 select name 姓名, department 院系, c_name 考试科目 ,grade 成绩
    	 from (select * from student where  name like '张%' or name like '王%') t1 left join score t2 on t1.id = t2.stu_id
    
    16、查询都是湖南的学生的姓名、年龄、院系和考试科目及成绩
        select name 姓名, (EXTRACT(year from now()) - birth) 年龄, department 院系, c_name 考试科目 ,grade 成绩
    		from student t1 left join score t2
    		on t1.id = t2.stu_id
    		where address like '湖南%'
    
    
    

    5.DCL

      数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括grant、revoke 等。

      DCL 语句主要是DBA 用来管理系统中的对象权限时所使用,一般的开发人员很少使用。下面
    通过一个例子来简单说明一下.

    mysql> grant select,insert on plf.* to 'plf'@'%' identified by '123456';
    Query OK, 0 rows affected (0.00 sec)
    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    
    
    mysql> revoke insert on plf.* from 'plf'@'%';
    Query OK, 0 rows affected (0.00 sec)
    
    展开全文
  • MySQL基础(DML,DQL,增删改查)

    千次阅读 多人点赞 2022-03-15 17:59:05
    包含Mysql下载安装启动, 图形化界面工具下载即使用 SQL :DDL DML DQL 添加数据 修改数据 删除数据 基本语法 基础查询 条件查询 聚合函数 分组查询 排序查询 分页查询 案例 执行顺序

    目录

    1.Mysql下载安装启动

    2.图形化界面工具

    3.SQL

    1.DDL

    2.DML

    1.添加数据

    2.修改数据

    3.删除数据

    3.DQL

    1.基本语法

    2.基础查询

    3.条件查询

    4.聚合函数

    5.分组查询

    6.排序查询

    7.分页查询

    8.案例

    9.执行顺序


    6bdc4891a9924b9eaabaf6b73fabdfee.png

    1.Mysql下载安装启动

    Mysql下载安装启动

    2.图形化界面工具

    图形化界面工具

    3.SQL

    1.DDL

    1.DDL 

    2.DML
     

    DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进
    行增、删、改操作。
    添加数据(INSERT)
    修改数据(UPDATE)
    删除数据(DELETE)


    1.添加数据


    1). 给指定字段添加数据

    INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);


    案例 : 给 employee 表所有的字段添加数据 ;

    insert into employee(id,workno,name,gender,age,idcard,entrydate) 
    values(1,'1','Itcast','男',10,'123456789012345678','2000-01-01');


     


    插入数据完成之后,我们有两种方式,查询数据库的数据:
    A. 方式一
    在左侧的表名上双击,就可以查看这张表的数据。

    watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiA5Liq54Ot54ix57yW56iL55qE5bCP55m955m9,size_14,color_FFFFFF,t_70,g_se,x_16

     B. 方式二 

    可以直接一条查询数据的 SQL 语句 , 语句如下 :

    select * from employee;

    案例 : 给 employee 表所有的字段添加数据
    执行如下 SQL ,添加的年龄字段值为 -1 。
     

    insert into employee(id,workno,name,gender,age,idcard,entrydate) 
    values(1,'1','Itcast','男',-1,'123456789012345678','2000-01-01');

    watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiA5Liq54Ot54ix57yW56iL55qE5bCP55m955m9,size_14,color_FFFFFF,t_70,g_se,x_16

     执行上述的 SQL 语句时,报错了,具体的错误信息如下:
    因为 employee 表的 age 字段类型为 tinyint ,而且还是无符号的 unsigned ,所以取值只能在
    0-255 之间。

    watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiA5Liq54Ot54ix57yW56iL55qE5bCP55m955m9,size_6,color_FFFFFF,t_70,g_se,x_16


    2). 给全部字段添加数据
     

    INSERT INTO 表名 VALUES (值1, 值2, ...);


    案例:插入数据到 employee 表,具体的 SQL 如下:

    insert into employee values(2,'2','张无忌','男',18,'123456789012345670','2005-01- 01');


    3). 批量添加数据
     

    INSERT INTO 表名 (字段名1, 字段名2, ...)
    VALUES (值1, 值2, ...), (值1, 值2, ...), (值 1, 值2, ...) ;


     

    INSERT INTO 表名 VALUES (值1, 值2, ...), 
    (值1, 值2, ...), (值1, 值2, ...) ;


    案例:批量插入数据到 employee 表,具体的 SQL 如下:

    insert into employee values(3,'3','韦一笑','男',38,'123456789012345670','2005-01- 01'),
    (4,'4','赵敏','女',18,'123456789012345670','2005-01-01');


    注意事项:
    • 插入数据时,指定的字段顺序需要与值的顺序是一一对应的。
    • 字符串和日期型数据应该包含在引号中。
    • 插入的数据大小,应该在字段的规定范围内。

    2.修改数据


    修改数据的具体语法为 :


     

    UPDATE 表名 SET 字段名1 = 值1 , 字段名2 = 值2 , .... [ WHERE 条件 ] ;


    案例 :


    A. 修改 id 为 1 的数据,将 name 修改为 itheima

    update employee set name = 'itheima' where id = 1;


    B. 修改 id 为 1 的数据 , 将 name 修改为小昭 , gender 修改为 女

    update employee set name = '小昭' , gender = '女' where id = 1;


    C. 将所有的员工入职日期修改为 2008-01-01

    
    update employee set entrydate = '2008-01-01';


    注意事项:
    修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据。


    3.删除数据


    删除数据的具体语法为:

    DELETE FROM 表名 [ WHERE 条件 ] ;


    案例 :


    A. 删除 gender 为女的员工

    delete from employee where gender = '女';



    B. 删除所有员工

    delete from employee;



    注意事项:
    • DELETE 语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数
    据。
    • DELETE 语句不能删除某一个字段的值(可以使用UPDATE,将该字段值置为NULL即
    可)。
    • 当进行删除全部数据操作时,datagrip会提示我们,询问是否确认删除,我们直接点击
    Execute即可。

    watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiA5Liq54Ot54ix57yW56iL55qE5bCP55m955m9,size_13,color_FFFFFF,t_70,g_se,x_16

    3.DQL

    DQL英文全称是Data Query Language(数据查询语言),数据查询语言,用来查询数据库中表的记

    录。

    查询关键字: SELECT

    在一个正常的业务系统中,查询操作的频次是要远高于增删改的,当我们去访问企业官网、电商网站,

    在这些网站中我们所看到的数据,实际都是需要从数据库中查询并展示的。而且在查询的过程中,可能

    还会涉及到条件、排序、分页等操作。

    那么,本小节我们主要学习的就是如何进行数据的查询操作。 我们先来完成如下数据准备工作:

    drop table if exists employee;
    create table emp(
    id int comment '编号',
    workno varchar(10) comment '工号',
    name varchar(10) comment '姓名',
    gender char(1) comment '性别',
    age tinyint unsigned comment '年龄',
    idcard char(18) comment '身份证号',
    workaddress varchar(50) comment '工作地址',
    entrydate date comment '入职时间' )
    comment '员工表';
    INSERT INTO emp(id, workno, name, gender, age, idcard, workaddress, entrydate)
    VALUES (1, '00001', '柳岩666', '女', 20, '123456789012345678', '北京', '2000-01-01');
    INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
     VALUES (2, '00002', '张无忌', '男', 18, '123456789012345670', '北京', '2005-09-01');
    INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
    VALUES (3, '00003', '韦一笑', '男', 38, '123456789712345670', '上海', '2005-08-01');
    INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
    VALUES (4, '00004', '赵敏', '女', 18, '123456757123845670', '北京', '2009-12-01');
    INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
     VALUES (5, '00005', '小昭', '女', 16, '123456769012345678', '上海', '2007-07-01');
    INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
    VALUES (6, '00006', '杨逍', '男', 28, '12345678931234567X', '北京', '2006-01-01');
    INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
    VALUES (7, '00007', '范瑶', '男', 40, '123456789212345670', '北京', '2005-05-01');
    INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
    VALUES (8, '00008', '黛绮丝', '女', 38, '123456157123645670', '天津', '2015-05-01');
    INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
    VALUES (9, '00009', '范凉凉', '女', 45, '123156789012345678', '北京', '2010-04-01');
    INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
    VALUES (10, '00010', '陈友谅', '男', 53, '123456789012345670', '上海', '2011-01-01');
    INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
    VALUES (11, '00011', '张士诚', '男', 55, '123567897123465670', '江苏', '2015-05-01');
    INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
    VALUES (12, '00012', '常遇春', '男', 32, '123446757152345670', '北京', '2004-02-01');
    INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
    VALUES (13, '00013', '张三丰','男', 88, '123656789012345678', '江苏', '2020-11-01');
    INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
    VALUES (14, '00014', '灭绝', '女', 65, '123456719012345670', '西安', '2019-05-01');
    INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
    VALUES (15, '00015', '胡青牛','男', 70, '12345674971234567X', '西安', '2018-04-01');
    INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
    VALUES (16, '00016', '周芷若', '女', 18, null, '北京', '2012-06-01');

    watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiA5Liq54Ot54ix57yW56iL55qE5bCP55m955m9,size_20,color_FFFFFF,t_70,g_se,x_16

    1.基本语法

    DQL 查询语句,语法结构如下:
    SELECT
    字段列表
    FROM
    表名列表
    WHERE
    条件列表
    GROUP BY
    分组字段列表
    HAVING
    分组后条件列表
    ORDER BY
    排序字段列表
    LIMIT
    分页参数
    我们在讲解这部分内容的时候,会将上面的完整语法进行拆分,分为以下几个部分:
    基本查询(不带任何条件)
    条件查询(WHERE)
    聚合函数(count、max、min、avg、sum)
    分组查询(group by)
    排序查询(order by)
    分页查询(limit)

     

    2.基础查询

    在基本查询的DQL语句中,不带任何的查询条件,查询的语法如下:

    1). 查询多个字段

    SELECT 字段1, 字段2, 字段3 ... FROM 表名 ;

     watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiA5Liq54Ot54ix57yW56iL55qE5bCP55m955m9,size_13,color_FFFFFF,t_70,g_se,x_16

    SELECT * FROM 表名 ;

    watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiA5Liq54Ot54ix57yW56iL55qE5bCP55m955m9,size_20,color_FFFFFF,t_70,g_se,x_16

     注意 : * 号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率)

    2). 字段设置别名
    SELECT 字段1 [ AS 别名1 ] , 字段2 [ AS 别名2 ] ... FROM 表名;

    AS可以省略不写 

    SELECT 字段1 [ 别名1 ] , 字段2 [ 别名2 ] ... FROM 表名;

    watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiA5Liq54Ot54ix57yW56iL55qE5bCP55m955m9,size_18,color_FFFFFF,t_70,g_se,x_16

    3). 去除重复记录
    SELECT DISTINCT 字段列表 FROM 表名;

    watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiA5Liq54Ot54ix57yW56iL55qE5bCP55m955m9,size_13,color_FFFFFF,t_70,g_se,x_16

    案例:
    A. 查询指定字段 name, workno, age并返回
    select name,workno,age from emp;
    B. 查询返回所有字段
    select id ,workno,name,gender,age,idcard,workaddress,entrydate from emp;
    select * from emp;
    C. 查询所有员工的工作地址,起别名
    select workaddress as '工作地址' from emp;

    -- as可以省略 
    select workaddress '工作地址' from emp;

    D. 查询公司员工的上班地址有哪些(不要重复)
    select distinct workaddress '工作地址' from emp;

    3.条件查询

    1). 语法

    SELECT 字段列表 FROM 表名 WHERE 条件列表 ;

    2). 条件

    常用的比较运算符如下:
    watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiA5Liq54Ot54ix57yW56iL55qE5bCP55m955m9,size_14,color_FFFFFF,t_70,g_se,x_16

    常用的逻辑运算符如下:

    watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiA5Liq54Ot54ix57yW56iL55qE5bCP55m955m9,size_15,color_FFFFFF,t_70,g_se,x_16

    案例:
    A. 查询年龄等于 88 的员工
    select * from emp where age = 88;

    B. 查询年龄小于 20 的员工信息

    select * from emp where age < 20;

    C. 查询年龄小于等于 20 的员工信息

    select * from emp where age <= 20;

    D. 查询没有身份证号的员工信息

    select * from emp where idcard is null;

    E. 查询有身份证号的员工信息

    select * from emp where idcard is not null;

    F. 查询年龄不等于 88 的员工信息
    select * from emp where age != 88; 
    select * from emp where age <> 88;
    G. 查询年龄在15岁(包含) 到 20岁(包含)之间的员工信息
    select * from emp where age >= 15 && age <= 20;
    select * from emp where age >= 15 and age <= 20;
    select * from emp where age between 15 and 20;

    H. 查询性别为 女 且年龄小于 25岁的员工信息
    select * from emp where gender = '女' and age < 25;

    I. 查询年龄等于18 或 20 或 40 的员工信息
    select * from emp where age = 18 or age = 20 or age =40; 
    select * from emp where age in(18,20,40);

    J. 查询姓名为两个字的员工信息 :
    watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiA5Liq54Ot54ix57yW56iL55qE5bCP55m955m9,size_15,color_FFFFFF,t_70,g_se,x_16

    select * from emp where name like '__';

    K. 查询身份证号最后一位是X的员工信息
    因为身份证是18位,所以我们也可以 17个下划线 再加一个X
    select * from emp where idcard like '%X'; 
    select * from emp where idcard like '_________________X';

    4.聚合函数

    1). 介绍
    将一列数据作为一个整体,进行纵向计算 。
    2). 常见的聚合函数
    watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiA5Liq54Ot54ix57yW56iL55qE5bCP55m955m9,size_15,color_FFFFFF,t_70,g_se,x_16
    3). 语法

    SELECT 聚合函数(字段列表) FROM 表名 ;

    注意 : NULL值是不参与所有聚合函数运算的。

    案例:
    A. 统计该企业员工数量
    select count(*) from emp; 
    -- 统计的是总记录数 
    
    
    
    select count(idcard) from emp;
    -- 统计的是idcard字段不为null的记录数 12
    对于count聚合函数,统计符合条件的总记录数,还可以通过 count(数字/字符串)的形式进行统计
    查询,比如:
    对于count(*) 、count(字段)、 count(1) 的具体原理,我们在进阶篇中SQL优化部分会详
    细讲解,此处大家只需要知道如何使用即可。

    B. 统计该企业员工的平均年龄
    select avg(age) from emp;
    C. 统计该企业员工的最大年龄
    select max(age) from emp;
    D. 统计该企业员工的最小年龄
    select min(age) from emp;

    E. 统计西安地区员工的年龄之和
    select sum(age) from emp where workaddress = '西安';

    5.分组查询

    1). 语法
    SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组 后过滤条件 ];

    2). where与having区别
    执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组
    之后对结果进行过滤。
    判断条件不同:where不能对聚合函数进行判断,而having可以。
    注意事项:
    • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
    • 执行顺序: where > 聚合函数 > having 。
    • 支持多字段分组, 具体语法为 : group by columnA,columnB
    案例:
    A. 根据性别分组 , 统计男性员工 和 女性员工的数量
    select gender, count(*) from emp group by gender ;
    B. 根据性别分组 , 统计男性员工 和 女性员工的平均年龄
    select gender, avg(age) from emp group by gender ;
    C. 查询年龄小于45的员工 , 并根据工作地址分组 , 获取员工数量大于等于3的工作地址
    select workaddress, count(*) address_count 
    from emp where age < 45 group by workaddress having address_count >= 3;
    select workaddress 工作地址,count(*) 人数 from emp where age<45 group by workaddress having 人数>=3;
    D. 统计各个工作地址上班的男性及女性员工的数量
    select workaddress, gender, count(*) '数量' from emp group by gender , workaddress ;

    6.排序查询

    排序在日常开发中是非常常见的一个操作,有升序排序,也有降序排序

    watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiA5Liq54Ot54ix57yW56iL55qE5bCP55m955m9,size_14,color_FFFFFF,t_70,g_se,x_16
    注意事项:
    • 如果是升序, 可以不指定排序方式ASC ;
    • 如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序 ;
    1). 语法
    SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2 ;
    2). 排序方式
    ASC : 升序(默认值)
    DESC: 降序
    注意事项:
    • 如果是升序, 可以不指定排序方式ASC ;
    • 如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序 ;
    案例:
    A. 根据年龄对公司的员工进行升序排序
    select * from emp order by age asc; 
    select * from emp order by age;

    B. 根据入职时间, 对员工进行降序排序
    select * from emp order by entrydate desc;

    C. 根据年龄对公司的员工进行升序排序 , 年龄相同 , 再按照入职时间进行降序排序
    select * from emp order by age asc , entrydate desc;

    7.分页查询

    分页操作在业务系统开发时,也是非常常见的一个功能,我们在网站中看到的各种各样的分页条,后台
    都需要借助于数据库的分页操作。
    1). 语法
    SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;
    注意事项:
    • 起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数。
    • 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
    • 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。
    案例:
    A. 查询第1页员工数据, 每页展示10条记录
    select * from emp limit 0,10; 
    select * from emp limit 10;
    B. 查询第2页员工数据, 每页展示10条记录 --------> (页码-1)*页展示记录数
    select * from emp limit 10,10;

    8.案例

    1). 查询年龄为20,21,22,23岁的员工信息
    select * from emp where age in (20,21,22,23);

    2). 查询性别为 男 ,并且年龄在 20-40 岁(含)以内的姓名为三个字的员工。
    select * from emp where gender='男' and age>=20 and age<=40 and name like '___';
    select * from emp where gender = '男' and ( age between 20 and 40 ) and name like '___';

    3). 统计员工表中, 年龄小于60岁的 , 男性员工和女性员工的人数。
    select gender, count(*) from emp where age < 60 group by gender;

    4). 查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按入职时间降序排序。
    select name,age from emp where age<=35 order by age asc ,entrydate desc;

    5). 查询性别为男,且年龄在20-40 岁(含)以内的前5个员工信息,对查询的结果按年龄升序排序,
    年龄相同按入职时间升序排序。
    select * from emp where gender='男' and age between 20 and 40  order by age,entrydate limit 0,5 ;
    select * from emp where gender = '男' and age between 20 and 40 order by age asc , entrydate asc limit 5 ;

    9.执行顺序

    在讲解DQL语句的具体语法之前,我们已经讲解了DQL语句的完整语法,及编写顺序,接下来,我们要
    来说明的是DQL语句在执行时的执行顺序,也就是先执行那一部分,后执行那一部分。
    watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiA5Liq54Ot54ix57yW56iL55qE5bCP55m955m9,size_14,color_FFFFFF,t_70,g_se,x_16

    验证:
    查询年龄大于15的员工姓名、年龄,并根据年龄进行升序排序。
    select name , age from emp where age > 15 order by age asc; 1

    在查询时,我们给emp表起一个别名 e,然后在select 及 where中使用该别名
    select e.name , e.age from emp e where e.age > 15 order by age asc;
    执行上述SQL语句后,我们看到依然可以正常的查询到结果,此时就说明: from 先执行, 然后
    where 和 select 执行。那 where 和 select 到底哪个先执行呢?
    此时,此时我们可以给select后面的字段起别名,然后在 where 中使用这个别名,然后看看是否可
    以执行成功。
    select e.name ename , e.age eage from emp e where eage > 15 order by age asc;
    执行上述SQL报错了:
    watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiA5Liq54Ot54ix57yW56iL55qE5bCP55m955m9,size_14,color_FFFFFF,t_70,g_se,x_16

    由此我们可以得出结论: from 先执行,然后执行 where , 再执行select 。
    接下来,我们再执行如下SQL语句,查看执行效果:
    select e.name ename , e.age eage from emp e where e.age > 15 order by eage asc;
    结果执行成功。 那么也就验证了: order by 是在select 语句之后执行的
    综上所述,我们可以看到DQL语句的执行顺序为: from ... where ... group by ...
    having ... select ... order by ... limit ...

    展开全文
  • SQL语言之DQL语句

    2021-09-10 11:54:16
    数据库版本:MySQL8 文章目录 一、DQL语句简介 二、DQL语句 1.简单查询 2.条件查询 3.模糊查询 4.字段控制查询 5.结果集排序 7.聚合函数 7.分组查询 8.LIMIT结果显示 一、DQL语句简介 DQL,Data Query Language,数据...
  • SQL语言——DML与DQL

    2022-04-10 09:25:54
    添加列 语法格式:alter table 表名 add column 列名 列名的数据类型 -- 在学生表中添加年级的id ALTER TABLE stu ADD COLUMN gradeid INT 二、DQL——数据查询语言 DQL主要对数据进行查询操作 1.基本查询语法 ...
  • DDL、DQL、DML、DCL会分为四部分写,本篇写DQL。 文章目录什么是DQL?查询所有列结果集查询指定列的数据条件查询使用模糊查询(属于条件查询的一种)字段控制查询去重排序聚合函数分组查询SQL语句的书写顺序SQL语句...
  • SQL_DQL语句

    2022-04-12 17:58:30
    select 字段列表 from 表1 left join 表2 on 条件 as 后加别名 on后加连接条件 DQL查询语句: 1.排序查询 order by 排序字段 排序方式 order by 排序字段1 排序方式1,排序字段2 排序方式2,...... 排序方式: ASC ...
  • 初步学习了数据库与MySQL,接下来就一起了解SQL语言中的DQL语言的相关知识,数据查询语言(DQL)全称是Data Query Language,主要分为八个大类,是用来进行数据库中数据的查询的,即最常用的select语句。 一、基础...
  • 基本语法3.DQL--基本查询4.DQL--条件查询5.DQL--聚合函数6.DQL--分组查询7.DQL--排序查询8.DQL--分页查询9.DQL语句的执行顺序 1.介绍 DQL英文全称是Data Query Language(数据查询语言),数据查询语言,用来查询...
  • SQL语言分为几大类 DML(Data Manipulate Language):数据操纵语言,用于添加、删除、修改数据库记录,并检查数据完整性 关键字:insert, delete, update 等 ... DQL(Data Query Language):数据查
  • DQL与DML

    2020-08-06 19:58:54
    DQL数据查询语言 一.多表查询 1.内连接---->自连接 2.外连接 在一般的业务情况下,我们大致将 Mysql多表连接 分为如下几种: 内连接:INNER JOIN – 可简写为 JOIN; 左外连接:LEFT OUTER JOIN – 可简写为 LEFT...
  • mysql的DML,DQL,DCL
  • DQL数据查询语言数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。查询返回的结果集是一张虚拟表。查询关键字:SELECT语法:SELECT列名FROM表名【WHERE –> GROUP BY–>HAVING–> ...
  • DQL常用语句总结

    2021-05-04 18:42:51
    DQL语句:常用来查询数据库表中的数据 关键字:SELECT … FROM … WHERE 语法: select 字段列表 from 表名列表 where 条件列表 group by 分组字段 having 分组之后的条件 order by 排序 limit ...
  • oracle-function-执行动态sql(包括DML、DLL、DQL、DCL)
  • # # DQL:查询语句select字段列表from表名列表where条件列表group by分组字段having分组之后的条件order by排序limit分页限定基础查询:1. 多个字段的查询select 字段名1,字段名2... from 表名;* 注意:如果查询...
  • DQL数据查询语言.xmind

    2021-06-07 16:45:17
    数据库SQL语句总结 DQL数据查询语言

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 52,978
精华内容 21,191
关键字:

dql