zoukankan      html  css  js  c++  java
  • MySQL入门,第七部分,单表查询

    首先我们需要了解一下整个数据库的结构

    其中Student表中Sno为主键、Study表中Sno和Cno合起来做主键、Course表中Cno为主键

    其创建脚本如下:

    #------------------------------创建数据库及写入数据------------------------------
    
    CREATE DATABASE SCDB;
    
    #--创建学生选课数据库 
    USE SCDB;
    
    #--创建学生表Student
    CREATE TABLE Student
    (
    	Sno CHAR(10) NOT NULL PRIMARY KEY,
    	Sname CHAR(10) NULL,
    	Age INT NULL,
    	Sex CHAR(1), 
    	Place CHAR(10)
    )ENGINE=INNODB DEFAULT CHARSET=utf8;
    
    #--查看表Student详细定义
    SHOW CREATE TABLE Student;
    
    #--给学生表Student插入数据
    INSERT INTO Student(Sno,Sname,Age,Sex,Place)
    VALUES('02001','王明',21,'男','广东'),
    ('02005','黄小英',22,'女','湖北'),
    ('03035','张小倩',20,'女','江西'),
    ('03061','李刚',21,'男','湖北'),
    ('04009','张珊',18,'女','浙江'),
    ('04027','肖文',19,'男','福建');
    
    #--创建课程表Course
    CREATE TABLE Course
    (
    	Cno CHAR(10) NOT NULL PRIMARY KEY,
    	Cname CHAR(10) NULL,
    	Credit INT NULL
    )ENGINE=INNODB DEFAULT CHARSET=utf8;
    
    #--给课程表Course插入数据
    INSERT INTO Course
    VALUES('C01','操作系统',3),
    ('C02','C语言',4),
    ('C03','数据结构',3),
    ('C04','数据库原理',2),
    ('C05','软件工程',2);
    
    #--创建选修表Study
    CREATE TABLE Study
    (
    	Sno NCHAR(10) NOT NULL REFERENCES Student(Sno),
    	Cno NCHAR(10) NOT NULL REFERENCES Course(Cno),
    	Grade INT NULL,
    	PRIMARY KEY (Sno,Cno)
    )ENGINE=INNODB DEFAULT CHARSET=utf8;
    
    #--给选修表Study插入数据
    INSERT INTO Study(Sno,Cno,Grade)
    VALUES('02001','C01',86),
    ('02001','C05',78),
    ('02005','C01',81),
    ('02005','C03',66),
    ('03035','C02',78),
    ('03035','C04',92),
    ('03061','C04',52),
    ('03061','C01',84),
    ('04009','C02',78),
    ('04009','C03',82),
    ('04027','C01',80);
    #-----------------------------------------------------------------------------

    一、单表简单查询

    1.简单属性投影

    查询student表中的姓名、年龄、籍贯

    π sno, sname, age  (Student)
    select sname, age, place
    from student;

    2.投影全部数据

    显示course表中的所有数据

    select *
    from course;

    3.投影时为属性设置别名

    查询student表,并且为sname和age设置别名

    select sname 姓名, age as 年龄
    from student;
    
    
    注意:
    as 可有可无,但是为了脚本的可读性,建议写上

    4.投影时进行简单四则运算

    显示student表中的学生的出生年份

    select 2020 - age as 出生年份
    from student;
    
    
    select year(CURRENT_DATE - age) as 出生年份
    from student;
    
    
    注意:
    语句中可以包含带有+、-、×、/的算术运算表达式,其运算对象为常量或元组的属性

    5.对查询结果进行消重

    查询课表中的学分列

    select distinct Credit as 学分
    from course;
    
    
    注意:
    distinct 关键字用来消重

    6.使用聚合函数(集函数)

    查询所有学生的平均分

    select avg(Grade)
    from study;
    COUNT(*)		统计查询结果中的元组个数
    COUNT(<列名>)	        统计查询结果中一个列上值的个数
    MAX(<列名>)		计算查询结果中一个列上的最大值
    MIN(<列名>)		计算查询结果中一个列上的最小值
    SUM(<列名>)		计算查询结果中一个数值列上的总和
    AVG(<列名>)		计算查询结果中一个数值列上的平均值
    
    
    注意:
    除COUNT(*)外,其他集函数都会先去掉空值再计算
    DISTINCT保留字,会将查询结果的列去掉重复值再计算

    二、单表条件查询

    1.投影满足某一条件的元组(元组属性)

    查询籍贯为湖北的学生姓名

    select sname
    from student
    where Place = '湖北';

    查询籍贯不是湖北的学生的姓名

    select sname
    from student
    where not Place = '广东';

    2.投影满足多个条件的元组(元组属性)

    运算符号

    含    义

             NOT  

    IN

    NOT IN

    判断属性值是否在一个集合内

    BETWEEN…AND…

    NOT BETWEEN…AND…

    判断属性值是否在某个范围内

    IS NULL

    IS NOT NULL

    判断属性值是否为空

    LIKE

    NOT LIKE

    判断字符串是否匹配

    查询大于20岁的女生

    select sname
    from student
    where age >= 20 and Sex = '女';

    查询广东或江西籍贯的学生姓名

    select sname
    from student
    where Place = '广东' or Place = '江西';
    
    或
    
    select sname
    from student
    where Place in ('广东', '江西');

    查询66和88之间的成绩

    select grade
    from study
    where Grade between 66 and 78;

    3.通配符的使用

    符号 含义
    % 匹配任意子串
    _(下划线) 匹配任意一个字符
    转义(特殊字符)
    '(单引号) 转义(')
    / 转义(%   _)

    查询姓王的学生

    select sname
    from student
    where sname like '王%';

    4.正则表达式

    模式

    描述

    举例

    ^

    匹配输入字符串的开始位置

     

    $

    匹配输入字符串的结束位置

     

    .

    匹配除 " " 之外的任何单个字符

     

    [...]

    字符集合。匹配所包含的任意一个字符

    '[abc]' 可以匹配 "plain" 中的 'a'

    [^...]

    负值字符集合。匹配未包含的任意字符

     '[^abc]' 可以匹配 "plain" 中的'p'

    p1|p2|p3

    匹配 p1 或 p2 或 p3

    'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"

    *

    匹配前面的子表达式零次或多次

    zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}

    +

    匹配前面的子表达式一次或多次

    'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}

    {n}

    n 是一个非负整数。匹配确定的 n 次

    'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o

    {n,m}

    m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次

     

    查询姓王的学生

    select sname
    from student
    where sname regexp '^王';
    
    
    注意:
    配合正则表达式查询时,前面必须有关键字 regexp 

    5.日期和时间的比较

    日期格式:DATE'XX-XX-XX'

    例如:DATE ’1945-10-01’

    时间格式:TIME'XX:XX:XX'

    例如:TIME ’15:00:00’

    日期与时间的比较根据 '早与晚' 判定

    6.排序

    ORDER   BY   <属性表>   [ASC | DESC]  

    ASC ===> 升序

    DESC ===> 降序

    select sno, grade
    from study
    where grade >= 60
    order by  grade desc

    7.分组查询

    GROUP   BY   <属性>

    分组查询把一个表按某一指定列(或一些列)上的值相等的原则分组;一般和聚合函数一起使用,当使用该子句后,所有的聚合函数都将是对每一个组进行运算

    例如:

    将成绩按班级分类,并且把每个班级的平均分显示出来

    select cno, avg(grade)
    from study
    group by cno

    8.分组条件查询

    HAVING   ?

    按分组的结果筛选满足条件的分组时,需要使用 HAVING 关键字而不是 WHERE 关键字

    例如:

    将班级平局分大于75分的班级显示出来

    select cno, avg(grade)
    from study
    group by cno
    having avg(grade) > 75

    9.其他查询

    查询籍贯相同的学生的信息

    SELECT a.sname AS 同籍贯学生
    FROM student as a, student as b
    WHERE a.place = b.place AND a.sno<>b.sno
  • 相关阅读:
    HTB-靶机-Charon
    第一篇Active Directory疑难解答概述(1)
    Outlook Web App 客户端超时设置
    【Troubleshooting Case】Exchange Server 组件状态应用排错?
    【Troubleshooting Case】Unable to delete Exchange database?
    Exchange Server 2007的即将生命周期,您的计划是?
    "the hypervisor is not running" 故障
    Exchange 2016 体系结构
    USB PE
    10 months then free? 10个月,然后自由
  • 原文地址:https://www.cnblogs.com/viplanyue/p/12700429.html
Copyright © 2011-2022 走看看