启动数据库:net start mysql
关闭数据库:net stop mysql
!!!如果显示”net”不是内部命令,则如下:
数据库操作
1、连接数据库:
mysql -u root -p
(密码:123456 查看数据库的安装路径:show variables like "%char%";)
2、创建数据库:
create database <数据库名> character set utf8;
3、删除数据库:
drop database <数据库名>;
4、显示所有数据库:
show databases;
5、选择数据库:
use <数据库名>;(之后的操作都在该数据表中进行)
6、显示数据库创建语句:
show create database <数据库名>;
数据表操作
1、创建表:
create table <表名>
(
列名1 数据类型1(数据长度),
列名2 数据类型2(数据长度),
列名3 数据类型3(数据长度)
)charset=utf8;
2、删除表:
drop table <表名>;
3、显示所有表:
show tables;
4、显示表中的全部数据:
select * from <表名>;(显示所有列)
5、显示表创建语句:
show create table <表名>;
6、显示表结构:
desc <表名>;
7、复制已有表结构:
create table <新表名> like <表名>;(数据库.表名可以访问任何数据库里的表)
8、修改表名:
rename table 旧表名 to 新表名;
alter table 旧表名 rename 新表名;
alter table 旧表名 rename to 新表名;
9、修改表结构:
增加一列:alter table <表名> add column 列名 数据类型 约束 after 列名/first;
删除一列:alter table <表名> drop column 列名;
修改列名:alter table <表名> change 旧列名 新列名 数据类型 约束;
数据类型不能省略,当旧列名和新列名相同的时候,指定新的数据类型或约束,就可以修改数据类型或约束。需要注意的是,修改数据类型可能会导致数据丢失,所以要慎重使用。
修改列的数据类型:alter table <表名> modify 列名 新数据类型;
10、对表数据的修改:
增加一行数据:insert into <表名>(列1,列2,列3) values(值1,值2,值3);
修改表中某个数据:update <表名> set 列1=修改后的内容,列2=修改后的内容 where 列=该条数据本身具备的条件;
删除一行数据:delete from <表名> where 列=需要删除的数据独有的条件;
删除所有的数据:delete from <表名>;
SELECT语句详解
1、SELECT查询语句:
select * from <表名>;
select 列名1,列名2 from <表名>;
2、where条件查询:
select 列名 from <表名> where 查询条件;`
**去重查询:**select distinct 列名 from <表名>;
distinct只能放在开头,列名,distinct 列名是会报错的
and与or:查询条件可以有[条件一 AND 条件二],[条件一 OR 条件二]
in 与not in:用于筛选“在”或者“不在”某个范围
select * from <表名> where 列名 in(‘a’,’b’);(在a或在b)
select * from <表名> where 列名 not in(‘a’,’b’);(不在a也不在b)
between...and...:在...区间之内(包括值1和值2)
select 列名 from <表名> where 列名 between 值1 and 值2;
not between...and...:不在...区间之内(包括值1和值2)
select 列名 from <表名> where 列名 not between 值1 and 值2;
is null:是否为空
select 列名 from <表名> where 列名 is null;
is not null:是否不为空
select 列名 from <表名> where 列名 is not null;
< <= > >= = !=:select 列名 from <表名> where 列名>值;
3、like模糊查询:
select 列名 from <表名> where 列名 like ‘a_’ , ’b%’;
通配符:_和%(_代表一个未指定字符,%代表不定个未指定字符)
4、order by排序查询:
select * from <表名> order by 列名 asc/desc/默认;
默认情况下是升序排序,使用asc和desc则是升序和降序排序。
5、Limit m,n查询指定数据的数量:
select 列名 from <表名> limit 0,3;
从索引为0(也就是第一条数据)开始取,取3条数据。
6、group by 分组查询:
select 列名 from <表名> group by 列名;
group by中的参数,要在select中出现。有count一般就会有group by。
7、having条件查询:
select 列名 from <表名> group by 列名 having 函数(列名)>值;
having后面跟随的是过滤的条件,上述只是参考
having和where的区别:
where是一个约束说明,在查询结果返回之前对查询条件进行约束,即在结果返 回前起作用,where后面不能使用聚合函数,因为where的执行顺序在聚合函数 之前。
having是一个过滤声明,在查询结果返回之后进行过滤,即在结果返回后起作用, having后面可以使用聚合函数,但是不能对没有查出来的数据使用having,因为 having是对分组后的数据进行过滤。
having一般和group by 和聚合函数(以下)一起使用。
8、内置函数和计算
函数名 | count | sum | avg | max | min |
---|---|---|---|---|---|
作用 | 计数 | 求和 | 求平均值 | 最大值 | 最小值 |
count函数可用于任何数据类型(因为它只是计数),查询行数或者说条数
select count(列名) as 新列名 from <表名>;
sum、avg函数都只能对数字类型数据做计算,查询一列数值的总和/平均值
select sum(列名) as 新列名 from <表名>;
select avg(列名) as 新列名from <表名>;
max、min可用于数值、字符串或是日期时间数据类型,查询一列数值
select max(列名) as 新列名 , min(列名) as 新列名 from <表名>;
AS关键词可以给值重命名(AS可以省略)
9、子查询
把一个查询的结果在另一个查询中使用就叫做子查询。
select 列名 from <表名> where 列 in (select 列名 from <表名>);
10、多表联查:
inner join...on...内连接:
例一:
select 表1.列名,表2.列名 from 表1,表2 where 表1.列名=表2.列名;
select id,name,people_num from employee,department where employee.in_dpt = department.dpt_name order by id;
例二:
select 表1.列名,表2.列名 from 表1 inner join 表2 on 表1.列名=表2.列名;
select id,name,people_num from employee join department on employee.in_dpt = department.dpt_name order by id;
例三:
select 列名 from 表1 join 表2 on 表1和表2之间的关系 join 表3 on 表1和表3之间的关系
select name,people_num,COUNT(proj_name) AS count_project from employee,department,project where in_dpt = dpt_name and of_dpt = dpt_name group by name,people_num;
left join...on...左外连接:
select 表1.列名, 表2.列名 from 表1 left join 表2 on 表1.列名=表2.列名;
right join...on...右外连接:
select 表1.列名, 表2.列名 from 表1 right join 表2 on 表1.列名=表2.列名;
数据库的内连接和外连接 | 数据库的左连接和右连接 |
---|---|
内连接就相当于交集,外连接就相当于并集。内连接的查询结果只会出现两个表 都拥有的数据,外连接则相反,一个表中有的数据在另一个表中没有,也可以出 现在查询结果中。(外连接就需要一个基准表) | 左连接就是将left join左边的表作为基准表,右连接是将right join右边的表作为基准表 |
其他基本操作
1、索引:
alter table <表名> add index 索引名(列名);
create index 索引名 on <表名>(列名);
select * from <表名> where 列名=?;
2、视图:
create view 视图名(列a,列b,列c) as select 列1,列2,列3 from <表名>;
select * from 视图名;
3、导入:
首先查看路径变量:show variables like ‘%secure%’;
再打开一个终端,拷贝数据文件夹到路径目录下:sudo cp -a /原路径 /路径变量
查看文件中的数据:sudo vim /路径/文件名
最后导入:load data infile ‘文件路径和文件名’ into table <表名>;
4、导出:
select 列1,列2 into outfile ‘文件路径和文件名’ from <表名>;
sudo cat /文件路径/文件名
5、备份:
mysqldump -u root <数据库名> > 备份文件名;#备份整个数据库
mysqldump -u root <数据库名> <表名> > 备份文件名;#备份整个表
mysqldump是MySQL用于备份数据库的实用程序。主要是产生一个SQL脚本文 件,其中包括从头重新创建数据库所必需的命令。
使用命令“ls”可见已经生成备份文件
备份和导出的区别:导出的文件只是保存数据库中的数据,而备份则是把数据库 的结构,包括数据、约束、索引、视图等全部另存为一个文件。
6、恢复:
方式一:source /文件路径/文件名
方式二:新建一个空的数据库 create database test;
退出MySQL,然后 mysql -u root test < bak.sql
最后就可以查看数据库了
加载数据库文件
1、用get命令将需要的数据文件下载到本地文件夹:
git clone https://数据文件的路径/本地文件夹
git clone https://gitHub.com/shiyanlou/SQL3.git
2、加载文件中的数据,输入以下命令行:
source /数据文件夹在本地的路径/数据文件;
数据库基础知识
1、数据库:安装数据结构,存储和管理数据的仓库
2、SQL:结构化查询语言(不区分大小写)
3、MySQL:是一个DBMS(关系型数据库管理系统)
4、约束:是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。
5、数据库的三级模式结构:外模式、概念模式、内模式(逻辑独立和物理独立)
6、用户级对应外模式,概念级对应概念模式,物理级对应内模式
数据类型:
类型 | 字节 | 含义 | 实例 |
---|---|---|---|
int | 4 | 整数 | |
float | 4 | 单精度浮点数 | |
double | 8 | 双精度浮点数 | |
enum | 单选 | enum(‘a’,’b’,’c’) | |
set | 多选 | SET(‘1’,’2’,’3’) | |
date | 3 | 日期 | YYYY-MM-DD |
time | 3 | 时间点或者持续时间 | HH:MM:SS |
year | 1 | 年份值 | YYYY |
char | 0~255 | 定长字符串 | |
varchar | 0~255 | 变长字符串 | |
text | 0~65535 | 长文本数据 |
char和varchar的区别:
char的长度是不可变化的,varchar是可变化的。例如,存储字符串’abc’,对于
char(10),表示存储的字符将占用10个字节(包括7个空字符),而同样的
varchar(12)则只占用4个字节的长度,增加一个额外字节来存储字符串本身的长度,12只是最大值,但你存储的字符小于12时,按实际长度存储。
约束类型:
约束类型 | 主键 | 默认值 | 唯一 | 外键 | 非空 | 关键字 |
---|---|---|---|---|---|---|
PRIMARY | KEY | DEFAULT | UNIQUE | FOREIGN | KEY | NOT NULL |
定义主键的方法:
在创建表的时候,直接添加在列名语句后面
还有一种特殊主键–复合主键
数据库SQL语言的分类:
查询语言:对数据进行操作。select
操作语言:对数据进行操作。插入(insert)、更新(update)、删除(delete)
定义语言:对数据库或者数据表进行操作。创建(create)、修改(alter)、删除(drop)、查看(desc、查看仅对数据表)
控制语言:用于对数据库权限的修改。给用户授予权限(grant)
取消用户权限(remoke)