mysql常用操作

mysql安装

sudo apt-get install mysql -server mysql -client

管理服务

# 启动
service mysql start

# 停止
service mysql stop

# 重启
service mysql restart

允许远程连接

# 找到mysql配置文件并修改
sudo vi /etc/mysql/mysql.conf.d/mysql.cnf
将bind-address=127.0.0.1 注释

#登录mysql,运行命令
grant all privileges on *.* to 'root'@'%' identified by 'mysql' with grant option;
flush privileges;

# 重启mysql
service mysql restart

数据

# 字段类型
在mysql中包含的数据类型很多,这里主要列出来常用的几种。
数字 : int, decimal
字符串:varchar ,text
日期:datetime
布尔:bit

# 约束
主键 primary key
非空 not nullunique
默认 default
外键 foreign key

使用命令连接操作

mysql -uroot -p
回车输入密码登录

#退出登录
quit或exit

#查看当前版本
select version();

# 显示当前时间
select now();

数据库操作

# 创建数据库
create database 数据库名 charset=utf-8;

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

# 切换数据库
use 数据库名字 

# 查看当前选择的数据库
select database();

表操作

# 查看当前数据库所有的表
show tables

# 创建表
auto_increment 表示自动增长

create table 表名字(
id int auto_increment primary key not null,
name varchar(10) not null,
age int(3),
idDelete bit default 1);


# 修改表
# add 增加 change修改 drop删除
alter table 表名 add|change|drop 列名 类型;

#删除表
drop table 表名;

# 查看表结构
desc 表名

#更改表名称
rename table 原表名 to 新表名

# 查看标的创建语句
show create table '表名';

数据操作

# 查询
select * from 表名

# 增加
# 全列插入
insert into  表名 values(......);
# 缺省插入
insert into 表名(列1,...) values(值1,....)
# 同时插入多条数据
insert into 表名 values(....),(...)....;

# 修改
update 表名 set 列1=值1,.....where 条件

# 删除
delete from 表名 where 条件

# 逻辑删除,本质就是修改操作update
update 表名 isdelete=1 where 条件;

备份与恢复

# 数据备份
# 进入管理员模式
sudo -s

# 进入mysql目录
cd /var/lib/mysql

# 运行mysqldump 命令

mysqldup -uroot -p 数据库名 > /desktop/备份文件.sql;
# 按提示输入mysql 密码

# 数据恢复
mysql -uroot -p 数据库名 < /desktop/备份文件.sql;

条件

select * from 表名 where 条件;

# 比较运算符
# 等于 =
# 大于 >
# 大于等于 >=
# 小于 <
# 小于等于<=
# 不等于 !=<>
# 查询编号大于3的学生

select * from 表名 where id>3;

# 逻辑运算符
andornot 非

# 模糊查询
like 
% 表示任意多个字符
_表示一个任意字符
列 查询姓张的学生

select * from 表名 wherelike '张%';
# 匹配两个字姓 张的同学
select * from 表名 wherelike '张_'; 

# 范围查询
in 表示在一个非连续的范围内

select * from 表名 where id in(1,2,4,6);

berween...and.....表示一个连续范围内

# 查询2至8的学生
select * from 表名 where id between 2 and 8;

# 空判断
is null 判断空
not null 非空


# 优先级
# 小括号,not,你叫运算符,逻辑运算符
# and 比 or先运算,如果同时出现并希望先算or,需要结合()使用。

聚合

# 聚合提供了5个函数
count(*) # 表示计算总行数,括号中学星与列名,结果是相同的。
# 查询学生总数
select count(*) from 表名;

max(列) # 表示求此列的最大值
# 查询女生编号最大值
select max(id) from 表名 where gender=0;

min(列) # 表示求此列最小值
select min(id) from 表名 where gender=0;

sum(列) # 求此列的和

avg(列) # 求此列的平均值
# 查询为删除女生的编号平均值
select avg(id) from 表名 where isdelete=0 and gender=0;

分组

# 按照字段分组,表示此字段相同的数据会被放到一个组中
# 分组后,只能查询出相同的数据列,对于有差异的数据列无法出现在结果集中
# 可以对分组后的数据进行统计,做聚合运算

select 列1,列2,聚合... from 表名 group by 列1,列2,列3...;


# 查询男女生总数
select gender as 性别,count(*)
from students
group by gender;


# 查询各城市人数
select hometown as 家乡,count(*)
from students
group by hometown;

# 分组后的数据筛选
# having后面的条件运算符与where的相同
select 列1,列2,聚合... from 表名
group by 列1,列2,列3...
having 列1,...聚合...

# 查询男生人数
select gender as 性别,count(*)
from students
group by gender
having gender=1;

# 对比where与having
# where是对from后面指定的表进行数据筛选,属于对原始数据的筛选
# having是对group by的结果进行筛选

排序

# 为了方便数据的查看,可以对数据进行排序。

# asc 从小到大
# desc 从大到小
select * from 表名 order by 列1 asc|desc,列2 asc|desc,....;

列:
# 查询未删除男生学生信息,按学号降序
select * from students
where gender=1 and isdelete=0
order by id desc;

# 查询未删除科目信息,按名称升序
select * from subject
where isdelete=0
order by stitle;

分页

# 当数据量过大时,在一页中查看数据是一件非常麻烦的事情。
# 语法
# start 开始  count 结束
select * from 表名 limit start,count

#示例:分页
# 已知:每页显示m条数据,当前显示第n页
# 求总页数:此段逻辑后面会在python中实现
#  查询总条数p1
#  使用p1除以m得到p2
#  如果整除则p2为总数页
#如果不整除则p2+1为总页数
#求第n页的数据

select * from students
where isdelete=0
limit (n-1)*m,m

外键

create table scores(
id int primary key auto_increment,
stuid int,
subid int,
score decimal(5,2),
foreign key(stuid) references students(id),
foreign key(subid) references subjects(id)
);

连接

"""
连接查询分类如下:
    表A inner join 表B:表A与表B匹配的行会出现在结果中
    表A left join 表B:表A与表B匹配的行会出现在结果中,外加表A中独有的数据,未对应的    数据使用null填充
    表A right join 表B:表A与表B匹配的行会出现在结果中,外加表B中独有的数据,未对应的数据使用null填充
在查询或条件中推荐使用“表名.列名”的语法
如果多个表中列名不重复可以省略“表名.”部分
如果表的名称太长,可以在表名后面使用' as 简写名'' 简写名',为表起个临时的简写名称
"""


# 查询每个学生每个科目的分数
select students.sname,subjects.stitle,scores.score
from scores
inner join students on scores.stuid=students.id
inner join subjects on scores.subid=subjects.id;          
# 查询学生的姓名、平均分
select students.sname,avg(scores.score)
from scores
inner join students on scores.stuid=students.id
group by students.sname;

# 查询男生的姓名,总分。
select students.sname,avg(scores.score)
from scores
inner join students on scores.stuid=students.id
where students.gender=1
group by students.sname;

# 查询科目的名称、平均分
select subjects.stitle,avg(scores.score)
from scores
inner join subjects on scores.subid=subjects.id
group by subjects.stitle;

# 查询未删除科目的名称、最高分、平均分
select subjects.stitle,avg(scores.score),max(scores.score)
from scores
inner join subjects on scores.subid=subjects.id
where subjects.isdelete=0
group by subjects.stitle;

视图

""" 
    对于复杂的查询,在多次使用后,维护是一件非常麻烦的事情
    解决:定义视图
    视图本质就是对查询的一个封装
    定义视图
"""
create view stuscore as 
select students.*,scores.score from scores
inner join students on scores.stuid=students.id;

#视图的用途就是查询

select * from stuscore;
# 事物
# 要求表的类型必须是innodb或bdb类型,才可以对此表使用事务。
开启begin;
提交commit;
回滚rollback;

 

原文地址:https://www.cnblogs.com/zhangguanghe/p/9064359.html