1. 程式人生 > >MySql階段案例

MySql階段案例

獲取 存儲 har 需要 cati mysql數據庫 tro business pro

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階段案例