ubuntu上mysql的使用。数据库和表的创建与删除,表的字段修改,表中插入数据,order by排序,group by分组、分页,聚合函数、条件查询、模糊查询、多表连接,子查询,数据库备份与还原。

【无标题】ubuntu外国源换清华源。ubuntu上安装mysql,解决不知道mysql初始密码问题。在ubuntu上更改mysql的root用户的密码。-CSDN博客navicat for mysql远程连接ubuntu上的mysql。2003-Can’t ...(10038)、1251-client does....错误的解决。-CSDN博客

本文介绍如何在ubuntu上对mysql数据库进行增删改查,对数据表、单表、多表进行操作。如果对如何安装mysql,以及相关配置有问题请参考上面两篇文章。

本章将详细的全步骤介绍mysql的各种命令和操作。

目录

一、数据库的创建

二、表的创建

三、对表中字段进行操作

四、表的简单查询插入操作

五、条件查询,可以跟随一起操作看看结果是否相同。

六、模糊查询

七、排序order by

八、聚合函数,这里不做演示接下来用到的地方会直接使用

九、分组与分页

十、多表连接

十一、子查询

​十二、合并查询

十三、保存查询结果

十四、备份数据库

十五、数据库恢复



一、数据库的创建

1、我们先切换到root用户,这样可以你面后续的权限问题,ubuntu默认是不用root登录的,提示输入密码后直接输入,这里是不在界面上显示的,输入完直接回车就行。

su root

2、我们登录mysql

mysql -uroot -p000000

3、对下面的命令进行测试,查看是数据库的版本,当前系统时间,以及现在mysql中含有几个数据库文件。

#查看数据库版本
select version();
#显示当前时间
select now();
#查看所有数据库
show databases;

4、我们新建一个库。

#创建一个新的数据库
create database 数据库名 charset='utf8';
# 这里创建一个名字为students的数据库,编码格式为utf8
create database studb charset='utf8';

4、我们跳转到该库,并查看此时所处的位置。

use studb;
#查看当前在哪个数据库,使用该函数
select database();

5、删除数据库命令如下这里不做演示:drop database 数据库名;

#删除数据库
#drop database 数据库名;
drop database studb;

6、查看数据库中的表:show tables;此时因为我们还没有创建表,所以为空。

#查看当前数据库中的表
show tables;

二、表的创建

1、我们接下来要创建一个学生表用来存储学生的个人信息。包括学生的id、姓名、年龄、性别、家乡等字段。对此,我们要了解一下数据库表的基本知识:

#数据表设计包括er图、主键、字段、数据类型、约束、表之间的关系。
#ER模型实体-关系模型,由实体、属性、关系组成。

#主键 primary key
1、要求表的每一行记录都必须是唯一的,同一张表不允许出现完全相同的两条记录。
2、为了保证记录的唯一性,使用主键。
3、主键特征:表的主键可以由一个或多个字段组成(复合主键),数据库表中的主键的值具有唯一性且不能为NULL,当主键由多个字段构成的时候,每个字段的值不能取NULL值。

#实体间的关系-外键foreign key
实体间的关系通过外键来表示,如果表A中的一个字段a对应表B的主键b,则称字段a为表A的外键。此时存储在表A中的字段a的值,同时这个字段值也是表B主键b的值。

#约束constraint
是定义在表上的一种强制规则,当为某个表定义约束后,对该表做的所有SQl操作都必须满足约束的规则要求,否则操作将失败。
NOT NULL :非空约束,指定某列所有行数据不能包含空值
UNIQUE: 唯一性约束,指定列或者列的组合的所有行数据必唯一
PRIMARY KEY  主键约束 在列上以及引用列上建立一种强制依赖关系
FOREIGN KEY 两个表 外键约束 在列上以及引用列上建立一种强制依赖关系
CHECK 检查性约束,从列上指定一个必须满足的条件

2、表的创建和删除的命令如下

#创建学生表
#comment注释,可以给字段添加注释
create table students(
id int auto_increment primary key not null comment '主键',
name varchar(10) not null,
gender bit(1) default 0,
age int ,
hometown varchar(40) default ""
)
#查看所有表
show tables;
# 查看创建表的SQl语句
show create table 表名;
#查看表的结构
desc student;

3、删除表的命令如下,这里不做演示

#drop table 表名;
drop table students;

三、对表中字段进行操作

1、增加或删除字段

#添加字段
#alter table 表名 add 列名 类型;
#给students添加一个生日字段
alter table students add birthday date;
#显示表结构
desc student;



#删除字段
#alter table 表名 drop 字段名字;
#删除表student中的gender字段
alter table students drop birthday;
#显示表结构
desc student;

增加字段,增加了birthday字段

删除字段,此时birthday字段被删除了

2、修改字段分为两种,一是不修改字段名只修改其属性,另一种是都修改。

#修改字段

#1、不修改字段名,只修改字段的类型和约束
#alter table 表名 modify 列名 类型和约束;
alter table students modify hometown varchar(45) default "河北";


#2、需要修改字段名字的
#alter table 表名 change 原名 新名 类型以及约束;
alter table students change hometown address varchar(40) default NULL;

把hometown改为了address

四、表的简单查询插入操作

1、简单的查询语句,此时表中还没有数据所以查询结果为空。

# 查询
select * from students; # 查询表students中的所有数据
select id,name from students;

2、表中插入数据操作

#全列插入,有多少个字段就插入多少个字段,相当于新增了一个记录
# insert into 表名 values(......)
insert into students values (0,"韩信",0,17,"广州");

# 部分插入需要指定字段名
insert into 表名 (字段1,字段2) values(值1,值2);
insert into students (id,name,gender,age) values(0,"李白",0,19);

# insert into 表名 values (......),(......),(......)
insert into students values (0,"杜甫",0,90,"北京"),(0,"刘备",0,90,"荆州"),(0,"关羽",0,80,"东北"),(0,"百里守约",0,15,"新疆");

# 部分列多行插入
# insert into 表名 (字段1,字段2) values (......),(......);
insert into students (id,name,gender,age) values (0,"王昭君",1,18),(0,"杨玉环",1,18);

3、修改字段值

# 修改某个字段的值
update students set address = '成都' where id=7;

五、条件查询,可以跟随一起操作看看结果是否相同。

# 查询id大于13的数据
select * from students where id>3;
select name from students where id>3;
# > , < , <= , >= , !=或者<>
# select name from students where address!='成都';
select name from students where not address='成都';
# where 字段名 between 值 and 值;
# update students set address='香港' where id between 5 and 9;
select name from students where address!='东北' and gender=0;
select name from students where address!='北京' or gender=0;
# 删除id=3.
delete from students where id=3;

六、模糊查询

# like 表示模糊查询
# %表示任意多字符
# _ 表示一个字符
# rlike可以匹配正则
# in 包含在里面的
# 如果匹配%自身,需要用%%
select name from students where not address like'%州';
select name from students where not address like '%州';
select name from students where not address rlike '.*州';
select name from students where id in (2,7,4);
# 当以字段的值是NULL是,我们不可以用 字段名=NULL 的方式来取,NULL表示为空,应该使用is。
# 字段名 is NULL
select name from students where address is null;

 

七、排序order by

# order by 字段 [desc/asc]
# desc 表示降序(从小到大排序)
# asc 默认排序规则,表示升序(从小到大排序)
# 按照id从大到小排序
select * from students order by id desc;
 # 按照汉字首字母排序
select * from students order by address desc;
# 先按id降序排,如果有相同的id再按照汉字升序排。当有第一个排序无法解决的排序时用第二个。
select * from students order by id desc , address desc; 

八、聚合函数,这里不做演示接下来用到的地方会直接使用

#count() 统计行数    
#max() 计算最大值
#min()
#数学函数 
#mod(N,M)% 取模
select mod(234,10);
#floor(x) 向下取整
select floor(1.23);
#ceiling(X)向上取整
select ceiling(1.23);
#round(X,D)四舍五入到最近整数,D表示保留几位
select round(1.298,1);
#sum()
#avg()
select avg(id) from students;
#round()
select round(avg(id),1) from students;

# 时间函数
select select now(); #显示当前日期以及时间
select curdate();# 显示当前日期
select curtime(); # 显示当前时间
#substr()函数
select substr(string,start,length); #mysql的start是从1开始的,用来截取字符串
select substr("this is a boy",5,3);
select left(str,len); #返回字符串str最左边len个字符
select left("小楼昨夜又东风",3);
select right(str,len); #返回字符串str最右面len个字符
# 看一下当前表中有多少个数据
select count(*) from students;
select max(id) from students;
select min(id) from students;

九、分组与分页

# group by 字段   以字段作为分组依据
# 分组后分组依据会显示在结果集,其他列不会出现。
# 比如统计男生女生分别有多少人
select gender,count(*) from students group by gender;

# as 取别名
select gender,count(*) as '人数' from students group by gender;
select gender as "性别",count(*) as '人数' from students group by gender;

#分组后进行筛选,此时不能使用where, 而是应该使用一个新的having函数。
select gender as "性别",count(*) as '人数' from students group by gender having gender=0;
# where与having的区别
where 用于from之后的条件过滤
having用于分组之后的过滤 功能相同,位置不同。

# limit分页
# 如果数据量很大的话,一次性把所有数据查询出来不方便看,而且耗费带宽,所以用到了分页功能,一次只查询一页的数据。
#start表示从第几条数据开始,count表示获取几条数据。
#select * from students limit start,count;
#查询前三名同学信息
select * from students limit 0,3; 
#每页显示三条数据,要求获取第三条数据。

十、多表连接

我们创建一个班级class表,表中含有id 、name、class_hour 字段,同时给表student田间class_id字段。

#创建班级表
create table class( id int auto_increment primary key not null, name varchar(10) not null, class_hour int default 30);
# 表中写入数据
insert into class values (0,"python",40),(0,"c++",50),(0,"java",45);

alter table students add class_id int default null;
update students set class_id=2 where id>=5;
update students set class_id=1 where id<5;

内连接、右连接、左连接

# 内连接:查询结果为两个表匹配到的数据,两个表都能匹配上的数据将返回给结果集。
# select * from 表1 inner join 表2 on 表1.列=表2.列;
# 使用内连接查询学生表和班级表
select * from students inner join class on students.class_id=class.id;
# 表名过长可以用as取别名
select b1.name,address,b2.name from students as b1 inner join class as b2 on b1.class_id=b2.id;
select b1.name as 姓名,address as 家乡,b2.name as 课程 from students as b1 inner join class as b2 on b1.class_id=b2.id;
# 右连接,右表全显示
# 查询到结果为两个表匹配的数据,右表特有的数据,对于左表中不存在的数据使用null填充
select * from 表1 right join 表2 on 表1.列=表2.列;
select * from students right join class on students.class_id=class.id;
# 左连接,类比右连接
select * from 表1 left join 表2 on 表1.列=表2.列;
select * from students left join class on students.class_id=class.id;

十一、子查询

# 在一个select中嵌入另一个select语句,这个语句就是子查询语句,子查询语句用来辅助主查询,充当数据源或者条件。子查询是一条独立的语句,单独拿出来也是可以执行的。
# 增加年龄字段
#子查询右四种类型
#标量子查询
#子查询返回一行一列的数据,实际上就是一个值。
#查询学生年龄小于平均年龄的学生信息,需要先用子查询语句查出学生的平均年龄。
select * from students where age < (select avg(age) from students);
#列量子查询
# 子查询返回的一列多行数据
#查询class表中已经安排学生的班级信息。
select * from class where id in (select class_id from students);
#行级子查询
#子查询返回的是一行多列,称之为行级子查询
#查询一班同学中年龄最大的同学的信息。
select * from students where (age,class_id)=(select max(age),class_id from students where class_id=1);
子查询select max(age),class_id from students where class_id=1;
#表级子查询
#子查询返回多行多列,称之为表级子查询
#查询学生信息对应班级名称,子查询返回数据充当数据源,再进行过滤
select t1.name,t1.class_name from (select s.*,c.name as class_name from students as s inner join class as c on s.class_id=c.id) as t1;
select t1.学生 as 学生姓名 ,t1.班级 as 班级名称 from (select b1.name as 学生,b2.name as 班级 from students as b1 inner join class as b2 on b1.class_id=b2.id) as t1;
select t1.学生 as 学生姓名 ,t1.班级 as 班级名称 from (select students.name as 学生,class.name as 班级 from students inner join class on students.class_id=class.id) as t1;
# 可用于子查询的关键词有(in,all,any,some)
in 符合子查询里面一个
select * from class where id in (select class_id from students);
any,some 表示任意一个:where 列=any(列子查询)任意一个满足了结果为true。
# 查出在学生表中2班级的学生年龄 都大于1班级的所有同学
select * from students where class_id=2 and age>any(select age from students where class_id=1);
select * from students where class_id=2 and age>(select min(age) from students where class_id=1);
select * from students where class_id=2 and age>some(select age from students where class_id=1);
all 等于里面所有:where 列=all(列子查询) 全部满足结果为true
select * from students where class_id=2 and age>all(select age from students where class_id=1);
select * from students where class_id=2 and age>(select max(age) from students where class_id=1);

十二、合并查询

#union all 将两次查询的结果集合到一起显示。
# union 是把连个查询的结果集先去重,后合并到一起显示
select * from students union all select * from students;
select * from students union select * from students;

十三、保存查询结果

#insert into 表名 (列1,列2) select......
# 新建一个表用来保存查询结果
create table info(
id int unsigned auto_increment primary key not null,
name varchar(10) not null,
class_name varchar(10) not null,
age int(100) unsigned
);
#全列插入
insert into info
select s.id,s.name,c.name as class_name,age from
students as s inner join class as c on s.class_id=c.id;

十四、备份数据库

# 备份数据库
# mysqldump -uroot -p000000 数据库名 > python.sql;
mysqldump -uroot -p000000 studb > beifen.sql;
# 查看数据库内容
cat beifen.sql
# 备份表
# mysqldump -uroot -p000000 数据库名 表名 > python.sql;
mysqldump -uroot -p000000 studb students> beifen_table.sql;

十五、数据库恢复

# 需要先新建数据库huifudb,然后再执行命名。
create database huifudb charset='utf8';
mysql -uroot -p huifudb < beifen.sql
use huifudb
select * from students;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值