Day2 MySQL修改语句

本文介绍了数据库初识,包括如何设计表格、ER图的构造(实体、属性和关系),以及EER图的正反向工程。涵盖了描述与推断统计、SQL查询基础和MySQL操作实例,如数据获取、过滤、聚合和基本SQL语句应用。
Day2_数据库初认识

设计表

  1. ER图 (Entity Relationship Diagram)

    • 实体:矩形框 ->表
    • 属性:椭圆框 ->列(字段,属性,特征)
    • 关系:菱形框 ->中间表
    • 重数:一对一(1:1),多对多(m:n),一对多(1:n)
  2. EER图(Extended ER图)

    • 正向工程:先设计EER图,然后根据EER图生成数据库和表.
    • 反向工程:用设计好的数据库和表生成EER图.
    • regular expression ->regexp
  3. 统计学:

    • 描述型统计:能拿到全量数据

      集中趋势:均值,中位数,众数

      离散趋势:极差(ptp) ,方差,标准差

      相关性:协方差,相关系数(spearman,pearson,kindall)

    • 推断型统计:

      t检验和F检验:样本的均值和方差能不能代表总体的均值和方差

      方差分析:检查数据的改变是否是随机波动造成的,是否具体显著性

  4. SQL中获取数据的描述统计信息的函数

    • sum /avg /min /max /count /stddev /variance
  5. SQL 读操作格式:

    select ..., ..., ...
    from ..., ...
    where ... and ... or ...
    group by ..., ...
    having ...
    order by ... asc, ... desc
    

常用MySQL查询语句

-- 查询所有学生所有信息
select * from tb_student; 
select stu_id,stu_sex,stu_name,stu_birth,stu_addr from tb_student;  -- 推荐这种

-- 查询所有课程名称及学分(投影和别名)
select cou_name ,cou_credit from tb_course;

-- 查询所有女学生的姓名和出生日期(筛选)
select stu_name as 姓名,stu_birth as 出生日期 from tb_student where stu_sex = 0;

-- 查询所有80后女学生的姓名、性别和出生日期(筛选)
select stu_name as 姓名 ,stu_sex as 性别,stu_birth as 出身日期 from tb_student
where stu_birth between '1980-1-1' and '1989-12-31' and stu_sex = 0; 

-- 查询所有80后或者女学生的姓名、性别和出生日期(筛选)
select 
	stu_name as 姓名,
	case stu_sex when 1 then '男' else '女' end as 性别 ,
	stu_birth as 出生日期
from tb_student where stu_birth between '1980-1-1' and '1989-12-31' or stu_sex = 0;

-- MySQL方言 (因为其他的数据库可能没有if函数)
-- 例如:Oracle中做同样事情的函数叫做decode
select 
	stu_name as 姓名,
	if (stu_sex,'男','女') as 性别,
	stu_birth as 出生日期
from tb_student where stu_birth between '1980-1-1' and '1989-12-31' or stu_sex = 0;

-- 查询姓”杨“的学生姓名和性别(模糊)
-- 在SQL中通配符%可以匹配零个或者任意多个字符;
-- 在SQL中通配符_可以匹配一个字符
select stu_name ,stu_sex from tb_student where stu_name like '杨_'; -- 查询'杨X'
select stu_name ,stu_sex from tb_student where stu_name like '杨%'; -- 查询'杨','杨X',...

-- 前面带%的模糊查询性能基本上都是很差的,则会使用正则表达式查询
select stu_name ,stu_sex from tb_student where stu_name regexp '^杨.{1,2}$';

-- 查询没有录入家庭住址的学生姓名(空值)
-- null作任何运算结果也是产生null,null是相当于是条件不成立
select stu_name from tb_student where stu_addr is null;

-- 查询录入了家庭住址的学生姓名(空值)
select stu_name from tb_student where stu_addr is not null;

-- 查询学生的家庭住址(去重)
select distinct stu_addr from tb_student where stu_addr is not null;

-- 查询男学生的姓名和生日按年龄从大到小排列(排序) 
-- asc - 升序, desc - 降序
select stu_name,stu_birth from tb_student where stu_sex = 1 order by stu_birth asc;
select stu_name ,stu_birth from tb_student where stu_sex =1 order by stu_birth desc;

-- 查询年龄最大的学生的出生日期和年龄(聚合函数) -- 找出最小的生日
-- select now() -当前时间;select curdate() - 当前日期;
select 
	min(stu_birth) as 出生日期,
	floor((datediff(curdate(),min(stu_birth))/365)) as 年龄
from tb_student;

-- 查询年龄最小的学生的出生日期和年龄(聚合函数)
select 
	max(stu_birth) as 出生日期,
	floor((datediff(curdate(),max(stu_birth))/365)) as 年龄
from tb_student;

-- 查询所有学生的所有考试的平均成绩
-- 聚合函数在遇到null会自动忽略
-- 如果做计数操作,建议使用count(*) 
select avg(score) as 平均分 from tb_record;
 
-- 查询课程号为1111的课程的平均分
select avg(score) as 平均分 from tb_record where cid = 1111;

-- 查询学号为1001的学生所有课程的平均分
select avg(score) as 平均分 from tb_record where sid =1001;

-- 查询男女学生的人数(分组和聚合函数) 
-- SAC (Split - Aggregate - Combine)
select 
	if (stu_sex,'男','女') as 性别, 
	count(*) as 人数
from tb_student group by stu_sex;

-- 查询每个学生的学号和平均成绩(分组和聚合函数)
select 
	sid as 学号,
	round(avg(score)) as 平均成绩
from tb_record group by sid;
-- 查询平均成绩大于等于90分的学生的学号和平均成绩
-- 分组之前的筛选用where子句,分组之后的筛选用having子句
select 
	sid as 学号,
	round(avg(score)) as 平均成绩
from tb_record group by sid having 平均成绩>=90;

MySQL常用操作语句

-- 插入学生数据
insert into `tb_student` 
    (`stu_id`, `stu_name`, `stu_sex`, `stu_birth`, `stu_addr`, `col_id`) 
values
    (1001, '杨过', 1, '1990-3-4', '湖南长沙', 1),
    (1002, '任我行', 1, '1992-2-2', '湖南长沙', 1),
    (1033, '王语嫣', 0, '1989-12-3', '四川成都', 1)
-- 更新数据
update tb_student set stu_name = '杨过' where stu_id =1001;
-- 删除数据
delete from tb_student stu_id =1001;
<think>好的,我现在需要帮助用户解决在MySQL中更新数据的SQL语法问题。首先,我得回想一下用户的具体需求:他们想了解如何编写更新数据的SQL语句,并且需要示例。根据用户提供的引用内容,特别是引用[2]和引用[4],可能涉及到基本的UPDATE语句以及一些高级用法,比如ON DUPLICATE KEY UPDATE。 首先,我应该先介绍最基础的UPDATE语法结构。用户可能刚开始学习MySQL,所以需要从简单的地方开始。基本语法包括UPDATE、SET和WHERE子句。这部分要详细说明每个部分的作用,比如SET后面跟要修改的列和值,WHERE用来指定条件,避免全表更新。 然后,用户可能对条件更新感兴趣,这时候需要提到WHERE子句的使用,并举一个例子,比如更新特定ID的记录。引用[4]中提到了使用CASE语句进行条件更新,这也需要包含进来,展示如何根据不同的条件设置不同的值。比如根据订单金额调整积分,这样的例子比较实用,容易理解。 接下来,用户可能需要批量更新多条记录的情况。这时候可以使用WHERE子句结合IN关键字,或者使用JOIN来关联其他表进行更新。例如,引用[4]中的案例提到给有订单记录的客户增加积分,这里可能需要关联orders表和customers表,展示如何通过JOIN来批量更新。 然后,引用[2]中提到的ON DUPLICATE KEY UPDATE也是一个重要点,虽然主要用于插入时更新,但用户的问题是关于更新数据,但可能他们也有插入或更新的需求。因此需要简要提及这个语法,并说明它与UPDATE的区别,同时给出示例。 还需要注意用户提到的其他引用内容,比如引用[3]中的DATE_ADD函数,可能在更新日期字段时会用到,所以举一个使用函数的例子,比如更新用户的过期时间,增加天数,这样能展示如何在SET子句中使用函数。 另外,要提醒用户注意事项,比如使用WHERE子句避免全表更新,事务的使用,以及备份数据的重要性。这些是实际应用中容易出错的地方,用户可能会忽略,所以需要强调。 最后,根据用户的要求生成相关问题,这些问题应该围绕MySQL的更新操作展开,涵盖基本语法、条件更新、批量处理、高级功能等,帮助用户进一步学习。 在组织回答时,结构要清晰,分点说明,每个部分都给出示例代码,并正确使用LaTeX格式。同时,引用相关的资料,比如在讲解ON DUPLICATE KEY UPDATE时引用[2],使用CASE语句时引用[4],确保信息的准确性。 现在需要检查是否有遗漏的部分,比如是否覆盖了用户可能关心的所有更新场景,是否示例足够清晰,语法是否正确。确保所有SQL关键字大写,表名和列名符合常规命名规范,示例贴近实际应用,帮助用户更好地理解和应用。</think>### MySQL 更新数据 SQL 语法详解 #### 1. 基础语法 使用 `UPDATE` 语句修改表中现有数据,语法结构为: ```sql UPDATE 表名 SET 列1=值1, 列2=值2... WHERE 条件; ``` * **SET**:指定要修改的列及其新值 * **WHERE**:限定更新范围(若省略会更新全表)[^2] #### 2. 条件更新示例 ```sql -- 将用户ID=5的姓名改为"张三" UPDATE users SET name='张三', age=30 WHERE user_id=5; ``` #### 3. 批量更新 ```sql -- 批量修改北京用户的积分 UPDATE customers SET points=points+100 WHERE city='北京'; -- 使用IN关键字更新多个条件 UPDATE products SET stock=0 WHERE product_id IN (101,205,309); ``` #### 4. 关联表更新 通过 `JOIN` 实现跨表更新(引用自积分更新案例[^4]): ```sql UPDATE customers c JOIN orders o ON c.customer_id = o.customer_id SET c.points = c.points + 100; ``` #### 5. 条件分支更新 使用 `CASE` 语句实现差异化更新(引用自条件更新案例[^4]): ```sql UPDATE orders SET status = CASE WHEN amount > 1000 THEN 'VIP' WHEN amount > 500 THEN 'Standard' ELSE 'Basic' END; ``` #### 6. 函数应用示例 结合日期函数修改数据(引用自日期处理案例[^3]): ```sql UPDATE subscriptions SET expire_date = DATE_ADD(expire_date, INTERVAL 30 DAY) WHERE user_type='premium'; ``` #### 7. 插入或更新 使用 `ON DUPLICATE KEY UPDATE` 实现存在则更新(引用自插入更新方案[^2]): ```sql INSERT INTO users (id, name) VALUES (1,'李四') ON DUPLICATE KEY UPDATE name='李四'; ``` ### 注意事项 1. **WHERE子句必查**:无WHERE条件会导致全表更新 2. **事务控制**:建议使用 `BEGIN;` 和 `COMMIT;` 包裹高风险操作 3. **数据备份**:执行前建议使用 `SELECT` 验证条件范围 4. **性能优化**:批量更新超过1万条时建议分批次处理
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值