MySQL数据库基础操作初步

MySQL 数据库

  • 采用二维表来组织数据机构的开源关系型数据库。
  • 跨平台,支持多种变成语言(Java、Python、PHP等)。
  • 基于磁盘存储,数据以文件形式存放。

〇、安装与配置

1、Linux
安装服务端:sudo apt/yum install mysql-server
安装客户端:sudo apt/yum install mysql-client
配置文件目录:/etc/mysql
数据库存储目录:/var/lib/mysql
服务端查看/启动/重启/关闭:sudo service mysqld status/start/restart/stop
客户端连接:mysql -h主机地址 -u用户名 -p密码

2、Windows

  • exe安装包图形化安装,注意选择字符集
  • 若安装时选择了gbk字符集,实际需要修改数据库编码时,按如下修改。
    • 在配置文件my.ini中client项和mysqld项修改/添加如下:
        [mysqld]
        basedir=E:\mysql\mysql-5.7.16-winx64
    	datadir=E:\mysql\mysql-5.7.16-winx64\data
    	character_set_server=utf8
    	[mysql]
    	default-character-set=utf8
    	[client]
    	default-character-set=utf8
    
    • 如果在插入或查看utf8编码的中文字符时报如下error,命令行中输入set names gbk;表示设置client端的编码方式,这样可以暂时解决问题。
      ERROR 1366 (HY000): Incorrect string value

一、库管理

1.查看已有库

show databases

2.创建库并指定字符集

create database 库名 [character set utf8];
  • 库名的命名规则
    1)使用数字、字母、下划线,但不能使用纯数字
    2)库名区分字母大小写
    3)不能使用特殊字符和mysql关键字
e.g. 
create database owhyt character set utf8;
create database owhyt charset=utf8;
create database web_db1 default charset utf8 collate utf8_general_ci;
注:collate utf8_general_ci语句的意思为校对数据库规则——不区分大小写

3.查看创建库的语句

show create database 库名;
e.g. 
show create database owhyt;

4.查看当前使用数据库

select database();

5.切换库

use 库名;
e.g.
use owhyt;

6.删除库

drop database 库名;
e.g. 
drop database owhyt;

二、数据表设计

1、表结构设计思路

分析存储内容、确定字段构成、设计字段类型

2、数据类型

①.数字类型:

整数类型(精确值) - INTEGER,INT,SMALLINT,TINYINT,MEDIUMINT,BIGINT
定点类型(精确值) - DECIMAL
浮点类型(近似值) - FLOAT,DOUBLE
位类型         - BIT

类型字节有符号范围无符号范围用途
TINYINT1(-27, 27-1)(0, 28-1)小整数值
SMALLINT2(-215, 215-1)(0, 216-1)大整数值
MEDIUMINT3(-223, 223-1)(0, 224-1)大整数值
INT/INTEGER4(-231, 231-1)(0, 232-1)大整数值
BIGINT8(-263, 263-1)(0, 264-1)极大整数值
DECIMALM+2取决于M和D的值取决于M和D的值小数值
FLOAT4(-3.402823466E+38, -1.175494351E-38)
0
(1.175494351E-38, 3.402823466351E+38)
0
(1.175494351E-38, 3.402823466E+38)
单精度浮点数值
DOUBLE8(-1.7976931348623157E+308, -2.2250738585072014E-308)
0
(2.2250738585072014E-308, 1.7976931348623157E+308)
0
(2.2250738585072014E-308, 1.7976931348623157E+308)
双精度浮点数值
BIT(M)1~8BIT(1) ~ BIT(8)布尔值

进一步说明:

DECIMAL(M,D)。

M是数字的最大位数(精度)。其范围为1~65,M 的默认值是10。
D是小数点右侧数字的数目(标度)。其范围是0~30,但不得超过M。
比如 DECIMAL(6,2)最多存6位数字,小数点后占2位,取值范围-9999.99到9999.99。

位类型可以用0,1值表达2种情况:真、假

②.字符类型:
类型大小特点 / 用途
CHAR0~255字节定长字符串,效率高;
一般用于固定长度的数据,默认1字符
VARCHAR(M)0~65535字节不定长字符串
TINYBLOB0~255字节不超过255个字符的二进制字节串
TINYTEXT0~255字节不超过255个字符的非二进制文本字符串
BLOB0~65535字节变长,二进制字节串
TEXT0~65535字节变长,非二进制文本字符串
MEDIUMBLOB0~16777215(224-1)字节中等长度的二进制字节串
MEDIUMTEXT0~16777215字节中等长度的非二进制文本字符串
LONGBLOB0~4294967295(232-1)字节超大长度的二进制字节串
LONGTEXT0~4294967295字节超大长度的非二进制文本字符串
③.枚举类型
类型最大值说明
enum(“value1”, “value2”, …)65535该类型的列只可以容纳所列值之一 或 为NULL
set(“value1”, “value2”, …)64该类型的列可以容纳一组值 或 为NULL
④.日期时间类型
类型大小(字节)日期格式日期范围用途
DATE3YYYY-MM-DD1000-01-01 ~ 9999-12-31年月日
DATETIME8YYYY-MM-DD HH:MM:SS1000-01-01 00:00:00 ~ 9999-12-31 23:59:59年月日时分秒
TIMESTAMP4YYYY-MM-DD HH:MM:SS1970-01-01 00:00:00 UTC ~ 2038-01-19 03:14:07 UTC年月日时分秒 / 时间戳
TIME3HH:MM:SS-838:59:59 ~ 838:59:59时分秒
YEAR1YYYY1901 ~ 2155年份值

Ⅰ 说明:

  1. DATETIME,不设值,默认NULL值
  2. TIMESTAMP,不设值,默认返回系统当前时间
  3. TIME类型范围小时部分如此大的原因,它不仅可以用于表示一天的时间,还可以是某个事件过去的时间或两个时间的时间间隔(可以大于24小时,甚至为负)

Ⅱ 常用日期时间函数

  • now() 返回服务器当前时间
  • curdate() 返回当前日期
  • curtime() 返回当前时间
  • date(date) 返回指定时间的日期
  • time(date) 返回指定时间的时间
e.g. 
  select * from timetab where Date="2018-08-08";
  select * from timetab where Date>="2018-08-08" and Date<="2018-08-08";
  select * from timetab where Date > (now()-interval 1 day);
  注:interval后允许跟的时间间隔单位有minute, hour, day, month, year

三、数据表管理

1、创建表并指定字符集

create table 表名(字段名 数据类型, …)charset=utf8;

补充:

  • 可以设置数字为无符号unsigned
  • 若不允许字段为 NULL,可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。
  • DEFAULT 表示设置一个字段的默认值
  • AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
  • PRIMARY KEY关键字用于定义列为主键。主键的值不能重复。
e.g.  创建学生表
create table students (
id int primary key auto_increment,
name varchar(32) not null,
age int not null,
sex enum('w','m'),
class varchar(64) not null,
scores float default 0.0
)charset=utf8,auto_increment=1;

e.g. 创建培训班表
create table interest (
id int auto_increment,
name varchar(32) not null,
hobby set('sing','dance','draw'),
course char not null,
price decimal(6,2),
comment text,
primary key(id)
)charset=utf8,auto_increment=1;

2、查看创建表的语句(字符集、存储引擎)

show create table 表名;

3、查看已有数据表

show tables;

4、查看表结构

desc 表名;

5、删除表

drop table1, [2,3, ...];

四、表记录管理

1、插入(insert)

insert into 表名 values(记录1),(记录2),...;
insert into 表名(字段1,字段2,...) values(值1,值2,...);
insert into 表名 set 字段1=值1,字段2=值2,...;
e.g. 
insert into students values (2,'Hange',32,'w','1班',91.2),(3,'Levi',29,'m','2班',95.6),(4,'Aren',16,'m',82.9);

2、查询(select)

select * from 表名 [where 条件];
select 字段1,字段名2,... from 表名 [where 条件];

e.g. 
select * from students;
select name,age from students;
where子句和MySQL运算符

  where子句在SQL语句中扮演了重要角色,主要通过一定的运算条件进行数据的筛选,进而达到查询的目的。
  查询表记录时可以做的数学运算有:+ - * / % 幂运算POWER(m,n)

MySQL主要有:算术运算符、比较运算符、逻辑运算符、位运算符

①.算数运算符

加+ 减- 乘* 除(/或DIV) 取余(%或MOD)

e.g.
select * from students where age % 2 = 0;

②.比较运算符

> >= < <= <> !=
(not) between
(not) in
like 模糊匹配(%代表0到多个字符,_代表一个字符)
regexp或rlike 正则匹配
is (not) NULL
<=>严格比较两个NULL值是否相等

e.g.
select * from students where age > 25;
select * from students where between 25 and 30;
select * from students where age in (29, 30);
select * from students where name age>20 and name like 'L%';
select * from students where name is not NULL;

③.逻辑运算符
NOT或! AND OR XOR(异或)

e.g.
select * from students where sex='m' and age>20;

④.位运算符
按位与& 按位或| 按位异或^ 取反! 左移<< 右移>>

3、更新(update)

update 表名 set 字段1=1,字段2=2,... where 条件;

e.g.
update students set age=28 where name='Levi';

4、删除(delete)

delete from 表名 where 条件;
注意:delete语句后如果不加where条件,所有记录全部清空

e.g.
delete from students where name='Levi';

五、表字段管理(alter table 表名)

alter table 表名 执行动作;

添加字段(add)
    alter table 表名 add 字段名 数据类型;
    alter table 表名 add 字段名 数据类型 first;
    alter table 表名 add 字段名 数据类型 after 字段名;
    添加字段主键
    	alter table 表名 add primary key(字段名);
删除字段(drop)
    alter table 表名 drop 字段名;
    删除主键索引(必须先删除自增长属性,否则删不掉)
        alter table 表名 drop primary key;
修改数据类型(modify)
    alter table 表名 modify 字段名 新数据类型;
    添加字段自增长属性
    	alter table 表名 modify 字段名 int auto_increment;
    删除字段自增长属性
        alter table 表名 modify 字段名 int;
    重新设定自增长属性值
        alter table 表名 auto_increment=200;
修改字段名(change)
    alter table 表名 change 旧字段名 新字段名 新数据类型;
表重命名(rename)
    alter table 表名 rename 新表名;

e.g.1
alter table interest add date Date after course;
e.g.2 为表stu_grade添加id字段,要求逐渐自增长,显示宽度为3,位数不够用0填充(int后的数字表示显示长度,varchar后的数字表示字符长度)
alter table stu_grade add id int(3) zerofill primary key auto_increment first;

六、查询语句汇总

1、模糊匹配查询和正则匹配查询

LIKE用于在where子句中进行模糊查询,%表示0到多个字符,_表示一个字符。

e.g. 
select * from students where name like 'A%';

MySQL中对正则表达式的支持有限,只支持部分正则元字符

SELECT field1, field2,...fieldN 
FROM table_name
WHERE field1 REGEXP condition

e.g. 
select * from class_1 where name regexp 'B.+';

2、排序(order by)

ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。
默认情况ASC表示升序,DESC表示降序
(放倒数第二项写)

SELECT field1, field2,...fieldN from table_name where field1
ORDER BY field1 [ASC [DESC]]

e.g.
select * from class_1 where sex='m' order by age;

3、分页(limit)

LIMIT 子句用于限制由 SELECT 语句返回的数据数量,或者 UPDATE, DELETE语句的操作数量(放最后一项写)

SELECT column1, column2, columnN 
FROM table_name
WHERE field
LIMIT [m,] n
注:显示前n条
&emsp;&emsp;从第m+1条记录开始,每页显示n条

4、联合查询

UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。要求查询的字段必须相同

SELECT seg1, seg2, ... segn
FROM table
[WHERE condition1]
UNION [ALL | DISTINCT]
SELECT seg1, seg2, ... segn
FROM table
[WHERE condition2];

segn: 要检索的字段。
table: 要检索的数据表。
DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。
ALL: 可选,返回所有结果集,包含重复数据。

select * from students where sex='w' UNION ALL select * from students where age > 20;

5、聚合函数

函数功能
avg(字段名)该字段的平均值
max(字段名)该字段的最大值
min(字段名)该字段的最小值
sum(字段名)该字段所有记录的和
count(字段名)统计该字段记录的个数(空值NULL不会被统计在内)
select max(age) from students;
select count(name) as number from students;
select sum(scores) as summation from students;
select avg(scores) as average from students;

6、分组(group by)

  • group by后的字段必须和查询字段(select后的字段)一致
  • 若查询字段和group by后的字段不一致,则必须对该字段使用聚合函数进行处理
select class, avg(scores) from students group by class;
e.g.查询男生数量最多的两个班级以及对应男生数量
select class,count(name) from students where sex='m' group by class 
order by count(name) desc limit 2;

7、having语句

对分组聚合后的结果进一步筛选

  • having语句通常与group by联合使用
  • having语句弥补了where关键字不能与聚合函数联合使用的不足;
    • 因为where只能操作表中实际存在的字段,having操作的是聚合函数生成的字段
e.g.查询均分大于90分的前两个班级及对应均分
select class, avg(scores) as scores_avg from students 
group by class having scores_avg>90 
order by scores_avg desc limit 2;

8、distinct语句

不显示字段的重复值,要注意的是,对后续语句不能使用聚合函数。

e.g.统计一共有多少个班级
select count(distinct class) as class_num from students;

9、嵌套查询(子查询)

把内层的查询结果作为外层的查询条件,此查询方式效率低。

e.g.1 查询分数小于平均值的学生姓名和对应分数
select name,scores from students where scores < (
select avg(scores) from students
);
e.g.2 查询每个班级中分数最高的学生姓名和对应分数
select name,scores from students where class,scores in (
select class,max(scores) from students group by class
);

10、多表查询

多个表数据可以联合查询,数据准备db_major.sql如下:
source db_major.sql

create database if not exists db_major character set utf8;
use db_major;

create table if not exists discipline(
id int primary key auto_increment,
did int,
dname varchar(15)
)default charset=utf8;

insert into discipline values
(1, 01, '哲学'),
(2, 02, '经济学'),
(3, 03, '法学'),
(4, 04, '教育学'),
(5, 05, '文学'),
(6, 06, '历史学'),
(7, 07, '理学'),
(8, 08, '工学'),
(9, 09, '农学'),
(10, 10,'医学'),
(11, 12, '管理学'),
(12, 13, '艺术学');

create table if not exists subject(
id int primary key auto_increment,
sid int,
sname varchar(32),
sd_id int
)default charset=utf8;

insert into subject values
(1, 0101, '哲学类', 01),
(2, 0203, '金融学类', 02),
(3, 0302, '社会学类', 03),
(4, 0304, '民族学类', 03),
(5, 0402, '体育学类', 04),
(6, 0503, '新闻传播学类', 05),
(7, 0601, '历史学类', 06),
(8, 0704, '天文学类', 07),
(9, 0706, '大气科学类', 07),
(10, 0707, '海洋科学类', 07),
(11, 0809, '计算机类', 08),
(12, 0818, '交通运输类', 08),
(13, 0828, '建筑类', 08),
(14, 0904, '动物医学类', 09),
(15, 1001, '基础医学类', 10),
(16, 1011, '护理学类', 10),
(17, 1208, '电子商务类', 12),
(18, 1305, '设计学类', 13);

create table if not exists major(
id int primary key auto_increment,
mid int,
mname varchar(15),
mdid int
)default charset=utf8;

insert into major values
(1, 010101, '哲学', 01),
(2, 040205, '运动人体科学', 04),
(3, 080901, '计算机科学与技术', 08),
(4, 080902, '软件工程', 08),
(5, 080903, '网络工程', 08),
(6, 080904, '信息安全', 08),
(7, 080905, '物联网工程', 08),
(8, 080906, '数字媒体技术', 08),
(9, 080907, '智能科学与技术', 08),
(10, 080908, '空间信息与数字技术', 08),
(11, 080909, '电子与计算机工程', 08),
(12, 082801, '建筑学', 08),
(13, 082802, '城乡规划', 08),
(14, 090402, '动物药学', 09),
(15, 130503, '环境设计', 13),
(16, 130507, '工艺美术', 13);

1)笛卡尔积(匹配次数过多)
  多表查询不加where条件,一张表的每条记录分别和另一张表的所有记录分别匹配一遍

select  字段1,字段2... from1,2...

e.g.
select discipline.dname, subject.sname from discipline,subject;

2)多表查询——带where子句的笛卡尔积

select  字段1,字段2... from1,2... [where 条件]

e.g.1
select students.name,students.age,students.sex,interest.hobby from students,interest where students.name = interest.name;
e.g.2 查询学科门类和专业类的详细信息
select discipline.dname, subject.sname from discipline,subject where discipline.did=subject.sd_id;
e.g.3 查询学科门类、专业类和专业的详细信息
select discipline.dname, subject.sname, major.mname from discipline, subject, major where discipline.did=subject.sd_id and major.ms_id=subject.sid;

11、连接查询

1)内连接

查询结果和多表查询相同,显示匹配到的记录

select 字段名 from1 inner join2 on 条件 inner join3 on 条件 ...;

e.g.1 : 查询学科门类和专业类的详细信息
select discipline.dname, subject.sname from discipline 
inner join subject on discipline.did=subject.sd_id;
e.g.2 : 查询学科门类、专业类和专业的详细信息
select discipline.dname, subject.sname, major.mname from discipline 
inner join subject on discipline.did=subject.sd_id 
inner join major on major.ms_id=subject.sid;
2) 外连接

显示匹配到的记录,匹配不到的记录也显示
①.左外连接
以左表为主,显示查询结果

select 字段名 from1 left join2 on 条件 left join3 on 条件 ...;

e.g. : 查询学科门类和专业类的详细信息
select discipline.dname, subject.sname from discipline 
left join subject on discipline.did=subject.sd_id;

②.右外连接
以右表为主,显示查询结果

select 字段名 from1 right join2 on 条件 right join3 on 条件 ...;

e.g. : 查询学科门类和专业类的详细信息
select discipline.dname, subject.sname from discipline 
right join subject on discipline.did=subject.sd_id;

七、数据的备份与还原

  • 该方法通常用于相同版本的MySQL数据库之间的迁移

1、备份命令

mysqldump -u用户名 -p 源库名 > [路径/]***.sql
更多命令参数如下:
  --all-databases   备份所有库
  库名         备份单个库
  -B 库1 库2 库3   备份多个库
  库名 表1 表2 表3  备份指定库的多张表

2、还原命令

mysql -uroot -p 目标库名 < [路径/]***.sql
若使用 --all-databases 参数备份所有的数据库,则还原时不需要指定数据库。
从所有库备份中恢复某一个库(–one-database)
  mysql -uroot -p --one-database 目标库名 < all.sql

八、数据表导入和导出

MySQL数据库中的表可以导出成文本文件、XML文件或者csv文件等,相应地,文本文件也可以导入MySQL数据库中。

1、导出

①.方式一(select … into …命令)
  • 导出的内容由SQL查询语句决定
  • 导出文件在数据库存储目录下
语法格式
select [字段名] from 表名
into outfile "目标文件"
[option];
选项optionfields terminated by "分隔符";(默认分隔符\t)
    lines terminated by "结束符";(默认结束符\n)
    fields enclosed by "字符";(设置字符括上字段的值,默认不使用任何符号)
    fields optionally enclosed by "字符";(设置字符括上charvarchartext等字符型字段,默认不使用任何符号)
    lines starting by "字符";(设置每行开头的字符,默认无任何字符)
    fields escaped by "字符";(设置转义字符,默认值\)

注:目标文件路径可以指定,如果不指定,那么使用默认导出路径,Windows系统安装目录下的my.ini配置文件中的datadir值;
   Linux默认数据库存储路径为/var/lib/mysql
e.g.
将students表中的姓名、年龄和性别三个字段导出,存放在students.csv中。
select name, age, sex from owhyt.students
into outfile 'C:\\Users\\Ow\\Desktop\\students.csv'
fields terminated by ','
lines terminated by '\r\n';
②.方式二(mysql命令)

默认以空格分隔,格式整齐,带有表头
mysql命令可以用来登录MySQL服务器,也可以用来还原备份文件,还可以导出文本文件。

mysql -u root -pPassword [–xml|-X|–html|-H] -e ‘select 语句’ 数据库名 > 目标文件;
参数:
   Password 表示root用户密码
   -e 表示可以执行SQL语句
   select 语句 用来查询记录
   目标文件,默认路径为命令执行的当前路径,也可指定路径
   可选参数–xml或-X,导出xml文件
   可选参数–html或-H,导出html文件

mysql -uroot -p123456 -e "select name, age, sex from owhyt.students" owhyt > C:\\Users\\Xxx\\Desktop\\students.txt

2、导入

①.方式一(使用source命令)

使用source命令导入由MySQL语句编写的sql文件,命令的执行位置在sql文件所在目录

source [路径/]xxx.sql
②.方式二(使用load命令)

步骤:

  1. 在数据库中创建对应的表

  2. 执行数据导入语句

    *注:以上为非ubuntu系统的操作步骤,如果是ubuntu系统,则在执行数据导入语句之前,需要将导入文件拷贝到变量secure_file_priv所指代的路径中,该路径限制导入文件的存放路径。
    *查看secure_file_priv指代的路径

    mysql> show variables like "%secure%";
    
    +------------------+-----------------------+
    | Variable_name    | Value                 |
    +------------------+-----------------------+
    | secure_auth      | ON                    |
    | secure_file_priv | /var/lib/mysql-files/ |
    +------------------+-----------------------+
    
基本格式
load data infile "文件名"
into table 表名
[option];
选项optionfields terminated by "分隔符";(默认分隔符\t)
    lines terminated by "结束符";(默认结束符\n)
    fields enclosed by "字符";(设置字符括上字段的值,默认不使用任何符号)
    fields optionally enclosed by "字符";(设置字符括上charvarchartext等字符型字段,默认不使用任何符号)
    lines starting by "字符";(设置每行开头的字符,默认无任何字符)
    fields escaped by "字符";(设置转义字符,默认值\)
    ignore n lines;(用于指定忽略文件的前n行记录)
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页