• 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
  • 相关阅读:
    HashMap死循环造成CPU100%
    ArrayList升级为线程安全的List
    并发容器-ConncurrentHashMap
    并发容器-概览
    不可变性final
    CAS
    原子类-Adder累加器
    hue-使用mysql作为元数据库
    yhd日志分析(二)
    yhd日志分析(一)
  • 原文地址:https://www.cnblogs.com/viplanyue/p/12700429.html
Copyright © 2020-2023  润新知