前言
本文章的语言描述会比上篇多一些
数据库的创建修改与删除
标识符命名规则
- 数据库名、表名不得超过30个字符,变量限制为29个
- 必须只能包含A-Z,a-z,0-9,_等63个字符
- 数据库名、表名、字段名等对象名中间不要包含空格
- 同一个MySQL软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名
- 必须保证你的字段没有和保留字、数据库系统或常用方法冲突。如果坚持使用,请在SQL语句中使用`(着重号)引起来(不建议这么做)
- 保持字段名和类型的一致性:在命名字段并为其指定数据类型的时候一定要保证一致性,假如数据类型在一个表里是整数,那在另一个表中可别变成其他类型了
创建数据库
创建数据库的方式有三种:
#创建和管理表
SELECT * FROM ORDER;
SELECT * FROM `ORDER`;#使用着重号来区别保留字或关键字
#如何创建数据库
#创建数据库也是要有用户权限的
#root是根目录,我们学习都是用的root
数据库是不能改名的,有些图形工具可以改名的原因是,底层创建了一个新数据库,然后把要修改的数据库数据全部复制到新数据库里,然后删除旧数据库,所以一般不要修改数据库名,数据表是可以修改的
字符集默认使用utf8mb4
#显示创建的数据库的字符集和其他信息
#SHOW CREATE DATABASE databaseName;
#CREATE DATABASE `mytest1`
#/*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */
#方式1:
CREATE DATABASE mytest1;
SHOW CREATE DATABASE mytest1;#默认utf8mb4
#方式2:指定字符集
CREATE DATABASE mytest2 CHARACTER SET 'gbk';
SHOW CREATE DATABASE mytest2;#gbk
#方式3(推荐使用):判断是否存在
#执行完毕后,字符集仍然是gbk,可以发现并不会覆盖和影响,只是不报错了
CREATE DATABASE IF NOT EXISTS mytest2 CHARACTER SET 'utf8';
#如果不存在,则正常创建
CREATE DATABASE IF NOT EXISTS mytest3 CHARACTER SET 'utf8';
SHOW CREATE DATABASE mytest3;#UTF8
#显示当前所有的数据库
SHOW DATABASES;#可以看到三个mytest数据库在列表中
#在非图形用户界面或者没有进入特定数据库时,是需要通过点击或use来进入数据库的
#切换\进入\使用数据库
USE atguigudb;#进入后,才可以进行表的操作,否则是提示命令表不存在
#查看当前数据库都存有哪些表
#没有表的话,图形中会是空的,命令行会提示:Empty set (0.00 sec),如果表没有数据也会是这样
USE mytest1;#进入数据库
SHOW TABLES;#显示该数据库的全部数据表
USE atguigudb;
SHOW TABLES;
#查看当前使用的数据库
SELECT DATABASE()FROM DUAL;#函数
#查看指定数据库下保存的表
SHOW TABLES FROM mysql;
修改数据库
#修改数据库
#更改数据库字符集
SHOW CREATE DATABASE mytest2;#查看创建结构
#将gbk修改成utf8
ALTER DATABASE mytest2 CHARACTER SET 'utf8';
SHOW CREATE DATABASE mytest2;#修改成功
#删除数据库
#方式1:
DROP DATABASE mytest1;#不能执行2次
SHOW DATABASES;
#方法2:
DROP DATABASE IF EXISTS mytest1;#如果不存在则不做任何处理
DROP DATABASE IF EXISTS mytest2;
SHOW DATABASES;
常见的数据类型_创建表的两种方式
数据类型
#如何创建数据表
USE atguigudb;
SHOW CREATE DATABASE atguigudb;#默认使用的是utf8
SHOW TABLES;
#方式1:
CREATE TABLE IF NOT EXISTS myemp1(#需要用户具备创建表的权限
id INT,
emp_name VARCHAR(15),#使用VARCHAR来定义字符串,必须在使用VARCAHR时指明其长度
hire_date DATE
);
DESC myemp1;#查看表结构
#如果创建表时没有指明使用的字符集,则默认使用表所在的数据库的字符集
SHOW CREATE TABLE myemp1;#显示数据库创建时的语句
SELECT*FROM myemp1;#查看表数据
#方式2:
CREATE TABLE myemp2
AS
SELECT employee_id ,last_name,salary
FROM employees;
DESC myemp2;SELECT*FROM myemp2;#有字段的
DESC employees;
#说明1:查询语句中字段的别名,可以作为新创建的表的字段的名称
#说明2:此时的查询语句可以结构比较丰富,使用前面讲过的各种SELECT
CREATE TABLE myemp3
AS
SELECT e.employee_id emp_id,e.last_name lname,d.department_name
FROM employees e JOIN departments d
ON e.department_id = d.department_id;
SELECT*FROM myemp3
DESC myemp3;
#练习1:创建一个表employees_copy,实现对employees表的复制,包括表数
CREATE TABLE employees_copy
AS
SELECT * FROM employees;
SELECT*FROM employees_copy;
#练习2:创建一个表employees_blank,实现对employees表的复制,不包括表数
CREATE TABLE employees_blank
AS
SELECT *
FROM employees
WHERE department_id > 10000;
SELECT * FROM employees_blank;
DESC employees_blank;
修改表_重命名表_删除表_清空表
#修改表_重命名表_删除表_清空表
DESC myemp1;
#修改表 --> ALTER TABLE
#添加一个字段
ALTER TABLE myemp1
ADD salary DOUBLE(10,2);#默认添加到表中的最后一个字段
DESC myemp1;
ALTER TABLE myemp1
ADD phone_number VARCHAR(20) FIRST;#FIRST:第一个
DESC myemp1;
ALTER TABLE myemp1
ADD email VARCHAR(45) AFTER emp_name;#AFTER:指定添加在某字段的后面
DESC myemp1;
#修改一个字段:数据类型、长度、默认值(略)
ALTER TABLE myemp1
MODIFY emp_name VARCHAR(25);#将emp_name的类型从VARCHAR(15)改为VARCHAR(25)
DESC myemp1;
ALTER TABLE myemp1
MODIFY emp_name VARCHAR(35) DEFAULT 'aaa'; #指定了默认值,如果插入数据为NULL,则默认为'aaa'
DESC myemp1;
#重命名一个字段
ALTER TABLE myemp1
CHANGE salary monthly_salary DOUBLE(10,2);
DESC myemp1;
ALTER TABLE myemp1
CHANGE email my_email VARCHAR(50);#类型也是可以修改的
DESC myemp1;
#删除一个字段
ALTER TABLE myemp1
DROP COLUMN my_email;
DESC myemp1;
#重命名表
#方式1:
RENAME TABLE myemp1
TO myemp11;
DESC myemp11;
#方式2:
ALTER TABLE myemp2
RENAME TO myemp12;
DESC myemp12;
#删除表:不光将结构删除,同时表中的数据也被删除,释放表空间
DROP TABLE IF EXISTS myemp2;
DROP TABLE IF EXISTS myemp12;
#清空表:只删除表数据,表结构不变 --> 包括自增列也会重置,而delete from 和 回滚事务 是无法重置自增列自增长值的
SELECT * FROM employees_copy;
TRUNCATE TABLE employees_copy;
SELECT * FROM employees_copy;
DCL中的COMMIT和ROLLBACK的使用
COMMIT表示提交,在数据库中是默认提交的,如果不是默认提交,则每次执行完数据库操作,如果不提交,则所有数据都会回滚,就像你写Word文档,但是没有保存,一旦没有保存,这些数据都会消失。
#DCL中COMMIT和ROLLBACK
#COMMIT:提交数据。一旦执行COMMIT,则数据就被永久的保存在数据库中,意味着数据不可以回滚
#ROLLBACK:回滚数据。一旦执行ROLLBACK,则可以实现数据的回滚。回滚到最近的一次COMMIT最后
#对比TRUNCATE TABLE 和 DELETE FROM
#相同点:都可以实现对表中所有数据的删除,同时保留表结构
#不同点:
# TURNCATE TABLE:一旦执行此操作,表数据全部清除。同时,数据是不可以回滚的
# DELETE FROM:一旦执此操作,表数据可以全部清除(不带WHERE)同时,数据是可以实现回滚的
/*
DDL 和 DML的说明
① DDL的操作一旦执行,就不可回滚SET autocommit = FALSE对DDL操作无效.
(因为在执行完DDL操作之后,一定会执行一次COMMIT,而此操作不受SET autocomiit=false的影响)
② DML的默认情况下,一旦执行,也是不可回滚的。但是,如果在执行DML之前,
执行了 SET autocommit = FALSE,则执行的DML操作就可以实现回滚
*/
#演示:DELETE FROM
#1)
COMMIT;#先提交一下
#2)
SELECT*FROM myemp3;#106条数据
#3)
SET autocommit = FALSE;
#4)
DELETE FROM myemp3;
#5)
SELECT*FROM myemp3;#0条数据
#6)
ROLLBACK;#回滚数据
#7)
SELECT*FROM myemp3;#106条数据
阿里MySQL命名规范及MySQL8.0DDL的原子化
阿里开发规范:
【参考】TRUNCATE TABLE比DELETE速度快,且使用的系统和事务日志资源少,但TRUNCATE无事务且不触发TRIGGER,有可能造成事故,故不建议在开发代码中使用此语句
说明:TRUNCATE TABLE在功能上与不带WHERE子句的DELETE语句相同
内容扩展
#测试MySQL8.0的新特性:DDL的原子化
CREATE DATABASE mytest;
USE mytest;
CREATE TABLE book1(
book_id INT,
book_name VARCHAR(255)
);
SHOW TABLES;
DROP TABLE book1,book2
SHOW TABLES;
#区别是,如果是5.7版本的MySQL,上面的删除数据表语句,会将book1删除掉
#这里是没有book2的,所以肯定报错,但是8.0中,如果报错了就不会删除book1
#这也是DDL的原子化:要么都成功,要么就回滚
创建管理表练习
练习需知
#--------------------------------------------------------------------------------
#在查询所有数据库或所有表时,都是在后加上了s
#表示复数,SHOW DATABASES;SHOW TABLES;
#如下代码不要执行,只看代码语法结构,将实际表代入即可
#增加字段:
ALTER TABLE employees
ADD salary INT;
#修改字段:类型、位置
ALTER TABLE employees
MODIFY salary INT AFTER birth_date;#MODIFY salary INT FIRST
#修改字段名:
ALTER TABLE employees
CHANGE birth birthday DATE;
#删除字段:
ALTER TABLE employees
DROP COLUMN department_id;
#修改表名
RENAME employees TO emp1;
ALTER TABLE employees
RENAME TO emp1;
#查询所有表
SHOW TABLES;#默认当前数据库
SHOW TABLES FROM test03_company;#指定数据库
SHOW TABLES FROM atguigudb;#跨数据库查询
#使用查询复制式建表
CREATE TABLE myemp01
AS
SELECT * FROM employees;#没有问题,当前数据表
CREATE TABLE myemp02
AS
SELECT * FROM atguigudb.`departments`;#跨库,必须指定库名+表名 以.作为引用
#--------------------------------------------------------------------------------
练习1
#创建和管理表练习
#练习1:
#1.创建数据库test01_office,指明字符集为utf8。并在此数据库执行下述操作
CREATE DATABASE IF NOT EXISTS test01_office CHARACTER SET 'utf8';
USE test01_office;
#2.创建表dept01
/*
字段 类型
id INT(7)
NAME VARCHAR(25)
*/
CREATE TABLE IF NOT EXISTS dept01(
id INT(7),
`NAME` VARCHAR(25)
);
DESC dept01;
#3.将表departments的数据插入新表dept02表中
CREATE TABLE IF NOT EXISTS dept02
AS
#我们当前在test01_office数据库下,该数据库下是没有departments表的
#我们需要额外指定这张表来源于哪个数据库
SELECT *
FROM atguigudb.departments;
DESC dept02;SELECT*FROM dept02;
#4.创建表emp01
/*
字段 类型
id INT(7)
first_name VARCHAR(25)
last_name VARCHAR(25)
dept_id INT(7)
*/
CREATE TABLE IF NOT EXISTS emp01(
id INT(7),
first_name VARCHAR(25),
last_name VARCHAR(25),
dept_id INT(7)
);
DESC emp01;
#5.将列last_name的长度增加到50
ALTER TABLE emp01
MODIFY last_name VARCHAR(50);
DESC emp01;#查看表结构
#6.根据表employees创建emp2
CREATE TABLE IF NOT EXISTS emp02
AS
SELECT * FROM atguigudb.`employees`;
DESC emp02;SELECT*FROM emp02;
SHOW TABLES FROM test01_office;
#7.删除表emp01
DROP TABLE emp01;
ROLLBACK;#无效,因为执行完DDL操作,会自动提交
#8.将表emp02重命名为emp01
ALTER TABLE emp02
RENAME TO emp01;
#REANME TABLE emp01 TO emp02;
SHOW TABLES FROM test01_office;
#9.在表dept02和emp01中添加新列test_column,并检查所做的操作
ALTER TABLE emp01
ADD test_column VARCHAR(10);DESC emp01
ALTER TABLE dept02
ADD test_column VARCHAR(10);DESC dept02;
#10.直接删除表emp01中的列department_id
ALTER TABLE emp01
DROP COLUMN department_id;DESC emp01;
练习2
#1、创建数据库test02_market
CREATE DATABASE IF NOT EXISTS test02_market;
USE test02_market;
SHOW CREATE DATABASE test02_market;
#2、创建数据表customers
CREATE TABLE IF NOT EXISTS customers(
c_num INT,
c_name VARCHAR(50),
c_contact VARCHAR(50),
c_city VARCHAR(50),
c_birth DATE
);
SHOW TABLES;
#3、将c_contact字段移动到c_birth字段后面
ALTER TABLE customers
MODIFY c_contact VARCHAR(50) AFTER c_birth;
DESC customers;
#4、将c_name字段数据类型改为VARCHAR(70)
ALTER TABLE customers
MODIFY c_name VARCHAR(70);
DESC customers;
#5、将c_contact字段改名为c_phone
ALTER TABLE customers
CHANGE c_contact c_phone VARCHAR(50);
DESC customers;
#6、增加c_gender字段到c_name后面,数据类型为char(1)
ALTER TABLE customers
ADD c_gender CHAR(1) AFTER c_name;
DESC customers;
#7、将表名改为customers_info
RENAME TABLE customers#DESC customers;
TO customers_info;
SHOW TABLES;DESC customers_info;
#8、删除字段c_city
ALTER TABLE customers_info
DROP COLUMN c_city;
DESC customers_info;
练习3
#练习3:
#1、创建数据库test03_company
CREATE DATABASE IF NOT EXISTS test03_company CHARACTER SET 'utf8';
USE test03_company;
#2、创建表offices
CREATE TABLE IF NOT EXISTS offices(
officeCode INT,#办公号
city VARCHAR(30),#城市
address VARCHAR(50),#地址
country VARCHAR(50),#国家
postalCode VARCHAR(25)#邮政编码
);
DESC offices;
#3、创建表employees
CREATE TABLE IF NOT EXISTS employees(
empNum INT,#员工号
lastName VARCHAR(50),#姓
firstName VARCHAR(50),#名字
mobile VARCHAR(25),#住处
`code` INT,#代码...码
jobTitle VARCHAR(50),#职称
birth DATE,#生日
note VARCHAR(255),#记录
sex VARCHAR(5)#姓别
);
DESC employees;
#4、将表employees的mobile字段修改到code字段后面
ALTER TABLE employees
MODIFY mobile VARCHAR(20) AFTER `code`;
DESC employees;
#5、将表employees的birth字段改名为birthday
ALTER TABLE employees
CHANGE birth birthday DATE;
DESC employees;
#6、修改sex字段,数据类型为char(1)
ALTER TABLE employees
MODIFY sex CHAR(1);
DESC employees;
#7、删除字段note
ALTER TABLE employees
DROP COLUMN note;
DESC employees;
#8、增加字段名favoriate_activity,数据类型为varchar(100)
ALTER TABLE employees
ADD favoriate_activity VARCHAR(100);
DESC employees;
#9、将表employees的名称修改为employees_info
RENAME TABLE employees
TO employees_info;
/*
ALTER TABLE employees
RENAME TO employees_info
*/
#DESC employees;
DESC employees_info;
SHOW TABLES;
数据处理之增删改
在实际开发场景中,我们总是会不断向数据表中增加数据、修改数据、删除数据等等操作,这里涉及到了增删改操作,数据库语言核心是:增删改查
DML之添加数据
#数据增删改
#储备工作
USE atguigudb;
CREATE TABLE IF NOT EXISTS emp1(
id INT,
`name` VARCHAR(15),
hire_date DATE,
salary DOUBLE(10,2)
);
DESC emp1;
SELECT *
FROM emp1;#空
#添加数据
#方式1:一条一条的添加数据
#①没有指明添加的字段
#正确的
INSERT INTO emp1
#如果没有写小数点,则会隐式转换
VALUES(1,'Tom','2000-12-21',3400.00);#一定要按声明的字段的先后顺序添加
SELECT *
FROM emp1;#1条
#错误的
#INSERT INTO emp1
#VALUES(2,3400,'2000-12-21','Jerry');#一定要按声明的字段的先后顺序添加
SELECT *
FROM emp1;#1条
#方式2:
INSERT INTO emp1(id,hire_date,salary,`name`)#类似于Java的构造器
VALUES(2,'2000-12-21',3400,'Jerry');
SELECT *
FROM emp1;#2条
INSERT INTO emp1(id,salary,`name`)
VALUES(3,4500.00,'shk');#其他没有指定的字段则为NULL,如果有默认值则为默认值
SELECT *
FROM emp1;#3条 如果有约束的haul,则无法添加NULL 也就是 NOT NULL的非空约束(暂略)
#③
INSERT INTO emp1(id,`name`,salary)
VALUES
(4,'zixuan',5000);
INSERT INTO emp1(id,`name`,salary)
VALUES
(5,'美',99999);
SELECT * FROM emp1;
#同时插入多条数据
INSERT INTO emp1 VALUES(6,'cat','2022-4-20',0.00),
(7,'tianyi','2012-7-12',8102.00);
SELECT * FROM emp1;
#方式2:将查询结果插入到表中
SELECT * FROM emp1;
INSERT INTO emp1(id,`name`,salary,hire_date)
#AS只能放到新表,而这个可以是新,也可以是旧
#查询语句
SELECT employee_id,last_name,salary,hire_date#查询的字段一定要与添加到的表的字段一一对应
FROM employees
WHERE department_id IN (70,60);#70 60 | 60 70顺序不影响结果
SELECT * FROM emp1;
DESC emp1;
DESC employees;
#说明:emp1表中要添加数据的字段的长度不能低于employees表中查询字段的长度
#否则容易精度丢失,可以更大,但是不能更小
DML之更新删除操作_MySQL8.0新特性之计算列
更新数据和删除数据
#更新数据(或修改数据)
SELECT*FROM emp1;SELECT*FROM emp1 WHERE id = 4;
#UPDATE ... SET ... WHERE ...
#可以实现批量修改数据
UPDATE emp1
SET hire_date = '2004-09-04'
WHERE id = 4;#一定要添加条件,否则会全部修改掉
SELECT*FROM emp1;SELECT*FROM emp1 WHERE id = 4;
#同时修改一条数据的多个字段
UPDATE emp1
SET hire_date = CURDATE(),salary=6000
WHERE id = 5;
SELECT*FROM emp1;SELECT*FROM emp1 WHERE id = 5;
#题目:将表中姓名中包含字符a的提薪20%
UPDATE emp1
SET salary = salary*1.2
WHERE `name` LIKE '%a%';SELECT*FROM emp1;
#修改数据时,是可能存在不成功的情况的。原因:语法不对、有约束等等
UPDATE employees
SET department_id = 10000
WHERE employee_id = 102;
#删除数据 DELETE FROM ... WHERE ... 如果没有where,则会删除掉表中的所有数据
SELECT*FROM emp1;SELECT*FROM emp1 WHERE id = 1;
DELETE FROM emp1
WHERE id = 1;
SELECT*FROM emp1;
#由于约束影响,删除也是可能失败的
DELETE FROM departments
WHERE department_id = 50;
#小结:DML操作默认情况下,执行完以后都会自动提交数据
#如果希望执行完以后不自动提交数据,则需要使用 SET autocommit = FALSE;
MySQL8.0新特性计算列
#MySQL8.0新特性:计算列
USE atguigudb;
CREATE TABLE IF NOT EXISTS test1(
a INT,
b INT,
#GENERATED -> 生成|ALWAYS -> 总是|| VIRTUAL -> 虚拟
#这些关键字的单个翻译有点抽象,总翻译大概为 始终作为(a+b)虚拟生成
c INT GENERATED ALWAYS AS (a+b) VIRTUAL#此时c字段就作为了我们的计算列
);
INSERT INTO test1(a,b)
VALUES(10,20);
SELECT*FROM test1;DESC test1;
#更新数据
UPDATE test1#将a修改为100,我们只有一行,所以可以不加where条件
SET a = 100;
SELECT * FROM test1;#c变成了 120(a=100+b=20)
这关键字有点抽象,大概意思理解就行,该计算列的应用场景并不多,先知道有就行
DDL和DML的综合案列
#DDL和DML的综合案例
#1、创建数据库test01_library
CREATE DATABASE IF NOT EXISTS test01_library CHARACTER SET 'utf8';
USE test01_library;
#2、创建books表
CREATE TABLE IF NOT EXISTS books(
id INT,
`name` VARCHAR(50),
`authors` VARCHAR(100),
price FLOAT,
pubdate YEAR,
note VARCHAR(100),
num INT
);
DESC books;SELECT*FROM books;
#3、向books表中添加数据
INSERT INTO books
VALUES(1,'Tal of AAA','Dickes',23,'1995','novel',11),
(2,'EmmaT','Jane lura',35,'1993','joke',22),
(3,'Story of jane','Jane Tim',40,'2001','novel',0),
(4,'Lovey Day','George Byron',20,'2005','novel',30),
(5,'Old land','Honore Blade',30,'2010','law',0),
(6,'The Battle','Upton Sara',30,'1999','medicine',40),
(7,'Rose Hood','Richard haggard',28,'2008','cartoon',28);
SELECT*FROM books;
#4、将小说类型(novel)的书的价格都增加5
UPDATE books
SET price = price+5
WHERE note = 'novel';
SELECT*FROM books;
#5、将名称为EmmaT的书的价格改为40,并将说明改为drama
UPDATE books
SET price = 40,note = 'drama'
WHERE `name` = 'EmmaT';
SELECT*FROM books;
#6、删除库存为0的记录
DELETE FROM books
WHERE num = 0;
SELECT * FROM books;
#补回删掉的两条数据
INSERT INTO books VALUES(3,'Story of jane','Jane Tim',40,'2001','novel',0),(5,'Old land','Honore Blade',30,'2010','law',0);
#7、统计书名中包含a字母的书
SELECT *
FROM books
WHERE `name` LIKE '%a%';
#8、统计书名中包含a字母的书的数量和库存总量
SELECT COUNT(*),SUM(num)
FROM books
WHERE `name` LIKE '%a%';
#9、找出"novel"类型的书,按照价格降序排列
SELECT *
FROM books
WHERE note = 'novel'
ORDER BY price DESC;
#10、查询图书信息,按照库存量降序排列,如果库存量相同的按照note升序排列
SELECT *
FROM books
ORDER BY num DESC,note ASC;
#11、按照note分类统计书的数量
SELECT note,COUNT(*)
FROM books
GROUP BY note;
#12、按照note分类统计书的库存量,显示库存量超过30本的
SELECT note,SUM(num)
FROM books
GROUP BY note
HAVING SUM(num) >= 30;
#13、查询所有图书,每页显示5本,显示第二页
SELECT*FROM books
LIMIT 5,5;
#14、按照note分类统计书的库存量,显示库存量最多的
SELECT note,SUM(num) sum_num
FROM books
GROUP BY note
ORDER BY sum_num DESC
LIMIT 0,1;
#15、查询书名达到10个字符的书,不包括里面的空格
SELECT `name`
FROM books
WHERE CHAR_LENGTH(REPLACE(`name`,' ','')) >= 10;
#16、查询书名和类型,其中note值为novel显示小说,law显示法律,medicine显示医药
#cartoon显示卡通,joke显示笑话
SELECT `name`,note,CASE note WHEN 'novel' THEN '小说'
WHEN 'law' THEN '法律'
WHEN 'medicine' THEN '医药'
WHEN 'cartoon' THEN '卡通'
WHEN 'joke' THEN '搞笑'
ELSE '其他'
END "类型"
FROM books;
#17、查询书名、库存,其中num值超过30本的,显示滞销,大于0并低于10的
#显示畅销,为0则显示需要无货
SELECT `name` AS "书名",num AS "库存",CASE WHEN num >30 THEN '滞销'
WHEN num >0 AND num <10 THEN '畅销'
WHEN num = 0 THEN '无货'
ELSE '正常'
END "显示状态"
FROM books;
#18、统计每一种note的库存量,并合并总量
SELECT IFNULL(note,'合计库存总量') AS note,SUM(num)
FROM books
GROUP BY note WITH ROLLUP;
#19、统计每一种note的数量,并合并总量
SELECT IFNULL(note,'合计库存总量') AS note,COUNT(*)
FROM books
GROUP BY note WITH ROLLUP;
#20、统计库存量前三名的图书
SELECT *
FROM books
ORDER BY num DESC
LIMIT 0,3;
#21、找出最早出版的一本书
SELECT *
FROM books
ORDER BY pubdate ASC
LIMIT 0,1;
#22、找出novel中价格最高的一本书
SELECT *
FROM books
WHERE note = 'novel'
ORDER BY price DESC
LIMIT 0,1;
#23、找出书名中字数最多的一本书,不包含空格
SELECT *
FROM books
ORDER BY CHAR_LENGTH(REPLACE(`name`,' ','')) DESC
LIMIT 0,1;
数据类型概述_字符集设置
MySQL中的数据类型
常见的属性
#MySQL数据类型
#关于属性:character set name
#创建数据库时指明字符集
CREATE DATABASE IF NOT EXISTS dbtest12 CHARACTER SET 'utf8';
USE dbtest12;
SHOW CREATE DATABASE dbtest12;
#创建表的时候,指明表的字符集
CREATE TABLE temp(
id INT
)CHARACTER SET 'utf8';
SHOW CREATE TABLE temp;
#创建表,指明字段时,可以指定字段的字符集
CREATE TABLE temp1(
id INT,
NAME VARCHAR(15) CHARACTER SET 'gbk'
);
SHOW CREATE TABLE temp1;
#没有指明,就向上指明
#字段->表->库->ini配置文件
SHOW VARIABLES LIKE 'character_%';
整型数据类型讲解
类型介绍
整数类型一共有5种,包括TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)和BIGINT
区别如下: