小白学习之Mysql-day02

  • 觉得通俗易懂的点个赞吧。谢谢了

一、数据库表操作(接昨天)

1、删除表

-- 删除表
DROP TABLE 表名;
-- 删除列
ALTER TABLE 表名 DROP 列名;

2、修改表

语法:

– 修改现有列类型、长度和约束
ALTER TABLE 表名 MODIFY 列名 类型(长度) 约束;
– 修改现有列名称
ALTER TABLE 表名 CHANGE 旧列名 新列名 类型(长度) 约束;
– 修改表名
RENAME TABLE 旧表名 TO 新表名;
– 修改表的字符集
ALTER TABLE 表名 CHARACTER SET 编码表名;
– 删除现有列
ALTER TABLE 表名 DROP 列名;
– 增加列
ALTER TABLE 表名 ADD 列名;

-- 1、增加列
ALTER TABLE student ADD sno VARCHAR(20);

-- 2、修改现有列类型、长度和约束
ALTER TABLE student MODIFY sno CHAR(10) NOT NULL;
DESC student;

-- 3、修改现有列名称
ALTER TABLE student CHANGE sno snum INT;
DESC student;

-- 4、修改表名
RENAME TABLE sudent TO student;

-- 5、修改表的字符集
SHOW CREATE TABLE student;
ALTER TABLE student CHARACTER SET GBK;

-- 6、删除现有列
ALTER TABLE student DROP snum;

3、查看数据表结构

-- 查看表结构
desc 表名; 
-- 查看当前库内所有表名
show tables;
-- 查看建表语句和字符集 
show create table 表名; 

二、表中的数据操作

1、创建数据表

create table student(
	id int primary key auto_increment,
	sage int ,
	sname varchar(32) not null,
	gender varchar(10) not null,
	score double not null,
	birthday date
);

在创建表结构的时候,如果主键是整数类型,那么可以借助mysql的主键自增长策略,在插入的时候可以省略主键的数据。

2、插入表数据

语法:insert into 表名 (列名,列名,列名…) values (值,值,值…);

上述的语法是给表中每列插入数据,需要注意以下问题:

1、插入值类型必须和列类型匹配。

2、值长度不能超过列定义长度。

3、值的顺序和列顺序对应。

4、字符串和日期型值必须写单引号。

5、插入空值可以写null。

  • 如果表的主键是自增的,这时插入的时候,主键可以写null,不是将null存放进主键中,而是让数据库为主键自动增长。
  • 如果列的类型是varchar、char、date、datetime类型需要插入时,使用单引号引用。
-- 插入数据
INSERT INTO student
            (id,
             sage,
             sname,
             gender,
             score,
             birthday)
VALUES (001,12,'李四','男',91.00,1999-04-24);
  • 如果某些列不需要插入数据时,可以在插入的时候省略这些列
INSERT INTO student(sname,gender,score) VALUES('李四','男',91.00);
  • 如果是给表中所有的列添加数据,这时可以省略列名
INSERT INTO student VALUES(NULL,11,'张三','女',79.22,'2011-09-02');
  • 如果使用dos窗口插入数据时,可能会有中文乱码的问题:
    在这里插入图片描述

告诉数据库当前提交的数据,采用的是GBK编码。

为什么会乱码,因为mysql这个mydb2库使用的是utf8编码,而dos窗口使用的是GBK编码,故会错乱。使用set names GBK;将该表的数据库编码临时改为GBK编码,结束窗口时编码自动变回初始的utf8。

通过 show variables like ‘character%’; 插入mysql支持的客户端和服务器的编码。

3、修改表数据

语法:update 表名 set 列名=值,列名=值… where条件语句;

如果没有where条件语句,默认修改所有行数据

-- 修改表数据
-- 不添加条件修改
UPDATE student SET sage=20;

-- 添加条件修改
UPDATE student SET gender = '女',score = 100 WHERE id = 5;

4、删除表数据

语法:delete from 表名 where条件语句 ;

自增主键,表中删除的主键(例如id)不会再被使用。

索引类似于图书馆中找书,具有索引如同拥有了寻找的路线,能够直接去找到该id的值,不用搜索,大大减少时间。

-- 删除表中数据
DELETE FROM student WHERE id = 13;

-- 删除表
DELETE FROM student;

使用delete删除表中所有记录和使用truncate table删除表中所有记录有何不同 ?

truncate 删除数据,过程先将整个表删除,再重新创建 。(使用drop将表删除,再用create重新建一个表)

delete 删除数据,逐行删除记录

truncate 效率要好于 delete

truncate 属于DDL ,delete 属于DML

事务管理只能对DML 有效 ,被事务管理SQL语句可以回滚到SQL执行前状态

5、查询表数据

5.1、基础查询

语法:select [distinct] * | 列名,列名… from 表名;

​ select * from 表名; 查询该表中所有列信息

​ select 列名,列名… from 表名; 查询表中指定列的信息

-- 查询操作

-- 查询表中所有数据
SELECT * FROM student;

-- 添加条件查询
SELECT * FROM student WHERE id = 1;

-- 根据姓名查询
SELECT * FROM student WHERE sname = '唐四';

-- 查询姓名和成绩
SELECT sname,score FROM student;
  • 使用distinct去重
-- 使用distinct去重
SELECT DISTINCT score FROM student;
-- 某一行没有重复数据
SELECT DISTINCT * FROM student;
  • 查询操作对结果做运算
-- 查询的成绩加10分
SELECT DISTINCT score + 10 FROM student;
ALTER TABLE student MODIFY score NUMERIC(10,2);
SELECT DISTINCT score + 10 FROM student;

这里仅仅是在查询的成绩上加了10分,而数据表中的成绩是没有变化的。

可能会出现小数精度问题(计算中所有小数都是近似值)。

如果数据库中需要小数精确值,列的类型可以使用dcimal(M,D),numeric(M,D):M表示数字的个数,D表示小数位数。

  • 查询的别名使用

    别名中,as可以省略。

-- 给查询列或表使用别名
SELECT score AS 成绩 FROM student;

-- 别名的面试题
-- 查询sage和score两列的数据
SELECT sage,score FROM student;
-- 查询sage的数据,并将sage的别名取为score
SELECT sage score FROM student;

5.2、and、or、null使用

-- 查询成绩在80~100的学生
SELECT * FROM student WHERE score>=80 AND score<=100;
SELECT * FROM student WHERE score>=80 && score<=100;
SELECT * FROM student WHERE score BETWEEN 80 AND 100;

-- 查询性别为男,或者成绩大于80的学生
SELECT * FROM student WHERE gender = '男' || score > 80; 

-- 查询年龄为null的同学
SELECT * FROM student WHERE sage IS NULL;
SELECT * FROM student WHERE sage IS NOT NULL;

5.3、列表in的使用

in(值,值,值) 在指定值中任取一个 in(70,80,90) 值可以是70、80或者90

-- in的用法
-- 查询年龄为23和25的学生
SELECT * FROM stu2 WHERE sage = 23 OR sage = 25;
SELECT * FROM stu2 WHERE sage IN(23,25)

5.4、模糊条件的使用

语法:select 列名,列名,列名,列名…from 表名 where 列名 like 值

模糊查询的like关键字后面的值书写有两种情况:

  • %:匹配任意个字符
  • _:匹配一个位置
-- 模糊查询
-- 查询所有姓张的学生数据
SELECT * FROM student WHERE sname LIKE '张%';
-- 查询名字是两个的学生数据
SELECT * FROM student WHERE sname LIKE '__';
-- 查询姓名中包含张的学生数据
SELECT * FROM student WHERE sname LIKE '%张%'

5.5、排序查询

语法:select * from 表名 order by 列名 asc|desc ;

asc是升序排列,desc是降序排列

-- 排序查询
-- 按年龄升序查询
SELECT * FROM student ORDER BY sage ASC;
-- 查询所有的学生数据,按照年龄升序,年龄相同,成绩降序
SELECT * FROM student ORDER BY sage ASC,score DESC;
-- 查询年龄大于15小于25的升序,先执行条件过滤,再执行排序
SELECT * FROM student WHERE sage>15 AND sage<25 ORDER BY sage ASC;

6、分组

分组:是对数据表中的数据按照一定规律进行划分档次,同一档次的为一组。

聚集函数:也成为分组函数,主要是指SQL语句中的内置函数。用于分组统计。

6.1、count函数

语法:select count(*)|count(列名) from 表名;

count:统计符合条件的数据个数。

-- 统计学生的个数
SELECT COUNT(*) FROM student;
SELECT COUNT(id) FROM student;

count函数在使用的时候,传递参数不同:

count(*):在统计的时候,如果这列值为null,找本列后面的一列,如果当前一行都是null,不统计。

count(主键):只能统计主键这列,由于主键唯一并不为null,统计整个表中的记录数。

count(列名):统计指定的那列的数据个数,如果有null,不统计。

6.2、sum函数

统计某一列数据的和

语法:select sum(列名) from 表名;

-- 统计成绩的总和
SELECT SUM(score) FROM student;
-- 分别统计年龄和成绩的和
SELECT SUM(sage),SUM(score) FROM student;
-- 统计年龄和成绩和值(正确写法)
SELECT SUM(sage)+SUM(score) FROM student;

在mysql中所有的null与其他数据运算的结果还是一个null,导致有同学的成绩没有加到总和中。

在mysql中有ifnull函数可以判断某列是否为null,当为null时,可以给这里设置一个值。

上述的ifnull(sage,0) 意思就是当某个学生的sage为null时,给其设置值为零。

-- 统计年龄和成绩和值(错误写法)
SELECT SUM(sage+score) FROM student;

SELECT SUM(IFNULL(sage,0)+IFNULL(score,0)) FROM student;

6.3、max、min函数

-- 求最大、最小值
SELECT MAX(sage),MIN(score) FROM student;

6.4、avg函数

-- 求平均值
SELECT AVG(score) AS 平均值 FROM student;
SELECT SUM(score)/COUNT(id) AS 平均值 FROM student;

6.5、group by分组函数

-- 查询购买了几类商品,并且每类总价大于100的商品
-- 聚集(分组)函数即sum,count等函数,不能使用在where的条件中,必须使用having关键字代替where
-- select count(product) from orders GROUP BY product where sum(price)> 100;
SELECT product,COUNT(product),SUM(price) FROM orders GROUP BY product HAVING SUM(price)>100;
-- 分组,过滤,排序
SELECT product,COUNT(product) FROM orders GROUP BY product HAVING SUM(price)> 100 ORDER BY product DESC;
  • having关键字和where关键字作用是一致的,都可以对查询的数据进行过滤,区别在于having关键字后面的过滤条件中可以使用聚集(分组)函数即sum,count等函数。

  • where 和 having 条件语句的区别 ?

​ where 是在分组前进行条件过滤,having 是在分组后进行条件过滤 ,使用where地方都可以用 having替换 , 但是having后可以使用分组函数,而where后不可以用分组函数 。

三、数据库备份和恢复

1、备份数据

在mysql的安装目录的bin目录下有mysqldump命令,可以完成对数据库的备份。
语法:mysqldump -u 用户名 -p 数据库名 > 磁盘SQL文件路径 由于mysqldump命令不是sql命令,需要在dos窗口下使用。

演示:
1、重新开启一个新的dos窗口。

2、导出数据。

在这里插入图片描述

2、恢复

通过上面的命令备份的数据,导出库中的所有数据,但是没有创建库的语句。因此在恢复的时候,需要 手动创建库。

在这里插入图片描述
恢复数据库:

在这里插入图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值