• mysql学习总结2


    /*
    案例一
      涉及的知识点:数据库和表的基本操作,添加数据,多表操作
    题目
    使用sql语句请按照要求完成如下操作:
      (1)创建一个名称为test的数据库。
    
      (2)在test数据库中创建两张表,Department部门表和Employee雇员表,表名和字段信息如下表所示。
         
           Department部门表
      字段类型  是否空  是否主键
        did    int(4)    NOPRI
       dname  varchar(36)  YES
          
            Employee雇员表
      字段类型  是否空    是否主键
      id      int(4)     NOPRI
      name    varchar(36)   YES
      age     int(2)      YES
      did     int(4)      NO
    
      (3)在部门表和雇员表中插入三条数据,要求雇员信息分别为:人事部张三(20岁),院校产品部李四(35岁)以及咨询部王五(19岁)。
    
      (4)查出人事部员工的姓名和年龄。
    
      (5)查询雇员中年龄最大的员工的姓名、年龄以及所在部门。
    */
    
    --创建数据库
    CREATE DATABASE TEST;
    
    --使用test数据库
    USE TEST;
    
    --建表
    CREATE TABLE department( 
    did INT(4) PRIMARY KEY,
    dname VARCHAR(36) NOT NULL )
    default charset=utf8 ;
    
    CREATE TABLE employee
    (id INT(4) PRIMARY KEY,
    NAME VARCHAR(36) NOT NULL,
    age INT(2) NOT NULL,
    did INT(4)
    )default charset=utf8 ;
    
    --向部门表中插入数据
    INSERT INTO department(did,dname) VALUES(1,'人事部');
    INSERT INTO department(did,dname) VALUES(2,'院校产品部');
    INSERT INTO department(did,dname) VALUES(3,'咨询部');
    
    --向员工表中插入数据
    INSERT INTO employee(id,NAME,age,did) VALUES(1,'张三',20,1);
    INSERT INTO employee(id,NAME,age,did) VALUES(2,'李四',35,2);
    INSERT INTO employee(id,NAME,age,did) VALUES(3,'王五',19,3);
    
    --查出人事部员工的姓名和年龄
    select NAME,age from employee where did = (select did from department where dname='人事部');
    
    --查询雇员中年龄最大的员工的姓名、年龄以及所在部门
    select dname,NAME,age from department d , employee e where age = (select max(age) from employee) and d.did=e.did;
    
    
    /*
    案例二
      涉及的知识点:数据库和表的基本操作,添加数据,存储过程
    题目
      已知张三在传智播客网上书城订购了的几本教材。请按照以下要求建表、定义存储过程并利用存储过程统计出教材的订购数量和总价。
    要求如下:
    
      (1)创建book表,字段明细如下,name代表书名,price代表书的价格:
    
      字段名  数据类型  主键  外键  非空  唯一  自增
      id    INT(10)    是    否    是    是    否
      name   VARCHAR(50)  否    否    是    否    否
      price   FLOAT      否    否    是    否    否
    
      (2)向book表中添加数据明细如下:
    
      id  name       price
      1  Java基础入门    44.5
      2  MySQL数据库入门  39.5
      3  网页设计与制作   39.5
    
      (3)创建一个存储过程total,能够获取表book中的记录数和price的总和。
    
      (4)调用存储过程total,统计出教材的订购数量和总价。
    */
    
    --建表
    CREATE TABLE book
    (id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    price FLOAT NOT NULL
    )default charset=utf8;
    
    --插入数据
    INSERT INTO book
    VALUE (1,'Java基础入门',44.5),
    (2,'MySQL数据库入门',39.5),
    (3,'网页设计与制作',39.5);
    
    --创建存储过程total
    DELIMITER //
    CREATE PROCEDURE total(OUT COUNT INT)
    BEGIN
    DECLARE itmp FLOAT;
    DECLARE cur_id CURSOR FOR SELECT price FROM book; 
    DECLARE EXIT HANDLER FOR NOT FOUND CLOSE cur_id;
    SELECT COUNT(*) INTO COUNT FROM book;
    SET @totalprice=0;
    OPEN cur_id;
    REPEAT 
    FETCH cur_id INTO itmp;
    IF itmp>0
    THEN SET @totalprice= @totalprice+itmp;
    END IF;
    UNTIL 0 END REPEAT;
    CLOSE cur_id;
    END //
    ;
    
    --调用存储过程total:
    CALL total(@count) ;
    SELECT @count,@totalprice ;
    
    
    
    /*
    案例三
    带LIKE关键字的查询
    
    需求分析
    
      有时候我们需要对字符串进行模糊查询,MySQL中提供了LIKE关键字,LIKE关键字可以判断两个字符串是否相匹配。
    
    设计思路(实现原理)
    
      1)创建数据库chapter04
    
      2)在数据库chapter04中创建表employee
    
      3)向employee表中插入6条记录
    
      4)查询employee表中名字中含有字母“a”的员工信息
    
      5) 查询employee表中名字以“J”开头并且有5个字母的员工信息
    */
    
    --1、创建数据库chapter04并使用该数据库
    CREATE DATABASE chapter04;
    USE chapter04;
    
    --2、在数据库chapter04中创建表employee,创建employee表的SQL语句如下所示:
    CREATE TABLE employee(
        id INT(3) PRIMARY KEY AUTO_INCREMENT,
        name VARCHAR(20) NOT NULL,
        dept VARCHAR(20),
        gender CHAR(10)
    )default charset=utf8;
    
    --3、执行SQL语句创建employee表,然后使用INSERT语句向employee表中插入6条记录,INSERT语句如下所示:
    INSERT INTO employee(name,dept,gender)VALUES
    ('Tom','Business Office','man'),
    ('Jack','Business Office','man'),
    ('Jeden','Business Office','man'),
    ('Tina','Business Office','woman'),
    ('Jama','Personnel Department','woman'),
    ('Juli','Personnel Department','woman');
    
    --4、查询employee表中名字中含有字母“a”的员工信息。
    select * from employee where name like "%a%";
    
    --5、查询employee表中名字以“J”开头并且有5个字母的员工信息。
    select * from employee where name like "J____";
    
    /*
        在本案例中,百分号和下划线统称为通配符,它们在通配字符串中有特殊含义。
    
      1、百分号(%)通配符匹配任意长度的字符串,包括空字符串。
        例如,字符串“%a%”匹配字含有字符a的任意长度的字符串,如“Jack”、“Tina”、“Jama”等。
    
      2、下划线通配符只匹配单个字符,如果要匹配多个字符,需要使用多个下划线通配符。
        例如,字符串“J____”匹配以字符“J”开始,长度为5的字符串。
        需要注意的是,如果使用多个下划线匹配多个连续的字符,下划线之间不能有空格,
        例如,通配字符串“M_ _QL”只能匹配字符串“My SQL”,而不能匹配字符串“MySQL”。
    */
    
    
    
    /*
    案例四  分组统计各班级的分数
    
    需求分析
      GROUP BY和聚合函数一起使用,可以统计出某个或者某些字段在一个分组中的最大值、最小值、平均值等等。
        GROUP BY和HAVING关键字一起使用,用于对分组后的结果进行过滤。
      设计思路(实现原理)
    
        1)使用数据库chapter04
    
        2)在数据库chapter04中创建表score
    
        3)用INSERT语句向score表中插入8条记录
    
        4)统计出score表中1班和2班的最高分
    
        5)计算出两个班级的总平均分,然后统计出平均分小于总平均分的班级
    */
    
    --创建表
    CREATE TABLE score (
    id INT(3) PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    score FLOAT,
    class INT
    )default charset=utf8;
    
    --插入数据
    INSERT INTO score (name,score,class)
    VALUES('Tom',98,1),
    ('Jack',34,1),
    ('Jeden',77,1),
    ('Tina',97,1),
    ('Jama',92,2),
    ('Lucy',67,2),
    ('Lily',59,2),
    ('Juli',77,2);
    
    --统计出score表中1班和2班的最高分
    select class,max(score) from score group by class;
    
    --统计出平均分小于两个班级的总平均分的班级
    -- 1)计算两个班级的总平均分
    select avg(score) from score;
    
    --2) 统计出平均分小于75.125的班级
    select class,avg(score) as avs from score group by class having avs<=(select avg(score) from score);
    
    /*案例总结
      HAVING关键字和WHERE关键字的作用相同,都用于设置条件表达式对查询结果进行过滤,两者的区别在于,
      HAVING关键字后可以跟聚合函数,而WHERE关键字不能。通常情况下HAVING关键字都和GROUP BY一起使用,用于对分组后的结果进行过滤。
      where 后面跟的条件可以是select语句中没有出现的字段,having 后面跟的条件必须是select语句出现的字段名称
    */
    
    
      
    你是个男人,赚钱是你唯一的出路,
    即使没有清晨熬好的粥,也没有灯火通明的家,
    你也应该对自己的人生负责。
    生如蝼蚁,当有鸿鹄之志,
    命虽薄纸,应有不屈之心,
    欲要成功,必有其梦,
    欲戴王冠,必承其重。
  • 相关阅读:
    call、apply、bind函数的理解以及手写。
    父div里两个子div(inline-block),为什么两个子div中间会有小缝隙,如何解决?
    手写柯里化
    arguments的理解
    New
    BFC
    useCallBack和useMemo的用法
    观察者模式和发布订阅模式
    grid布局
    Android常见输入法的包名和主类名
  • 原文地址:https://www.cnblogs.com/braveym/p/14008676.html
Copyright © 2020-2023  润新知