MySql阶段案例

案例一

  涉及的知识点:数据库和表的基本操作,添加数据,多表操作

题目

使用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)查询雇员中年龄最大的员工的姓名、年龄以及所在部门。

答案

(1)-建库

CREATE DATABASE TEST;

(2)-建表

USE TEST;
CREATE TABLE department
  (did INT(4) PRIMARY KEY,
  dname VARCHAR(36) NOT NULL );
CREATE TABLE employee
  (id INT(4) PRIMARY KEY,
  NAME VARCHAR(36) NOT NULL,
  age INT(2) NOT NULL,
  did INT(4)
);

(3)--向表中插入数据

向部门表插入数据:

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);

(4)-条件查询

SELECT NAME, age
FROM employee
WHERE did = (SELECT did
FROM department
WHERE dname = '人事部');

(5)-条件查询

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,统计出教材的订购数量和总价。

答案

(1)-建表:

CREATE TABLE book
  (id INT PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  price FLOAT NOT NULL
);

(2)--向表中插入数据:

INSERT INTO book
VALUE (1,'Java基础入门',44.5),
(2,'MySQL数据库入门',39.5),
(3,'网页设计与制作',39.5);

(3)--创建存储过程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 //

(4)--调用存储过程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)
);

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”的员工信息。

mysql> SELECT * FROM employee WHERE name LIKE "%a%";

+----+------+----------------------+--------+

| id | name | dept                    | gender |

+----+------+----------------------+--------+

|  2 | Jack | Business Office        | man     |

| 4  | Tina | Business Office        | woman  |

| 5  | Jama | Personnel Department  | woman  |

+----+------+----------------------+--------+

3 rows in set (0.00 sec)

5、查询employee表中名字以“J”开头并且有5个字母的员工信息。

mysql> SELECT * FROM employee WHERE name like "J____";

+----+-------+-----------------+--------+

| id | name  | dept               | gender |

+----+-------+-----------------+--------+

|  3 | Jeden | Business Office  | man    |

+----+-------+-----------------+--------+

1 row in set (0.00 sec)

由查询结果可以看出,用like关键词查询出了符合要求的员工信息。

案例总结

  在本案例中,百分号和下划线统称为通配符,它们在通配字符串中有特殊含义。

  1、百分号(%)通配符匹配任意长度的字符串,包括空字符串。例如,字符串“%a%”匹配字含有字符a的任意长度的字符串,如“Jack”、“Tina”、“Jama”等。

  2、下划线通配符只匹配单个字符,如果要匹配多个字符,需要使用多个下划线通配符。例如,字符串“J____”匹配以字符“J”开始,长度为5的字符串。需要注意的是,如果使用多个下划线匹配多个连续的字符,下划线之间不能有空格,例如,通配字符串“M_ _QL”只能匹配字符串“My SQL”,而不能匹配字符串“MySQL”。

分组统计各班级的分数

3、需求分析

  GROUP BY和聚合函数一起使用,可以统计出某个或者某些字段在一个分组中的最大值、最小值、平均值等等。GROUP BY和HAVING关键字一起使用,用于对分组后的结果进行过滤。

  设计思路(实现原理)

    1)使用数据库chapter04

    2)在数据库chapter04中创建表score

    3)用INSERT语句向score表中插入8条记录

    4)统计出score表中1班和2班的最高分

    5)计算出两个班级的总平均分,然后统计出平均分小于总平均分的班级

二、案例实现

1、使用数据库chapter04

USE chapter04;

2、在数据库chapter04中创建表score,创建score表的SQL语句如下所示:

CREATE TABLE score (
id INT(3) PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
score FLOAT,
class INT
);

3、执行SQL语句创建score表,然后使用INSERT语句向score表中插入8条记录,INSERT语句如下所示:

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);

5、统计出score表中1班和2班的最高分

mysql> SELECT class,MAX(score) FROM score GROUP BY class;

+-------+------------+

| class | MAX(score) |

+-------+------------+

|     1 |         98 |

|     2 |         92 |

+-------+------------+

2 rows in set (0.00 sec)

6、统计出平均分小于两个班级的总平均分的班级

  1)计算两个班级的总平均分

mysql> SELECT AVG(score) FROM score;

+------------+

| AVG(score) |

+------------+

|     75.125 |

+------------+

1 row in set (0.00 sec)

  2)统计出平均分小于75.125的班级

mysql> SELECT class, AVG (score) FROM score GROUP BY class

HAVING AVG (score) <75.125;

+-------+-------------+

| class | AVG (score) |

+-------+-------------+

|     2  |       73.75   |

1 row in set (0.00 sec)

案例总结

  1、实际开发中,经常需要对某些数据进行统计,例如统计某个字段的最大值、最小值、平均值等等,为此,MySQL中提供了一些函数来实现这些功能,具体如下表所示。

函数名称作用

  COUNT()返回某列的行数

  SUM()返回某列值的和

  AVG()返回某列的平均值

  MAX()返回某列的最大值

  MIN()返回某列的最小值

3、HAVING关键字和WHERE关键字的作用相同,都用于设置条件表达式对查询结果进行过滤,两者的区别在于,HAVING关键字后可以跟聚合函数,而WHERE关键字不能。通常情况下HAVING关键字都和GROUP BY一起使用,用于对分组后的结果进行过滤。

使用字符串函数

需求分析

  MySQL中,提供了字符串函数用于对字符串进行各种处理

  4、设计思路(实现原理)

    1)使用数据库chapter04。

    2)在数据库chapter04中创建表content

    3)用INSERT语句向content表中插入1条记录

    4)用LENGTH(str)函数查询content表中id为1的info字段的字符长度

    5)用CONCAT(s1,s2,……)函数将content表中id为1的 info字段中数据与“:”和“Beijing IT WisdomCast Corporation Limited”字符串连接起来

案例实现

1、使用数据库chapter04

USE chapter04;

2、在数据库chapter04中创建表content,创建content表的SQL语句如下所示:

CREATE TABLE content (
id INT(3) PRIMARY KEY AUTO_INCREMENT,
info VARCHAR(50) NOT NULL
);

3、执行SQL语句创建content表,然后使用INSERT语句向content表中插入1条记录,INSERT语句如下所示:

INSERT INTO content (info) VALUES('IT educational institutions');

4、查询content表中id为1的info字段的字符长度

mysql> SELECT LENGTH(info) FROM content WHERE id=1;

+--------------+

| LENGTH(info) |

+--------------+

|           27 |

+--------------+

1  row in set (0.00 sec)

5、将content表中id为1的 info字段中数据与“:”和“Beijing IT Wisdom Cast Corporation Limited”字符串连接起来

mysql> SELECT CONCAT(info,':','Beijing IT Wisdom Cast Corporation Limited')

FROM content WHERE id=1;

+-------------------------------------------------------------------------+

| CONCAT(info,':','Beijing IT Wisdom Cast Corporation Limited')          |

+-------------------------------------------------------------------------+

| IT educational institutions:Beijing IT Wisdom Cast Corporation Limited |

+-------------------------------------------------------------------------+

1 row in set (0.00 sec)

案例总结

1.除了本案例中使用的LENGTH(str)和CONCAT(s1,s2,……)函数,MySQL还提供了一些函数用于字符串的处理,如下表所示。

  函数名称          作用

  LENGTH(str)         返回字符串str的长度

  CONCAT(s1,s2,……)      返回一个或者多个字符串连接产生的新的字符串

  TRIM(str)        删除字符串两侧的空格

  REPLACE(str,s1,s2)    使用字符串s2替换字符串str中所有的字符串s1

  SUBSTRING(str,n,len)  返回字符串str的子串,起始位置为n,长度为len

  REVERSE(str)      返回字符串反转后的结果

  LOCATE(s1,str)     返回子串s1在字符串str中的起始位置

MySql阶段案例的更多相关文章

  1. JDBC操作MySQL数据库案例

    JDBC操作MySQL数据库案例 import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepared ...

  2. mysql优化案例

    MySQL优化案例 Mysql5.1大表分区效率测试 Mysql5.1大表分区效率测试MySQL | add at 2009-03-27 12:29:31 by PConline | view:60, ...

  3. MySQL死锁案例分析与解决方案

    MySQL死锁案例分析与解决方案 现象: 数据库查询: SQL语句分析:  mysql. 并发delete同一行记录,偶发死锁.   delete from x_table where id=?   ...

  4. Mysql综合案例

    Mysql综合案例 考核要点:创建数据表.单表查询.多表查询 已知,有一个学生表student和一个分数表score,请按要求对这两个表进行操作.student表和score分数表的表结构分别如表1- ...

  5. [MySQL优化案例]系列 — slave延迟很大优化方法

    备注:插图来自网络搜索,如果觉得不当还请及时告知 :) 一般而言,slave相对master延迟较大,其根本原因就是slave上的复制线程没办法真正做到并发.简单说,在master上是并发模式(以In ...

  6. Mysql 索引案例学习

    理解索引最好的办法是结合示例,所以这里准备了一个索引的案例. 假设要设计一个在线约会网站,用户信息表有很多列,包裹国家,地区,城市,性别,眼睛颜色,等等.完整必须支持上面这些特征的各种组合来搜索用户, ...

  7. 【MySQL经典案例分析】关于数据行溢出由浅至深的探讨

    本文由云+社区发表 一.从常见的报错说起 ​ 故事的开头我们先来看一个常见的sql报错信息: ​ 相信对于这类报错大家一定遇到过很多次了,特别对于OMG这种已内容生产为主要工作核心的BG,在内容线的存 ...

  8. ELK收集tomcat访问日志并存取mysql数据库案例

    这个案例中,tomcat产生的日志由filebeat收集,然后存取到redis中,再由logstash进行过滤清洗等操作,最后由elasticsearch存储索引并由kibana进行展示. 1.配置t ...

  9. mysql 查询优化案例汇总

    一 简介:此文章为经历过的sql案例集合和相关思路 二 案例1: 现象: 测试环境出现select语句,join2张表多次join,explain结果如下 出现 using where,using j ...

随机推荐

  1. java jsp失效问题--待解决

    打印jps错误信息jps -J-Djps.debug=true -J-Djps.printStackTrace=true 未完待续...

  2. [转]采购文件中 RFI、RFQ、RFP、IFB的区别

    原文:http://www.douban.com/group/topic/23426427/ [PMBOK的描述]  采购文件用于征求潜在卖方的建议书.如果主要依据价格来选择卖方(如购买商业或标准产品 ...

  3. c++之拷贝构造函数调用时机

    test1: #include<iostream> using namespace std; class Copy_construction { public: Copy_construc ...

  4. 【Unity】UGUI的Text各种小问题

    Text:用中文输入法时,无法输入汉字.输入了拼音后,按回车键无反应.目前的办法是在别的地方打好字后复制过来. Font:字体必须选一个,选None则文字变成一串黑色方块. Font Size:文字大 ...

  5. Object中有哪些方法?

    有一种遗憾就是,每天都见到你,但是却不关注你!等到面试的时候才后悔莫及. Object类中有9大public方法: equals:判断两个对象"相等" hashCode:获取对象的 ...

  6. linux 中的进程wait()和waitpid函数,僵尸进程详解,以及利用这两个函数解决进程同步问题

    转载自:http://blog.sina.com.cn/s/blog_7776b9d3010144f9.html 在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / wait ...

  7. Activiti 获取定义

    ProcessDefinitionEntity d = (ProcessDefinitionEntity)((RepositoryServiceImpl)repositoryService).getD ...

  8. 使用RAID与LVM磁盘阵列技术。

    7.2 LVM逻辑卷管理器 前面学习的硬盘设备管理技术虽然能够有效地提高硬盘设备的读写速度以及数据的安全性,但是在硬盘分好区或者部署为RAID磁盘阵列之后,再想修改硬盘分区大小就不容易了.换句话说,当 ...

  9. centsos7修改主机名 [root@st152 ~]# cat /etc/hostname

    CentOS7修改服务器主机名方法CentOS7下修改主机名第一种:hostname 主机名01.hostname 主机名称 <pre name="code" class=& ...

  10. SpringMVC拦截器简单使用

    一.拦截器的配置 1.传统的配置 Xml代码   <bean class="org.springframework.web.servlet.mvc.annotation.Default ...