百木园-与人分享,
就是让自己快乐。

day03-MySQL基础知识02

MySQL基础知识02

4.CRUD

数据库CRUD语句:增(create)、删(delete)、改(update)、查(Retrieve)

  1. Insert 语句 (添加数据)
  2. Update 语句(更新数据)
  3. Delete 语句(删除数据)
  4. Select 语句 (查找数据)

指对数据库中表记录的操作(DML 操作)

注意:

alter属于DDL,用来修改基本表,是对表的结构进行操作,比如对字段增加,删除,修改类型;

DML 操例,如update是用来修改表中的数据,修改某一行某一列的值

对行是数据操纵DML(update),对列是数据定义DDL(alter)

4.1Insert语句

  • 使用INSERT 语句向表中插入数据
INSERT INTO tablename [(column [,column ...])]
VALUES 	(value[, value...]);

例子

  1. 创建一商品表goods(id int, goods_name varchar(10),price double);
  2. 添加两条记录
# 练习insert语句
-- 1. 创建一商品表goods(id int, goods_name varchar(10),price double);
CREATE TABLE goods(
	id INT,
	goods_name VARCHAR(10),
	price DOUBLE)
	
-- 2. 添加两条记录
INSERT INTO goods (id,goods_name,price)
	VALUES(10,\'华为手机\',2000);
	
INSERT INTO goods (id,goods_name,price)
	VALUES(20,\'苹果手机\',3000);

SELECT * FROM goods;

image-20221002184244851

  • INSERT语句注意事项

细节说明:

  1. 插入的数据应该与字段的数据类型相同,比如把 \'abc\' 添加到 int 类型会错误

  2. 数据的长度应在列的规定范围之内,例如:不能将一个长度为80的字符串加入到长度为40的列中

  3. 在values中列出的数据位置必须与被加入的列的排列位置对应

  4. 字符和日期型数据应包含在单引号中

  5. 列可以插入空值[前提是该字段允许为空],insert into table value(null)

  6. insert into table_name(列名...) values (),(),() 形式添加多条记录

  7. 如果是给表中的所有字段添加数据,可以不写前面的字段名称

  8. 默认值的使用,当不给某个字段值时,如果有默认值就会添加默认值,否则报错

    如果某个列没有指定not null,那么当添加数据时,没有给定值,则会默认给null

    如果我们希望指定某个默认值,可以在创建表时指定

-- - INSERT语句注意事项
-- 细节说明:
-- 1. 插入的数据应该与字段的数据类型相同
INSERT INTO goods VALUES(\'北京\',\'小米手机\',2000)-- 失败,id对应的列类型是int

-- 2. 数据的长度应在列的规定范围之内,例如:不能将一个长度为80的字符串加入到长度为40的列中
INSERT INTO goods VALUES(40,\'vovo手机vovovovo手机vovovovo手机vovo\',2000)-- 失败

-- 3. 在values中列出的数据位置必须与被加入的列的排列位置对应
INSERT INTO goods (goods_name,id,price)-- 成功,即使改变了列属性的位置,只要值是对应的,就ok
	VALUES(\'vivo手机\',50,1800)


-- 4. 字符和日期型数据应包含在单引号中
INSERT INTO goods VALUES(60,小米手机,2000)-- 失败,字符串应该加上单引号

-- 5. 列可以插入空值[前提是该字段允许为空],insert into table value(null)
INSERT INTO goods (id,goods_name,price)
	VALUES(11,\'boluo手机\',NULL)-- 成功,该字段允许为空

-- 6. insert into table_name(列名...) values (),(),() 形式添加多条记录
INSERT INTO goods VALUES(13,\'三星手机\',2300),(14,\'四星手机\',2300)-- ok

-- 7. 如果是给表中的所有字段添加数据,可以不写前面的字段名称
INSERT INTO goods (id) VALUES(66); -- ok,指定了字段

-- 8. 默认值的使用,当不给某个字段值时,如果有默认值就会添加默认值,否则报错
	-- 如果某个列没有指定not null,那么当添加数据时,没有给定值,则会默认给null
INSERT INTO goods (id,goods_name) 
	VALUES(88,\'格力手机\');-- 这里的price默认设为null
SELECT * FROM goods;
		
-- 如果我们希望指定某个默认值,可以在创建表时指定
-- 例如
CREATE TABLE goods2 (
	id INT ,
	goods_name VARCHAR(10),
	price FLOAT NOT NULL DEFAULT 100);
INSERT INTO goods2 (id,goods_name) VALUES(1,\'大西瓜手机\');
SELECT * FROM goods2;

goods表:

image-20221002214014175

goods2表:

image-20221002214056677

4.2Update语句

  • 语法:
UPDATE tab_name 
	SET col_name1=expr1[, col_name2=expr2...]
	[WHERE where_definition]

例子

要求:在上面创建的epm表中修改表中的记录

  1. 将所有员工的薪水改为5000元
  2. 将姓名为‘小妖怪’的员工薪水改为3000元
  3. 将老妖怪的薪水在原有的基础上加1000元
-- 要求:在上面创建的epm表中修改表中的记录
SELECT * FROM emp

-- 1. 将所有员工的薪水改为5000元
UPDATE emp SET salary = 5000


-- 2. 将姓名为‘小妖怪’的员工薪水改为3000元
UPDATE emp SET salary = 3000 WHERE user_name = \'小妖怪\'

-- 3. 将老妖怪的薪水在原有的基础上加1000元
INSERT INTO emp 
	VALUES(200,\'老妖怪\',\'1990-1-1\',\'2004-4-12 12:22:09\',\'捶背的\',5000,\'给大王捶背\',\'111\')
 
 UPDATE emp 
	SET salary = salary + 1000, job=\'出主意的\'
	WHERE user_name = \'老妖怪\'

image-20221002221709227

  • 使用细节
  1. UPDATE 语法可以用新值更新原有表行中的各列
  2. set子句指示要修改哪些列和要给予哪些值
  3. WHERE子句指定应更新哪些行,如果没有WHERE子句,则更新所有的记录。因此要慎用
  4. 如果需要修改多个字段,可以通过set字段1=值1,字段2=值2...

4.3Delete语句

  • 语法
delete from tbl_name 
		[WHERE where_definition]

例子

-- delete语句演示
-- 删除表中名称为\'老妖怪\'的记录
DELETE FROM emp WHERE user_name =\'老妖怪\'

-- 删除表中所有记录
DELETE FROM emp

SELECT * FROM emp

image-20221002222608594

  • 使用细节
  1. 如果不使用子句,将删除表中所有数据
  2. delete语句不能删除某一列的值(可使用update设为null或者 \'\')
  3. 使用delete语句仅删除记录,不删除表本身。如果要删除表,使用drop 语句:drop table 表名;

4.4Select语句(单表)

4.4.1基本查询

SELECT [DISTINCT] * |{column1,column2,column3..}
	FROM table_name;
  • 注意事项
  1. select指定查询哪些列的数据
  2. column指定列名
  3. *号代表查询所有列
  4. from指定查询哪张表
  5. distinct可选,指显示结果时,是否去掉重复数据

课堂练习

  1. 查询表中所有学生的信息
  2. 查询表中所有学生的姓名对应的英语成绩
  3. 过滤表中的重复数据distinct
  4. 要过滤的记录,每个字段都相同才会去重
CREATE TABLE student (
	id INT NOT NULL DEFAULT 1,
	`name` VARCHAR(20) NOT NULL DEFAULT \'\',
	chinese FLOAT NOT NULL DEFAULT 0.0,
	english FLOAT NOT NULL DEFAULT 0.0,
	math FLOAT NOT NULL DEFAULT 0.0
);

-- 先插入数据
INSERT INTO student(id,`name`,chinese,english,math) 
	VALUES(1,\'张飞\',89,78,90),
		(2,\'宋江\',67,98,56),
		(3,\'关羽\',87,78,77),
		(4,\'赵云\',88,98,90),
		(5,\'欧阳锋\',55,85,45),
		(6,\'黄蓉\',75,65,30),
		(7,\'刘备\',98,57,88)

-- 1. 查询表中所有学生的信息
SELECT * FROM student;
-- 2. 查询表中所有学生的姓名对应的英语成绩
SELECT `name`,english FROM student
-- 3. 过滤表中的重复数据distinct
SELECT DISTINCT english FROM student;
-- 4. 要过滤的记录,(要查询的)每个字段都相同才会去重	

4.4.2使用表达式对查询的列进行运算

SELECT *|{ column1|expression, column2|expression, ...}
	FROM tablename;
  • 在select语句中可使用as语句
SELECT column_name as 别名 from 表名;

练习

  1. 统计每个学生的总分
  2. 给所有学生总分加10分
  3. 使用别名表示学生分数
-- 1. 统计每个学生的总分
SELECT `name`,(chinese+english+math) FROM student;

-- 2. 给所有学生总分加10分
SELECT `name`,(chinese+english+math+10) FROM student;

-- 3. 使用别名表示学生分数
SELECT `name` AS `名字`,(chinese+english+math) AS `total` FROM student;

image-20221003161738587 image-20221003162112889

4.4.3在where子句中经常使用的运算符

使用wher子句进行过滤查询

image-20221003162810869

练习1

-- 1. 查询姓名为赵云的学生的成绩
SELECT * FROM Student 
	WHERE `name` = \'赵云\'
	
-- 2. 查询英语成绩大于90分的同学
SELECT * FROM Student 
	WHERE english > 90
	
-- 3. 查询总分大于200分的所有同学
SELECT * FROM Student 
	WHERE (chinese + english + math) > 200

-- 4. 查询math大于60且id大于4的学生成绩
SELECT * FROM student 
	WHERE math > 60 AND id > 4

-- 5. 查询英语成绩大于语文成绩的同学
SELECT * FROM student 
	WHERE math > chinese

-- 6. 查询总分大于200分的,且数学成绩小于语文成绩的姓宋的同学
-- 宋% 表示名字以宋开头的
SELECT * FROM student 
	WHERE (chinese + english + math) > 200 
	AND math < chinese 
	AND `name` LIKE \'宋%\'

练习2

-- 查询英语成绩分数在80-90之间的同学
SELECT * FROM student
	WHERE english BETWEEN 80 AND 90
	
-- 查询数学成绩分数为89,90,91之间的同学(也可以用or)
SELECT * FROM student
	WHERE math IN(89,90,91)
	
-- 查询所有姓宋的学生的成绩
SELECT * FROM student
	WHERE `name` LIKE \'宋%\'
	
-- 查询数学分数大于80,语文分大于80的同学	
SELECT * FROM student
	WHERE math > 80 AND chinese >80

练习3

-- 查询语文在70到80之间的同学
SELECT * FROM student
	WHERE  chinese <= 80 AND chinese >=70

-- 查询总分为189,190,191的同学
SELECT * FROM student
	WHERE (chinese + english + math) IN (189,190,191)
	
-- 查询所有姓李或姓宋的学生的成绩
SELECT * FROM student
	WHERE `name` LIKE \'宋%\' OR `name` LIKE \'李%\'
	
-- 查询数学比语文多10分的同学
SELECT * FROM student
	WHERE  chinese = math+10

4.4.4使用order by 子句排序查询结果

SELECT column1,column2,column3...
	FROM table;
	order by column asc|desc,...
  1. order by 指定排序的列,排序的列既可以是表中的列名,也可以是select语句后指定的列名
  2. asc升序(默认),desc降序
  3. order by子句应位于select语句的结尾

练习

-- 对数学成绩排序后输出(升序)
SELECT * FROM student
	ORDER BY math
	
-- 对总分按从高到低的顺序输出
SELECT `name`,(chinese + math +english)AS total FROM student
	ORDER BY total descd
	
-- 对姓张的学生成绩排序输出(升序)
INSERT INTO student(id,`name`,chinese,english,math) 
	VALUES(8,\'张三\',65,45,99)
	
SELECT `name`,(chinese + math +english)AS total FROM student
	WHERE `name` LIKE \'张%\'
	ORDER BY total

来源:https://www.cnblogs.com/liyuelian/p/16749704.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » day03-MySQL基础知识02

相关推荐

  • 暂无文章