数据库的CRUD语句
dml:增 删 改
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;