数据库的CRUD语句

发布时间 2023-04-03 20:52:03作者: 一往而深,

Insert语句


values里面的值依次对应各个列

# 创建表goods
CREATE TABLE goods(
	id INT ,
	good_name VARCHAR(10),
	price DOUBLE);
	
# 插入数据
INSERT INTO goods (id ,good_name) -- 该处写上需要添加的字段,不一样都要添加

VALUES (12,'华为');
	

insert的注意事项

# 说明insert语句的细节

-- 已知:
CREATE TABLE goods(
	id INT ,
	good_name VARCHAR(10),
	price DOUBLE);


-- 1.插入的数据应与字段的数据类型相同

INSERT INTO goods(id,good_name,price)
VALUES('abc','小米手机',1000.0);-- 字母字符串不能存进int
# 但是在mysql底层会尝试将数字字符串转为Int

-- 2.数据的长度应该在列规定的范围内

INSERT INTO goods (id,good_name,price)
VALUES(34,'honorhonorhonorhonor',1234.4);-- 超出了列所规定的10个字符

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

INSERT INTO goods (id,good_name,price)-- 这个顺序不一样和列在表中的顺序一致和values中的顺序一致即可
VALUES(21,123.3,'小米');-- 数据和类型不对应

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

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

INSERT INTO goods (id,good_name,price)
VALUES(12,'红米',NULL);-- 没有允许为空则不允许添加

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


INSERT INTO goods (id,good_name,price)
VALUES(5,'海尔',123.45),(6,'三星',17865.9); -- 添加成功

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

INSERT INTO goods 
VALUES (78,'小天才',235.2);-- 给所有的字段添加数据,省略字段名

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

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


INSERT INTO goods(id,good_name)

VALUES(67,'小霸王');-- 此时没有给值的price将会默认给null



SELECT * FROM goods;





update语句(修改表中的数据)

如果where条件不写相当于对表中所有记录进行修改

# 演示update语句(修改下面创建的表的记录)

-- 已知
CREATE TABLE employee(
	id INT,
	`name` VARCHAR(10),-- 名字不确定
	sex CHAR(1),-- 性别只用一个字符即可
	birthday DATE,
	entry_date DATETIME,-- 要求自动更新
	job VARCHAR(20),
	salary DOUBLE,
	`resume` TEXT);-- resume简历 介绍
INSERT INTO t14 VALUES(12,"石文涛","男","2001/4/26","2023/2/1 23:1:23",
"高级程序员","50000.0","是一个很优秀的程序员")	

-- 1.将所有员工的薪水修改为5000 
# [如果没有带有where条件,会修改所有的记录,如果没有该项要求 慎用]

  UPDATE  employee
  SET salary = 5000.0;
-- 2.将石文涛的薪水修改为3000
UPDATE employee 
SET salary = 3000 WHERE  user_name = '石文涛';
  
  -- 3.将石文涛的薪水在原有的基础上增加1000
UPDATE employee 
SET salary = salary +1000
WHERE user_name = '石文涛';  
  

update的使用细节

delete语句(删除表中的数据)

当delete from tab_name[where] 当我们的删除语句没有带wheare时,将会把我们表中的所有记录都删除

# 演示update语句(修改下面创建的表的记录)

-- 已知
CREATE TABLE employee(
	id INT,
	`name` VARCHAR(10),-- 名字不确定
	sex CHAR(1),-- 性别只用一个字符即可
	birthday DATE,
	entry_date DATETIME,-- 要求自动更新
	job VARCHAR(20),
	salary DOUBLE,
	`resume` TEXT);-- resume简历 介绍
INSERT INTO t14 VALUES(12,"石文涛","男","2001/4/26","2023/2/1 23:1:23",
"高级程序员","50000.0","是一个很优秀的程序员")	

-- delete语句测试
INSERT INTO employee VALUES(13,'小妖怪','2021-2-23','2021-2-1 21:12:23','演员',234.9,'优秀的演员',"天才")

# 1.删除表中名字为小妖怪的记录
DELETE  FROM employee

WHERE(user_name = '小妖怪');

# 2.删除表中所有的记录

DELETE FROM employee;-- 将会删除表中所有的记录(一定小心)
**delete的使用细节**





delete的使用细节

不能单独删除某个记录的单个列值,但可以将该个列值设置为null**

感悟:delete是对单个记录使用的,而不能删除单个记录的某个列,仔细想想也不符合实际

select语句1(重要,面试会考)

distinct:取消重复行

-- 创建新的表

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,'韩顺平',23,56,23),
 (2,'天才',56,89,23),(3,'笨蛋',34,12,32),(4,'王者',89,98,97);
 SELECT * FROM student;
 
 -- select语句
 
 -- 1.查询表中所有学生的信息
 SELECT * FROM student;
 -- 2.查询表中所有学生的姓名和对应的英语成绩
 SELECT `name`,english FROM student;-- 只会显示该中所有的name和english信息
 
-- 3.过滤表中重复的数据
-- 注意:查出来的记录,每个字段都相同,才会去重
SELECT DISTINCT math FROM student;-- 本来有2个23,并去重成只保留一条

select2


  • 使用表达式对查询的列进行运算
# select语句的使用

-- 1.统计每个学生的总分

SELECT * FROM student;

-- select `name`,math from student;

SELECT `name`,(chinese+math+english) FROM student;-- 理解成chinese+math+english(并以该表达式作为列名)
-- 形成一个新的列并将计算作为列值
SELECT * FROM student;
-- 2.在所有学生总分加10的情况
SELECT `name`,(chinese+math+english+10) FROM student;

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

select3

  • 该题使用的表的数据

IN(set)set表示一个范围的集合


-- Select语句
-- 1.查询姓名为王者的学生成绩

SELECT * FROM student
WHERE `name` = '王者';
-- 2.查询英语成绩大于90分的同学

SELECT * FROM student 
WHERE english >90;

-- 3.查询总分大于200分的所有同学

SELECT * FROM student
WHERE (english +math +chinese)>200;

课堂练习

-- 1.查询math>20并且id>=3的学生成绩
SELECT * FROM student 
WHERE math>20 AND id >=3;

-- 2.查询英语成绩大于语文成绩的同学
SELECT * FROM student
WHERE english>chinese;
-- 3.查询总分>200并且数学成绩大于语文成绩的姓王的学生
# 王%表示名字以王开头的就可以

SELECT * FROM student
WHERE (english+math+chinese)>200 AND math>chinese AND `name` LIKE '王%';

SELECT * FROM student;


另外2个课堂练习


-- 1.查询英语分数在80-90之间的同学
# between...and...是闭区间
SELECT * FROM student
WHERE english BETWEEN 80 AND 90;
-- 2.查询数学分数为23 32的同学
SELECT * FROM student
WHERE math IN(23,32);
-- 3.查询所有姓王同学的成绩
SELECT * FROM student
WHERE `name` LIKE '王%';
-- 4.查询数学分大于80,语文分>80的同学
SELECT * FROM student
WHERE math>80 AND chinese>80;

-- 1.查询语文成绩在70-80的同学
SELECT * FROM student
WHERE chinese>70 AND chinese <80;
-- 2.查询总分为189,191,190的同学
SELECT * FROM student 
WHERE (chinese+math+english)=189 OR (chinese+math+english)=102;
-- 3.查询所有姓王或姓韩的同学的成绩
SELECT * FROM student
WHERE `name` LIKE '王%' OR `name` LIKE '韩%';

-- 4.查询数学比语文多一样多的同学的成绩
SELECT * FROM student
WHERE math=chinese;


select4

  • 该题使用的表的数据

默认就是asc升序
order子句放在select的最后

-- 演示order by 的使用
-- 1.对数学成绩排序后输出[升序]
SELECT * FROM student 
ORDER BY math ASC;-- 其实默认就是升序,不写也会升序
-- 2.对总分按照从高到底的顺序输出
SELECT `name`,(chinese+english+math) AS total_score  FROM student
ORDER  BY total_score DESC;

-- 3.对姓韩的总分排序输出(升序)
-- 总分没有需要自动合成一个列
SELECT* FROM student;
INSERT INTO student 
VALUES(5,'韩信',56,45,23);
SELECT `name`,(chinese+math+english)AS total_score FROM student 
WHERE `name` LIKE '韩%' ORDER BY total_score ASC;