• SQL中:语法总结(group by,having ,distinct,top,order by,like等等)


    1. 数据库/表的操作:创建create / 改alter / 删drop

    create

    1.创建数据库

    内容过多,请看往期链接:

    在SQL中:如何使用命令创建、修改、添加数据库

    代码:

    create database educ7
    on primary
    ( name='view',  -- 逻辑文件名
    filename='e:\sql_data\view.mdf',  --物理文件名
    size=5mb,  --数据库大小
    maxsize=10mb, -- 最大可达
    filegrowth=1%  --增长方式 /或 filegrowth =1mb 
    )
    log on 
    (name='view_log',
    filename='e:\sql_data\view_log.ldf',
    size=4mb,
    maxsize=6mb,
    filegrowth=1%
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2.创建表/约束

    请看往期学习链接:
    SQL中:check与 contriate语句约束的区别

    代码:

    use educ7  --使用数据库educ7, 否则到默认数据库,其中有表student则会冲突报错
    create table student -- 创建学生表
    ( sno char(8) primary key,  -- 主外键,默认不为空,不用写not null ; 单个主键这样写即可
    sname char(8) not null,
    ssex char(2) null 
    	 constraint  ssex1  CHECK(ssex  in ('男', '女'))  default '男'  , --创建constrain 约束,可自定义约束名
    sage int null
      check( sage between 18 and  20 ),  --创建constrain 约束
    sdept char(10) null
    
    );
    
    create table course --课程表
    ( cno char(2) primary key,
    cname char(30) null,
    credit int  null,
    cpno char(3) null
    );
    
    
    create table sc --选课表
    ( sno char(8)  ,
    cno char(2) ,
    primary key(sno,cno),  --- 多个主键写法
    foreign key (sno) references student(sno), -- 外键 (外键列名 ) 参考 外键基表(即该外键所在的表为主键)
    foreign key (cno) references course(cno),
    grade int null
    );
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    禁用/启用约束

    
     -- 禁用约束
     ALTER TABLE 项目表 NOCHECK CONSTRAINT FK__项目表__项目主管__2F10007B
    
    
    -- 启用外键约束
    ALTER TABLE 项目表 WITH CHECK CHECK CONSTRAINT  FK__项目表__项目主管__2F10007B
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    alter

    作用:修改表结构,给表添加新的字段
    例:

    1. 给表添加字段
    Alter  table  s --s为表名
    add  sname   --sname 为字段名或列名
    
    
    • 1
    • 2
    • 3
    1. 表中删除外键约束
    ALTER TABLE s  --s为表名
    DROP CONSTRAINT 外键约束名;
    
    
    • 1
    • 2
    • 3

    drop

    drop 删除表的命令
    
    • 1

    代码举例:

    DROP TABLE s  --从数据库中删除s表
    
    
    • 1
    • 2

    2.对表中数据的操作:增insert、删delete、改update

    注意点

    int / null(空值)  ,无需单引号
    其他的  , 一般都用单引号 ( 若后续遇到例外, 再更新)
    
    • 1
    • 2

    增insert

    向表中添加数据
    例:

    insert into 
    student    -- 若不写列名, 则默认为表中的的列名顺序、数量; 若仅指定添加某列数据, 例: student  (sname, sage)   等
    
    values   --字段值,也仅仅出现一次 
    ('95001','李勇','男',20,'CS'), --  插入多条数据,用逗号,隔开 
    ('95002','刘晨','女',19,'IS'),   
    ('95003','王敏','女',18,'MA'),   
    ('95004','张立','男',19,'IS'),   
    ('95005','刘云云','女',18,'CS');   
    
    insert into 
    course
    values
    ( '1','数据库', 4, 5),
    ( '2','数学', 6, null), --为空, 无需用单引号
    ('3','信息系统',3, 1),
    ('4','操作系统', 4, 6),
    ('5','数据结构', 4, 7),
    ('6','数据处理', 3, null),
    ('7' ,'PASCAL语言',4, 6);
    
    insert into
    sc
    values
    ('95001', '2', 69),
    ('95001', '3', 88),
    ('95002', '2', 10),
    ('95003', '2', 10),
    ('95001', '1', 92),
    ('95004', '1', 58),
    ('95004', '2', 85);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    删delete

    从 from 表中删除一行数据
    
    • 1

    代码举例:

      DELETE    -- 只写delete 
      FROM    student   -- 要删除哪个表中的内容,删除删的是记录
      WHERE    age=20 --条件
    
    • 1
    • 2
    • 3

    改update

    功能:更新update 表

    例:

    UPDATE    student   -- 要更新哪个表中的内容
    SET    CLASS='95091'   -- 设置set  字段名= 新的内容
    WHERE    CLASS='95101' --条件
    
    • 1
    • 2
    • 3

    3.对表中数据的操作:查select

    普通查询

    查询过程

    1.查询条件:
    2.查询表:
    3.查询列:
    
    • 1
    • 2
    • 3

    执行过程

    正常情况下, 输入代码,计算机执行,我们都会;
    然而重要的是: 你需要脑中想象自己手动查询并执行该表的操作,才能更好的掌握计算机SQL命令的执行过程;
    
    • 1
    • 2

    基本查询语法:

    select  distinct  或 all 或 top    列名  
    from  表名 
    where   条件
    group by  列名  having  条件
    order by  列名  asc 或 desc 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    嵌套查询

    分为:

    外层查询 与 内层查询
    
    • 1

    代码举例:

    select * /* 查询所有列 ,此select为 外层查询 */  
    from student
    where sno inselect sno  /* 此select为内层查询 ,不可使用order by子句 */
    from student
    sno=1 or sno =2
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    内层查询 与 外层查询中:

    where  **列名1**  < any 
    (
    select  **列名1** 
    from sc
    where  ssex=‘男’
    ) 
    
    列名一样
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    子查询

    相关子查询

    特点:

    子查询的查询条件不依赖于父查询
    
    • 1

    过程:

    由里向外逐层处理
    即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。
    
    • 1
    • 2

    技巧:

    通常给的题目中,最后一个词 就是连接外查询与内查询的关键列名
    
    • 1

    代码举例1:

    -- 查询与红星商店在同一地区的商店信息。
    select *
    from SHOP
    where  ShopAddress in
    (
    select ShopAddress
    from SHOP
    where ShopName='红星'
     )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    结果:
    在这里插入图片描述

    相关子查询

    特点:

    子查询的查询条件依赖于父查询
    
    • 1

    过程:

    1.首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若where子句返回值为真,则取此元组放入结果表
    2.再取外层表的下一个元组
    3.重复这一过程,直至外层表全部检查完为止
    
    查询的过程抽象为:  先外查询、再内查询、最后外查询
    
    • 1
    • 2
    • 3
    • 4
    • 5

    使用的谓词
    1.in谓词 (专用于不相关子查询 )

    问题:

    为什么不用等号= ?
    
    解:
    等号=, 仅仅一个结果;  而in谓词,可在子查询中匹配多个结果
    
    • 1
    • 2
    • 3
    • 4

    2.比较运算符
    不等于:
    != 或 <>

    结果:
    true 或 false

    3.exist / not exitst (专用于相关子查询 )
    使用:

    exists  存在true ,子查询中存在,结果:true
    exists 存在true,子查询中不存在,结果:false
    not exists   不存在false,子查询中存在true,结果:false
    not exists 不存在false,子查询中不存在false,在结果:true
    
    结果:
    true 或 false
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.谓词: any(some)或all

    any(some):

    子查询中某个值
    
    • 1

    all:

    子查询中所有值
    
    • 1

    集合查询:

    并union

    使用条件: 列数相同,数据类型相同
    功能:将两个表进行并集操作
    中文:  union, 联合
    
    • 1
    • 2
    • 3

    union 与 union all的区别:

    UNION: 将多个查询结果合并起来时,系统自动去掉重复元组
    UNION ALL: 将多个查询结果合并起来时,保留重复元组
    
    • 1
    • 2

    例:

    -- 结果 实则为 R  并(U)  T 的结果,R/T为关系名
    select    *    
    from    R
    UNION
    select    *
    from    T 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    交 intercept

    中文:  intercept, 拦截
    
    • 1

    差: except

    中文: except  ; 除了,不包括
    
    • 1

    基于派生表的查询

    区别子查询:

    子查询出现在  where 后
    派生表的查询出现在 from 后
    
    • 1
    • 2

    特例

    例1:

    select 1 
    -- 从数据库中选择数字 1,通常用于检查查询是否成功或返回一个常量值。在某些情况下,它也可以用于返回一个虚拟的列。
    
    
    • 1
    • 2
    • 3

    结果:
    在这里插入图片描述

    4.语法总结

    查询相关

    1.分组group by 与 条件having

    1. group by
      作用:给列划分成组

    对表中某列属性成组划分,一个列中按其属性可划分成多个组

    按指定的一列或多列值分组,值相等的为一组

    1. having
      group by 分组后,使用条件时,用having,而不是用where

    代码举例:

    select sage  as 年龄 
    from STUDENT
    group by sage
    having  sage<19
    
    • 1
    • 2
    • 3
    • 4

    原本表:
    在这里插入图片描述
    结果:
    在这里插入图片描述

    表2:
    图1

    扩展:

    sex 性别,可划分为:男、女 两组
    
    以此类推:
    上表
    也可以按 sage 年龄分组,分为17、18、19三组
    也可以按 sno  学号分组,分为95001、95002等等五组,但这样分就没有意义了
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.聚集函数

    第二个就写聚集函数,那肯定和上面的group by有点关联了;

    group by: 
    一般聚集函数 常与group by 连用; 
    若对查询结果group by 分组后,聚集函数将分别作用于每个组
    
    distinct:  聚集函数中可使用distinct 去掉重复值,如count(distinct  列名)等
    单独使用: 聚集函数也可按情况单独使用,不用group by分组
    指定别名: 聚集函数后一般要指定别名, 如count(sno)   学生人数
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    例:
    原表:
    图1
    查询结果:
    在这里插入图片描述
    图2

    count

    计数,求表中行的个数

    用法:

    count(列名)
    count(distinct  列名)
    
    • 1
    • 2
    order by

    注意:

    嵌套查询的子查询中不能使用order by子句
    
    • 1

    例:

    select *
    from student
    where  sno=1
    order by  列名 desc,列名 asc
    
    • 1
    • 2
    • 3
    • 4
    distinct 与 all

    distinct:

    中文意思:不同的;清楚的;有区别的 
    作用:去掉重复行 
    用法: select   distinct   列名 或  聚集函数(distinct  列名)	
    
    • 1
    • 2
    • 3
    空值null / not null

    判断是否为空值:

    is not null   
    或
    is null
    
    • 1
    • 2
    • 3

    由于某些原因不便写,或暂时没有的数据用该语句表示

    模糊查询 like

    like常与 百分号%、 下划线 _ 连用

    1. %表示多个字符
    2. _ 表示单个字符

    常用函数

    日期

    1. getdate() :返回年月日 时分秒毫秒

    例:

    select GETDATE();
    
    • 1

    结果:
    在这里插入图片描述

    1. year( 时间参数): 返回当前日期所在的年

    例1:

    select GETDATE(), year(GETDATE() );
    
    
    • 1
    • 2

    结果:
    在这里插入图片描述
    例2:
    得到出生年份

    select YEAR(GETDATE())- sage  as 出生年份
    from  STUDENT
    
    • 1
    • 2

    结果:
    在这里插入图片描述

    数据类型

    1.smalldatetime

    设置浮点数、时间数据类型并仅仅保留年/月/日 时:分:秒(0:00:00)
    
    • 1

    5.索引的建立和删除

    请看往期文章:
    索引的建立和删除

    6.表的连接:内外连接、多表连接、UNION

    请看往期文章:
    SQL server中内连接和外连接的区别、表达(多表连接)

    待续、更新中

     
     
    —————————————————————
    以上就是今日博客的全部内容了
    创作不易,若对您有帮助,可否点赞、关注一二呢,感谢支持.

  • 相关阅读:
    Day45:Element-Plus
    NX许可证错误:VD is starting, please check vendor daemon s status in debug log
    电脑DLL修复工具,一键解决计算机dll丢失
    2022年,有哪些适合普通人的风口项目?
    单片机C语言实例:24、红外通讯
    为什么选择微服务架构? 微服务架构的10个核心优势 总结
    SpringBoot发送邮件
    安卓10添加修改serial串口的服务
    视频去LOGO的方法,AI自动完美地去除视频LOGO
    十三、Mysql - GTID主从复制 - MHA架构 - 数据库优化
  • 原文地址:https://blog.csdn.net/qq_54017009/article/details/134019561