MySql階段案例
MySql階段案例
案例一
涉及的知識點:數據庫和表的基本操作,添加數據,多表操作
題目
使用sql語句請按照要求完成如下操作:
(1)創建一個名稱為test的數據庫。
(2)在test數據庫中創建兩張表,Department部門表和Employee雇員表,表名和字段信息如下表所示。
Department部門表
字段類型 是否空 是否主鍵
did int(4) NOPRI
dname varchar(36) YES
Employee雇員表
字段類型 是否空 是否主鍵
id int(4)
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) PRIMARYKEY, 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階段案例