Mysql基础篇(创建、管理、增删改表)-1
https://developer.aliyun.com/article/1425784
数据处理之增删改
插入数据
VALUES的方式添加
情况1:为表的所有字段按默认顺序插入数据
不指定字段名,按照默认字段的默认顺序进行添加
INSERT INTO 表名 VALUES (value1,value2,....); INSERT INTO departments VALUES (70, 'Pub', 100, 1700);
情况2:为表的指定字段插入数据
INSERT INTO 表名(column1 [, column2, …, columnn]) VALUES (value1 [,value2, …, valuen]); INSERT INTO departments(department_id, department_name) VALUES (80, 'IT')
情况3:同时插入多条记录
INSERT INTO table_name VALUES (value1 [,value2, …, valuen]), (value1 [,value2, …, valuen]), …… (value1 [,value2, …, valuen]); 或者如下: INSERT INTO table_name(column1 [, column2, …, columnn]) VALUES (value1 [,value2, …, valuen]), (value1 [,value2, …, valuen]), …… (value1 [,value2, …, valuen]); 示例如下: mysql> INSERT INTO emp(emp_id,emp_name) -> VALUES (1001,'shkstart'), -> (1002,'atguigu'), -> (1003,'Tom'); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0
使用INSERT同时插入多条记录时,MySQL会返回一些在执行单行插入时没有的额外信息,这些信息的含 义如下:
- Records:表明插入的记录条数。
- Duplicates:表明插入时被忽略的记录,原因可能是这 些记录包含了重复的主键值。
- Warnings:表明有问题的数据值,例如发生数据类型转换。
一个同时插入多行记录的INSERT语句等同于多个单行插入的INSERT语句,但是多行的INSERT语句 在处理过程中 效率更高 。因为MySQL执行单条INSERT语句插入多行数据比使用多条INSERT语句 快,所以在插入多条记录时最好选择使用单条INSERT语句的方式插入。
小结
- VALUES 也可以写成 VALUE ,但是VALUES是标准写法。
- 字符和日期型数据应包含在单引号中。
将查询结果插入到表中
INSERT INTO 目标表名 (tar_column1 [, tar_column2, …, tar_columnn]) SELECT (src_column1 [, src_column2, …, src_columnn]) FROM 源表名 [WHERE condition]
- 在 INSERT 语句中加入子查询。
- 不必书写 VALUES 子句。
- 子查询中的值列表应与 INSERT 子句中的列名对应。
例子:
INSERT INTO dept80 ( employee_id, last_name, ANNSAL, hire_date ) SELECT employee_id, last_name, ANNSAL, hire_date FROM dept100;
更新数据
UPDATE table_name SET column1=value1, column2=value2, … , column=valuen [WHERE condition]
- 可以一次更新多条数据。
- 如果需要回滚数据,需要保证在DML前,进行设置:SET AUTOCOMMIT = FALSE;
- 使用 WHERE 子句指定需要更新的数据。
UPDATE employees SET department_id = 70 WHERE employee_id = 113;
- 如果省略 WHERE 子句,则表中的所有数据都将被更新
删除数据
使用 DELETE 语句从表中删除数据
DELETE FROM table_name [WHERE <condition>];
使用 WHERE 子句删除指定的记录
DELETE FROM departments WHERE department_name = 'Finance';
如果省略 WHERE 子句,则表中的全部数据将被删除
MySQL8新特性:计算列
什么叫计算列呢?简单来说就是某一列的值是通过别的列计算得来的。
例如,a列值为1、b列值为2,c列 不需要手动插入,定义a+b的结果为c的值,那么c就是计算列,是通过别的列计算得来的。
在MySQL 8.0中,CREATE TABLE 和 ALTER TABLE 中都支持增加计算列。
CREATE TABLE tb1( id INT, a INT, b INT, c INT GENERATED ALWAYS AS (a + b) VIRTUAL ); INSERT INTO tb1(a,b) VALUES (100,200); mysql> SELECT * FROM tb1; +------+------+------+------+ | id | a | b | c | +------+------+------+------+ | NULL | 100 | 200 | 300 | +------+------+------+------+ 1 row in set (0.00 sec)
练习
当需要对数据库数据进行分类统计的时候,往往会用上groupby进行分组。
而在groupby后面还可以加入withcube和withrollup等关键字对数据进行汇总。
建表加数据
CREATE TABLE books ( id INT, NAME VARCHAR ( 50 ), AUTHORS VARCHAR ( 100 ), price FLOAT, pubdate YEAR, note VARCHAR ( 100 ), num INT ) INSERT INTO books ( id, NAME, `authors`, price, pubdate, note, num ) VALUES ( 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 );
1.查询书名达到10个字符的书,不包括里面的空格
CHAR_LENGTH(str) 返回以字符来测量字符串str的长度。
REPLACE ()三个参数,第一个为字段,第二个为被替换的字符,第三个为替换的字符
update
article
set name=replace(name,’ ‘,’');
SELECT * FROM books WHERE CHAR_LENGTH( REPLACE ( NAME, ' ', '' ))>= 10;
2.按照note分类统计书的库存量,显示库存量最多的
SELECT note, SUM(num) FROM books GROUP BY note ORDER BY num DESC LIMIT 0,1
3.查询书名和类型, 其中note值为 novel显示小说,law显示法律,medicine显示医药,cartoon显示卡通,joke显示笑话
SELECT NAME AS "书名", note, CASE note WHEN 'novel' THEN '小说' WHEN 'law' THEN '法律' WHEN 'medicine' THEN '卡通' END '类型' FROM books;
4.查询书名、库存,其中num值超过30本的,显示滞销,大于0并低于10的,显示畅销,为0的显示需要无货
SELECT name,num,CASE WHEN num>30 THEN '滞销' WHEN num>0 AND num<10 THEN '畅销' WHEN num=0 THEN '无货' ELSE '正常' END AS "库存状态" FROM books;
统计每一种note的库存量,并合计总量
当需要对数据库数据进行分类统计的时候,往往会用上groupby进行分组。而在groupby后面还可以加入withcube和withrollup等关键字对数据进行汇总。
IFNULL 函数是MySQL控制流函数之一,它接受两个参数,如果不是 NULL ,则返回第一个参数。. 否则, IFNULL 函数返回第二个参数。
SELECT IFNULL( note, '合计总库存量' ) AS note, SUM( num ) FROM books GROUP BY note WITH ROLLUP;
对WITH ROLLUP的理解:
不加如下:
加了: