MySQL习题

本教程提供了一系列SQL实战案例,涵盖数据库创建、表结构设计、数据操作、查询优化、存储过程、触发器、视图、权限管理及备份恢复等内容,旨在帮助读者深入理解并掌握SQL在实际场景中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第三章习题

(1)查看当前系统中的数据库。

mysql> SHOW DATABASES;

(2)创建数据库Book,使用SHOW CREATE DATABASE 语句查看数据库定义信息。

mysql> CREATE DATABASE Book;

mysql> SHOW CREATE DATABASE Book;

(3)删除数据库Book.

DROP DATABASE Book;

 

第四章习题

1.创建数据库Market,在Market中创建表customers,customers表结构如表4.5所示,按要求进行操作。

表4.5 customers表结构字段名

数据类型

主键

外键

非空

唯一

自增

c_num

INT(11)

c_name

VARCHAR(50)

c_contact

VARCHAR(50)

c_city

VARCHAR(50)

c_birth

DATETIME

 

(1) 创建数据库Market。

mysql> CREATE DATABASE Market;

(2) 创建数据表customers,在c_num字段上添加主键约束和自增约束,在c_birth字段添加非空约束。

mysql> USE Market;

mysql> CREATE TABLE customers(

    -> c_num INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,

    -> c_name VARCHAR(50),

    -> c_contact VARCHAR(50),

    -> c_city VARCHAR(50),

    -> c_birth DATETIME NOT NULL

    -> );

(3) 将c_cantact字段插入到c_birth字段后面。

mysql> ALTER TABLE customers MODIFY c_contact VARCHAR(50) AFTER c_birth;

(4) 将c_name字段数据类型改为VARCHAR(70)。

mysql> ALTER TABLE customers MODIFY c_name VARCHAR(70);

(5) 将c_cantact字段改名为c_phone.

mysql> ALTER TABLE customers CHANGE c_contact c_phone VARCHAR(70)

(6) 增加c_gender字段,数据类型为CHAR(1)。

mysql> ALTER TABLE customers ADD c_gender CHAR(1)

(7) 将表名修改为customers_info。

mysql> ALTER TABLE customers RENAME customers_info;

(8) 删除字段c_city。

mysql> ALTER TABLE customers_info DROP c_city;

(9) 修改数据表的存储引擎为MyISAM。

mysql> ALTER TABLE customers_info ENGINE=MyISAM;

2.在Market表中创建数据表orders,orders表结构如表4.6所示,按要求进行操作。

表4.6 orders表结构字段名

数据类型

主键

外键

非空

唯一

自增

o_num 

INT(11) 

o_date 

DATE 

c_id 

VARCHAR(50) 

 

(1) 创建数据表orders,在o_num字段上添加主键约束和自增约束,在c_id字段上添加外键约束,关联customs表中的主键c_num。

mysql> ALTER TABLE customers_info ENGINE=InnoDB;

mysql> CREATE TABLE orders(

    -> o_num INT(11) PRIMARY KEY NOT NULL UNIQUE AUTO_INCREMENT,

    -> o_date DATE,

    -> c_id INT(11) ,

    -> FOREIGN KEY(c_id) REFERENCES customers_info(c_num)

    -> );

(2) 删除orders表的外键约束,然后删除表customers。

mysql> ALTER TABLE orders DROP FOREIGN KEY orders_ibfk_1;

mysql> DROP TABLE customers_info;

 

 

 第五章习题

(1)MySQL中的小数如何表示,不同表示方法之间有什么区别? 

float数值类型用于表示单精度浮点数值,而double数值类型用于表示双精度浮点数值,float和double都是浮点型,而decimal是定点型; 

MySQL 浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和标度,如float(7,4)的 可显示为-999.9999,MySQL保存值时进行四舍五入,如果插入999.00009,则结果为999.0001。 

FLOAT和DOUBLE在不指定精度时,默认会按照实际的精度来显示,而DECIMAL在不指定精度时,默认整数为10,小数为0。 

(2)BLOB和TEXT分别适合于存储什么类型的数据? 

BLOB,二进制大对象(字节流)。可以用来存储图片,声音和视频等二进制文件。没有字符集的说法。 

TEXT,文本大对象(字符流)。可以用来存储大量的字符串,可以理解为超大的char或者varchar类型。由于是存储字符,所以有字符集的说法。 

(3)说明ENUM和SET类型的区别以及在什么情况下适用?

mysql中的enum和set其实都是string类型的而且只能在指定的集合里取值, 

不同的是set可以取多个值,enum只能取一个值。 

ENUM 是一个字符串对象,其值通常选自一个允许值列表中,该列表在表创建时的列规格说明中被明确地列举。 

在下列某些情况下,值也可以是空串("") 或NULL: 

如果将一个无效值插入一个 ENUM (即,一个不在允许值列表中的字符串),空字符串将作为一个特殊的错误值被插入。事实上,这个字符串有别于一个"普通的"空字符串,因为这个字符串有个数字索引值为 0。稍后有更详细描述。 

如果一个 ENUM 被声明为NULL,NULL 也是该列的一个合法值,并且该列的缺省值也将为NULL 。如果一个ENUM 被声明为NOT NULL,该列的缺省值将是该列表所允许值的第一个成员。 

每个枚举值均有一个索引值: 

在列说明中列表值所允许的成员值被从 1 开始编号。 

空字符串错误值的索引值为 0。 

(4)在MySQL中执行去下算术运算:(9-7)*4,8+15/3,17 DIV 2,39%12。 

mysql> SELECT (9-7) * 4, 8 + 15 / 3, 17 DIV 2, 39 % 12;

(5)在MySQL中执行如下比较运算:36>27,15>=8,40<50,15<=15,NULL<=>NULL,NULL<=>1,5<=>5。 

mysql> SELECT 36 > 27, 15 >= 8, 40 < 50, 15<=15, NULL<=>NULL, NULL<=>1, 5<=>5;

(6)在MySQL中执行如下逻辑运算:4&&8,-2||NULL,NULL XOR 0,0 XOR 1,!2。 

mysql> SELECT 4 && 8, -2 || NULL, NULL XOR 0, 0 XOR 1, !2;

(7)在MySQL中执行如下位运算:13&17,20|8,14^20,~16。 

mysql> SELECT 13 & 7, 20 | 8, 14 ^ 20, ~16;

第六章习题

1.使用数学函数进行如下运算: 

(1)计算18除以5的商和余数。 

mysql> SELECT FLOOR(18 / 5), MOD(18, 5);

(2)将弧度值PI()/4转换为角度值。 

mysql> SELECT DEGREES(PI()/4);

(3)计算9的4次方值。 

mysql> SELECT POW(9, 4);

(4)保留浮点值3.14159小数点后面的两位 

mysql> SELECT FORMAT(3.14159, 2);

 

2.使用字符串函数进行如下运算: 

(1)分别计算字符串"Hello World!"和"University"的长度。 

mysql> SELECT CHAR_LENGTH('Hello World!'), CHAR_LENGTH('University');

(2)从字符串"Nice to meet you!"中获取子字符串"meet"。 

mysql> SELECT SUBSTRING(‘Nice to meet you!',9,4); 

(3)重复输出3次字符串"Cheer!"。 

mysql> SELECT REPEAT(‘Cheer!',3); 

(4)将字符串"viidoo"逆序输出。 

mysql> SELECT REVERSE(‘viidoo'); 

(5)4个字符串"MySQL","not","is","great",按顺序排列,从1,3和4位置处的字符串组成新的字符串。 

mysql> SELECT MAKE_SET(1|3|4,'MySQL','not','is','great');

3.使用日期和时间函数进行如下运算: 

(1)计算当前日期是一年的第几周。 

mysql> SELECT WEEK(CURDATE()); 

(2)计算当前日期是一周中的第几个工作日。 

mysql> SELECT DAYOFWEEK(CURDATE()) - 1;

(3)计算"1992-02-14"与当前日期之间相差的年份。 

mysql> SELECT YEAR(CURDATE()) - YEAR('1992-02-14');

(4)按"97 Oct 4th Saturday"格式输出当前日期。 

mysql> SELECT DATE_FORMAT(now(), '%y %b %D %W ');

(5)从当前日期时间值中获取时间值,并将其转换为秒值。 

mysql> SELECT TIME_TO_SEC(NOW());

4.使用MySQL函数进行如下运算: 

(1)使用show processlist语句查看当前连接状态。 

(2)使用加密函数encode对字符串"mysql"加密,并使用decode函数解密。 

mysql> SELECT DECODE(ENCODE('mysql','test'),'test');

(3)将十进制的值100转换为十六进制值。 

mysql> SELECT CONV(100, 10, 16);

(4)格式化数值5.1584,四舍五入保留到小数点后面第3位。 

mysql> SELECT FORMAT(5.1584, 3);

(5)将字符串"new string"的字符集改为gb2312。 

mysql> SELECT CONVERT('new string' USING gb2312);

第七章习题

mysql> CREATE TABLE dept

    -> (

    -> d_no         INT NOT NULL PRIMARY KEY AUTO_INCREMENT,

    -> d_name       VARCHAR(50),

    -> d_location  VARCHAR(100)

    -> );

mysql> CREATE TABLE employee

    -> (

    -> e_no        INT NOT NULL PRIMARY KEY,

    -> e_name      VARCHAR(100) NOT NULL,

    -> e_gender    CHAR(2) NOT NULL,

    -> dept_no    INT NOT NULL,

    -> e_job       VARCHAR(100) NOT NULL,

    -> e_salary   SMALLINT NOT NULL,

    -> hireDate   DATE,

    -> CONSTRAINT dno_fk FOREIGN KEY(dept_no)

    -> REFERENCES dept(d_no)

    -> );

mysql> INSERT INTO dept 

    -> VALUES (10, 'ACCOUNTING', 'ShangHai'),

    -> (20, 'RESEARCH ', 'BeiJing '),

    -> (30, 'SALES ', 'ShenZhen '),

    -> (40, 'OPERATIONS ', 'FuJian ');

mysql> INSERT INTO employee 

    -> VALUES (1001, 'SMITH', 'm',20, 'CLERK',800,'2005-11-12'),

    -> (1002, 'ALLEN', 'f',30, 'SALESMAN', 1600,'2003-05-12'),

    -> (1003, 'WARD', 'f',30, 'SALESMAN', 1250,'2003-05-12'),

    -> (1004, 'JONES', 'm',20, 'MANAGER', 2975,'1998-05-18'),

    -> (1005, 'MARTIN', 'm',30, 'SALESMAN', 1250,'2001-06-12'), 

    -> (1006, 'BLAKE', 'f',30, 'MANAGER', 2850,'1997-02-15'),

    -> (1007, 'CLARK', 'm',10, 'MANAGER', 2450,'2002-09-12'),

    -> (1008, 'SCOTT', 'm',20, 'ANALYST', 3000,'2003-05-12'),

    -> (1009, 'KING', 'f',10, 'PRESIDENT', 5000,'1995-01-01'),

    -> (1010, 'TURNER', 'f',30, 'SALESMAN', 1500,'1997-10-12'),

    -> (1011, 'ADAMS', 'm',20, 'CLERK', 1100,'1999-10-05'),

    -> (1012, 'JAMES', 'm',30, 'CLERK', 950,'2008-06-15');

(1) 计算所有女员工(“F”)的年限

mysql> SELECT YEAR(NOW()) - YEAR(hireDate) FROM employee WHERE e_gender='F';

(2) 使用LIMIT 查询从第3 条记录开始到第6 条记录

mysql> SELECT * FROM employee limit 2,4;

(3) 查询销售人员(SALESMAN)的最低工资

SELECT MIN(e_salary) FROM employee WHERE e_job='SALESMAN';

(4) 查询名字以字母N 或S 结尾的记录

mysql> SELECT * FROM employee WHERE e_name REGEXP '[NS]$';

(5) 查询在BeiJing 工作的员工的姓名和职务

法一:

mysql> SELECT e_name,e_job FROM employee WHERE dept_no=(SELECT d_no FROM dept WHERE d_location='BeiJing');

法二:

mysql> SELECT e_name,e_job FROM employee,dept WHERE d_location='BeiJing' AND employee.dept_no=dept.d_no; 

法三:

mysql> SELECT e_name,e_job FROM employee JOIN dept ON employee.dept_no=dept.d_no WHERE dept.d_location='BeiJing'; 

(6) 使用左链接方式查询employee 和dept 表

mysql> SELECT * FROM employee LEFT OUTER JOIN dept ON employee.dept_no=dept.d_no;

(7) 查询所有2001-2005 年入职的员工的信息,查询部门编号为20 和30 的员工信息并使用UNION 合并两个查询结果

mysql> SELECT * FROM employee WHERE YEAR(hireDate) BETWEEN 2001 AND 2015 UNION SELECT * FROM employee WHERE dept_no IN (20, 30);

(8) 使用LIKE 查询员工姓名中包含字母a 的记录

mysql> SELECT * FROM employee WHERE e_name LIKE '%a%';

(9) 使用REGEXP 查询员工姓名中包含T、C 或者M3 个字母中任意1 个的记录

mysql> SELECT * FROM employee WHERE e_name REGEXP '[TCM]'; 

第八章习题

(1)创建数据表pet,插入数据

mysql> CREATE TABLE pet(

    -> name VARCHAR(20) NOT NULL,

    -> owner VARCHAR(20),

    -> species VARCHAR(20) NOT NULL,

    -> sex CHAR(1) NOT NULL,

    -> birth YEAR NOT NULL,

    -> death YEAR

    -> );

mysql> INSERT INTO pet VALUES('Fluffy', 'Harold', 'cat', 'f', 2003, 2010), 

    -> ('Claws', 'Gwen', 'cat','m', 2004, NULL),

    -> ('Buffy', NULL, 'dog', 'f', 2009, NULL),

    -> ('Fang', 'Benny', 'dog', 'm', 2000, NULL),

    -> ('Bowser', 'Diane', 'dog', 'm', 2003, 2009),

    -> ('Chirpy', NULL, 'bird', 'f', 2008, NULL);

(2)使用UPDATE 将Fang 的主人改为Kevin

mysql> UPDATE pet SET owner='Kevin' WHERE name='Fang';

(3)将没有主人的宠物的owner 字段值改为Duck

mysql> UPDATE pet SET owner='Duck' WHERE owner IS NULL;

(4)删除已经死亡的宠物记录

mysql> DELETE FROM pet WHERE death is NOT NULL;

(5)删除所有表中的记录

mysql> DELETE FROM pet;

第九章习题

在index_test 数据库中创建数据表writers.

(1)存储引擎为MyISAM,创建表的同时在w_id 字段上添加唯一名称为UniqIdx 的唯一索引

mysql> CREATE DATABASE index_test;

mysql> USE index_test;

mysql> CREATE TABLE writers(

    -> w_id SMALLINT(11) PRIMARY KEY NOT NULL UNIQUE AUTO_INCREMENT,

    -> w_name VARCHAR(255) NOT NULL,

    -> w_age CHAR(2) NOT NULL,

    -> w_address VARCHAR(255),

    -> w_note VARCHAR(255),

    -> UNIQUE INDEX Uniqidx(w_id)

    -> );

mysql> ALTER TABLE writers ENGINE=MyISAM;

(2)使用ALTER TABLE 语句在w_name 字段上建立名称为nameIdx 的普通索引

mysql> ALTER TABLE writers ADD INDEX nameIdx(w_name(255));

(3)使用CREATE INDEX 语句在w_address 和w_age 字段上建立名称为MultiIdx 的组合索引

mysql> CREATE INDEX MutiIdx ON writers(w_address,w_age);

(4)使用CREATE INDEX 语句在w_note 字段上建立名称为FTIdx 的全文索引

mysql> CREATE FULLTEXT INDEX FTIdx ON writers(w_note);

(5)删除名称为FTIdx 的全文索引

mysql> DROP INDEX FTIdx ON writers;

第十章习题

CREATE TABLE sch(id INT, name VARCHAR(50),class VARCHAR(50));
INSERT INTO sch VALUE(1,’xiaoming’,’1班’), (1,’xiaojun’,’2班’);

(1)写一个Hello World 的存储过程和函数

mysql> DELIMITER //

mysql> CREATE PROCEDURE hello_world()

    -> BEGIN

    -> END

    -> //

mysql> CREATE FUNCTION hello_world() 

    -> RETURNS DATETIME

    -> RETURN (SELECT CURDATE())

    -> //

mysql> DELIMITER ;

(2)写一个完整的包括参数、变量、变量赋值、条件判断、UPDATE 语句、SELECT 返回语句结果集的存储过程

DELIMITER //
CREATE FUNCTION count_sch()
RETURNS INT
RETURN (SELECT COUNT(*) FROM sch);
//

DELIMITER //
CREATE PROCEDURE add_id(out count INT)
BEGIN
DECLARE itmp INT;
DECLARE cur_id CURSOR FOR SELECT id FROM sch;
DECLARE EXIT HANDLER FOR NOT FOUND CLOSE cur_id;
SELECT count_sch() INTO count;
SET @sum=0;
OPEN cur_id;
REPEAT
FETCH cur_id INTO itmp;
IF itmp<10
THEN SET  @sum=  @sum+itmp;
END IF;
UNTIL 0 END REPEAT;
CLOSE cur_id;
END //

(3)创建一个执行动态SQL 的存储过程

mysql> CREATE PROCEDURE add_stu(IN name VARCHAR(50), IN class VARCHAR(50), out count INT)

    -> BEGIN

    -> INSERT INTO sch VALUES(name, class);

    -> SELECT count_sch() INTO count;

    -> END

    -> //

(4)创建实现功能相同的存储函数,比较他们之间的不同点在什么地方?

 这题瞎写写

第十一章习题

(1)在一个表上创建视图

mysql> CREATE OR REPLACE VIEW employee_job(e_name,e_job) AS SELECT e_name,e_job FROM employee;

mysql> SELECT * FROM employee_job;

 

(2)在多个表上创建视图

mysql> CREATE VIEW employee_info AS SELECT * FROM employee LEFT OUTER JOIN dept ON employee.dept_no=dept.d_no;

(3)更改视图

mysql> ALTER VIEW employee_info AS SELECT * FROM employee LEFT OUTER JOIN dept ON employee.dept_no=dept.d_no ORDER BY employee.e_salary;

(4)查看视图详细信息

SHOW TABLE STATUS LIKE 'employee_info';

(5)更新视图内容

mysql> UPDATE employee_job SET e_job = 'SALESMAN' WHERE e_name='SMITH';

(6)理解视图和基本表之间的关系.

用户操作的权限视图是一个或多个基本表导出的表,与基本表相比,视图是一个虚表。数据库中只存放视图的定义,但并不存放其中的数据,这些数据仍在原来的基本表中。

第十二章习题

步骤1:创建persons表

CREATE TABLE persons (name VARCHAR(40), num int);

步骤2:创建一个销售额表sales

CREATE TABLE sales (name VARCHAR(40), sum int);

(1)创建INSERT 事件的触发器

mysql> DELIMITER //

mysql> CREATE TRIGGER num_sum AFTER INSERT ON persons

    -> FOR EACH ROW

    -> BEGIN

    -> IF (SELECT COUNT(*) FROM sales WHERE name=NEW.name) > 0 THEN

    -> UPDATE sales SET sum = sum + NEW.num WHERE sales.name=NEW.name; 

    -> ELSE

    -> INSERT INTO sales VALUES (NEW.name,NEW.num);

    -> END IF;

    -> END

    -> //

mysql> DELIMITER ;

(2)创建UPDATE 事件的触发器

mysql> DELIMITER //

mysql> CREATE TRIGGER update_sum AFTER UPDATE ON persons FOR EACH ROW

mysql> BEGIN

mysql> UPDATE sales SET sum = sum-OLD.num+NEW.num WHERE sales.name=NEW.name;

mysql> END//

mysql> DELIMITER ;

(3)创建DELECT 事件的触发器

mysql> DELIMITER //

mysql> CREATE TRIGGER update_sum_after_delete_person AFTER DELETE ON persons FOR EACH ROW

    -> BEGIN

    -> UPDATE sales SET sum = sum-OLD.num WHERE sales.name=OLD.name;

    -> END

    -> //

mysql> DELIMITER ;

 

(4)查看触发器

测试上述触发器

mysql> INSERT INTO persons VALUES('zhangSan', 100);

mysql> SELECT * FROM sales;

mysql> UPDATE persons SET num=50 WHERE name='zhangSan';

mysql> INSERT INTO persons VALUES('zhangSan', 125);

mysql> SELECT * FROM sales;

mysql> DELETE FROM persons WHERE num=50;

mysql> SHOW TRIGGERS; 

(5)删除触发器

mysql> DROP TRIGGER update_sum_after_delete_person;

mysql> DELETE FROM persons;

mysql> SELECT * FROM sales;

第十三章经典习题

1.创建数据库Team,定义数据表player 

(1)创建一个新账户account1,该用户通过本地主机连接数据库,密码为pldpwd1.授权该用户对Team 中player 表的SELECT 和INSERT 权限,并且授权该用户对player 表的info 字段的UPDATE 权限

mysql> GRANT SELECT,INSERT,UPDATE(info) 

    -> ON Team.player

    -> TO 'account1'@localhost IDENTIFIED BY 'pldpwd1';

(2)更改account1 的密码为newpsw2 

mysql> SET PASSWORD FOR 'account1'@localhost = PASSWORD('newpsw2');

(3)使用PLUSH PRIVILEGES 重新加载权限表

PLUSH PRIVILEGES

(4)查看授权给account1 用户的权限

mysql> SHOW GRANTS FOR 'account1'@localhost;

(5)收回account1 的权限

mysql> REVOKE ALL PRIVILEGES,GRANT OPTION  FROM 'account1'@localhost;

(6)删除account1 的用户信息

mysql> DROP USER 'account1'@localhost;

第十四章经典习题

创建测试数据:

mysql> CREATE DATABASE test;

mysql> use test;

mysql> CREATE TABLE suppliers(

    -> id INT(11) PRIMARY KEY UNIQUE AUTO_INCREMENT NOT NULL,

    -> name VARCHAR(50) NOT NULL

    -> );

mysql> CREATE TABLE fruits(

    -> id INT(11) PRIMARY KEY UNIQUE AUTO_INCREMENT NOT NULL,

    -> supplier_id INT(11) NOT NULL,

    -> name VARCHAR(50) NOT NULL,

    -> FOREIGN KEY(supplier_id) REFERENCES suppliers(id)

    -> );

mysql> INSERT INTO suppliers(name) VALUES('jingDong'), ('taoBao'),('amazon');

mysql> INSERT INTO fruits(name, supplier_id) VALUES ('apple', 1), ('apple', 2), ('orange', 2);

(1)同时备份test 数据库中的fruits 和suppliers 表,然后删除两个表中的内容并还原利用mysqldump 备份

localhost:~ xushaojun$ mysqldump -u root -p -h localhost  --databases test > test.sql;

mysql> USE test;

mysql> DROP TABLE fruits,suppliers;

localhost:~ xushaojun$ mysql -u root -p test < test.sql

(2)将test 数据库中不同的数据表导出到xml 文件或者html 文件,并查看文件内容

localhost:~ xushaojun$ mysql -h localhost -u root  -p --xml --execute="SELECT * FROM fruits;" test > fruits.xml

localhost:~ xushaojun$ mysql -h localhost -u root  -p --html --execute="SELECT * FROM suppliers;" test > suppliers.html

(3)使用mysql 命令导出fruits 表中记录,并将查询结果以垂直方式显示写入文件

localhost:~ xushaojun$ mysql -h localhost -u root -p --execute="SELECT * FROM fruits" test > fruits.txt 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值