MYSQL数据库基本操作
一,MYSQL数据库的简介
1,数据库的概念
数据库就是以一定格式进行组织的数据的集合。通俗来看数据库就是用户计算机上 一些具有特殊格式的数据文件的集合。
2,相比于普通文件,数据库的特点
1)持久化存储,
2)读写速度极高,
3)保证数据的有效性,
4)对程序支持性非常好,
5)容易扩展
3,数据库管理系统
数据库管理系统(英语:Database Management System,简称DBMS)是为管理数据库而设计的软件系统,包括三大部分构成:
1)数据库文件集合. 主要是一系列的数据文件, 作用是存储数据.
2)数据库服务端. 主要负责对数据文件以及文件中的数据进行管理.
3)数据库客户端. 主要负责和服务端通信, 向服务端传输数据或者从服务端获取数据.
他们之间的关系:
1)数据库客户端通过 SQL 语句告诉服务端, 客户端想要做什么.
2)服务端和数据文件一般都在同一台机器上, 直接可以读写数据文件.
4,关系型数据库管理系统-RDBMS(Relational Database Management System)
一般情况下,可以将数据库分为关系型数据库和非关系型数据库。
所谓的关系型数据库RDBMS,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据,本质上使用一张二维表来表示关系。
关系型数据库中的核心元素:
1)数据库(数据表的集合)
2)数据表(数据行的集合)
3)数据列(字段)
4)数据行(记录)
5,SQL语句(Structured Query Language)
SQL 语句的作用是实现数据库客户端和服务端之间的通信. 其表现形式为: 带有一定格式的字符串.
SQL语句主要分为:
1)DQL:数据查询语言,用于对数据进行查询,如select
2)DML:数据操作语言,对数据进行增加、修改、删除,如insert、udpate、delete
3)DDL:数据定义语言,进行数据库、表的管理等,如create、drop
4)DCL:数据控制语言,进行授权与权限回收,如grant、revoke
5)TPL:事务处理语言,对事务进行处理,包括begin transaction、commit、rollback
对于web程序员来讲,重点是数据的crud(增删改查),必须熟练编写DQL、DML,能够编写DDL完成数据库、表的操作,其它语言如TPL、DCL、CCL了解即可.
注意:
1)SQL语句不区分大小写
2)SQL是结构化查询语言,是一种用来操作RDBMS的数据库语言。当前几乎所有关系型数据库都支持使用SQL语言进行操作,也就是说可以通过 SQL 操作 oracle,sql server,mysql,sqlite 等等所有的关系型的数据库。
二,数据类型和约束
数据库中存储的数据应该符合我们的预期, 这就是数据完整性.我们通过以下两方面来实现数据的完整性.
数据类型: 存储在数据库中的所有数据值均正确的状态。如果数据库中存储有不正确的数据值,则该数据库称为已丧失数据完整性。
数据约束: 在数据类型限定的基础上, 添加的额外的要求.
1,数据类型
数据类型影响着数据中存储的数据所占的对数据进行最基本的类型约束、空间大小.
只有类型符合要求的数据才能存储起来 这就是对数据完整性的一种要求.
使用数据类型的原则是:够用就行,尽量使用取值范围小的,而不用大的,这样可以更多的节省存储空间
常用数据类型如下:
- 整数:int,bit
- 小数:decimal
- 字符串:varchar,char,text
- 日期时间: date, time, datetime
- 枚举类型(enum)
特别说明的类型如下:
- decimal表示浮点数,如 decimal(5, 2) 表示共存5位数,小数占 2 位.
- char表示固定长度的字符串,如char(3),如果填充'ab'时会补一个空格为
'ab '
. - varchar表示可变长度的字符串,如varchar(3),填充'ab'时就会存储'ab'
- 对于图片、音频、视频等文件,不存储在数据库中,而是上传到某个服务器上,然后在表中存储这个文件的保存路径.
- 字符串 text 表示存储大文本,当字符大于 4000 时推荐使用, 比如技术博客.
2,数据约束
约束本质上是对数据在数据类型限定的基础上添加的额外的要求.
常见的约束如下:
- 主键 primary key: 物理上存储的顺序. MySQL 建议所有表的主键字段都叫 id, 类型为 int unsigned.
- 非空 not null: 此字段不允许填写空值.
- 惟一 unique: 此字段的值不允许重复.
- 默认 default: 当不填写字段对应的值会使用默认值,如果填写时以填写为准.
- 外键 foreign key: 对关系字段进行约束, 当为关系字段填写值时, 会到关联的表中查询此值是否存在, 如果存在则填写成功, 如果不存在则填写失败并抛出异常.
说明:虽然外键约束可以保证数据的有效性, 在进行数据的 crud, 会降低数据库的性能, 此种情况下不推荐使用, 那么数据的有效性怎么保证呢?
可以从代码编写中进行控制. 外键详细用法在第三天数据库课程中
3,数据类型附录表
1. 整数类型
类型 | 字节大小 | 有符号范围(Signed) | 无符号范围(Unsigned) |
---|---|---|---|
TINYINT | 1 | -128 ~ 127 | 0 ~ 255 |
SMALLINT | 2 | -32768 ~ 32767 | 0 ~ 65535 |
MEDIUMINT | 3 | -8388608 ~ 8388607 | 0 ~ 16777215 |
INT/INTEGER | 4 | -2147483648 ~2147483647 | 0 ~ 4294967295 |
BIGINT | 8 | -9223372036854775808 ~ 9223372036854775807 | 0 ~ 18446744073709551615 |
2. 字符串
类型 | 字节大小 | 示例 |
---|---|---|
CHAR | 0-255 | 类型:char(3) 输入 'ab', 实际存储为'ab ', 输入'abcd' 实际存储为 'abc' |
VARCHAR | 0-255 | 类型:varchar(3) 输 'ab',实际存储为'ab', 输入'abcd',实际存储为'abc' |
TEXT | 0-65535 | 大文本 |
3. 日期时间类型
类型 | 字节大小 | 示例 |
---|---|---|
DATE | 4 | '2020-01-01' |
TIME | 3 | '12:29:59' |
DATETIME | 8 | '2020-01-01 12:29:59' |
YEAR | 1 | '2017' |
TIMESTAMP | 4 | '1970-01-01 00:00:01' UTC ~ '2038-01-01 00:00:01' UTC |
4,总结
- 数据类型影响着数据中存储的数据所占的对数据进行最基本的类型约束、空间大小.
- MySQL 中尽量使用占用空间较小的类型.
- MySQL 约束本质上是对数据在数据类型限定的基础上添加的额外的要求.
- MySQL 数据库常见约束如下: . 主键 primary key: 物理上存储的顺序. . 非空 not null: 此字段不允许填写空值. . 惟一 unique: 此字段的值不允许重复. . 默认 default: 当不填写字段对应的值会使用默认值,如果填写时以填写为准. *. 外键 foreign key: 对关系字段进行约束, 当为关系字段填写值时, 会到关联的表中查询此值是否存在, 如果存在则填写成功, 如果不存在则填写失败并抛出异常.
三,登录和登出数据库
数据库操作的基本步骤:
启动数据库服务器,连接数据库 输入用户名和密码,完成对数据库的操作,完成对表结构和表数据的操作,退出数据库
1,启动服务
sudo service mysql start
2,停止服务
sudo service mysql stop
3,重启服务
sudo service mysql restart
4,查看进程中是否存在mysql服务
ps -aux | grep 'mysql'
5,登陆mysql
1) mysql -uroot -p #
回车后输入密码
2)mysql -uroot -p(password)
6,退出登录
1) quit
2) exit
3)ctrl + d
7,登录成功后,输入如下命令查看效果
查看版本:select version();
显示当前时间:select now();
8,修改mysql 密码
首先登录mysql,
格式:mysql> set password for 用户名@localhost = password('新密码');
例子:mysql> set password for root@localhost = password('123');
四,数据库的操作
1,查看所有数据库
show databases;
2,查看当前使用的数据库
select database();
3,显示数据库创建过程
show create database 数据库名;
4,使用数据库
use 数据库名;
5,创建数据库
create database 数据库名 charset=utf8;
例:
create database python charset=utf8;
6,删除数据库-慎重
drop database 数据库名;
例:
drop database python;
五,表的操作
表的操作:
1,查看当前数据库中所有表
show tables;
2,查看表的创建语句-详细过程
show create table 表名;
例:
show create table classes;
3,创建表
CREATE TABLE 表名(
字段名称 数据类型 可选的约束条件,
column1 datatype contrai,
column2 datatype,
.....
columnN datatype,
--
PRIMARY KEY(one or more columns) # 主键说明可以放在字段中单独说明 也可以放在最后统一说明
);
例:创建学生表
create table students(
id int unsigned primary key auto_increment not null, # auto_increment表示自动增长
name varchar(20) default '',
age tinyint unsigned default 0,
height decimal(5,2),
gender enum('男','女','人妖','保密'),
cls_id int unsigned default 0
)
4,删除表
drop table 表名;
例:
drop table students;
表中字段(列名)的操作:
1,增加表结构字段
alter table 表名 add 列名 类型;
例:
alter table students add birthday datetime;
2,删除表结构字段
alter table 表名 drop 列名;
例:
alter table students drop birthday;
3,修改表结构字段
1),重命名版(在表中已有字段 但是字段名不满足要求 类型或约束满足或者不满足均可)
alter table 表名 change 原名 新名 类型及约束;
例:
alter table students change birthday birth datetime not null;
2),不重命名版(在表中已有字段 并且字段名也满足要求 但是类型或约束不满足要求)
alter table 表名 modify 列名 类型及约束;
例:
alter table students modify birth date not null;
4,查看表结构字段
desc 表名;
六,表内数据的操作(增删改查(curd))
curd的解释: 代表创建(Create)、更新(Update)、读取(Retrieve/Read)和删除(Delete)
1,增
格式: insert [into] 表名 values(...)
注意: 主键列是自动增长,但是在全列插入时需要占位,通常使用空值(0或者null) ; 字段默认值 default 来占位,插入成功后以实际数据为准
1)全列插入
insert into 表名 values (...);
例:
insert into students values(0,’郭靖‘,1,'蒙古','2016-1-2');
注意: 主键字段 可以用 0 null default 来占位
实例:
-- 向classes表中插入 一个班级
insert into classes values(0, "菜鸟班");
+--------+-------------------------------------+------+-----+------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------------------------------+------+-----+------------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(30) | YES | | NULL | |
| age | tinyint(3) unsigned | YES | | 0 | |
| gender | enum('男','女','中性','保密') | YES | | 保密 | |
| cls_id | int(10) unsigned | YES | | NULL | |
| birth | date | YES | | 2000-01-01 | |
+--------+-------------------------------------+------+-----+------------+----------------+
-- 向students表插入 一个学生信息
insert into students values(0, "小李飞刀", 20, "女", 1, "1990-01-01");
insert into students values(null, "小李飞刀", 20, "女", 1, "1990-01-01");
insert into students values(default, "小李飞刀", 20, "女", 1, "1990-01-01");
-- 失败
-- insert into students values(default, "小李飞刀", 20, "第4性别", 1, "1990-02-01");
-- 枚举中 的 下标从1 开始 1---“男” 2--->"女"....
insert into students values(default, "小李飞刀", 20, 1, 1, "1990-02-01");
2)部分插入
insert into 表名 (列1,...) values(值1,...);
例:
insert into students(name,hometown,birthday) values('黄蓉','桃花岛','2016-3-2');
实例:
-- insert into 表名(列1,...) values(值1,...)
insert into students (name, gender) values ("小乔", 2);
3)多行插入
insert into 表名(列1,...) values(值1,...),(值1,...)...;
例:
insert into students(name) values('杨康'),('杨过'),('小龙女');
实例:
insert into students (name, gender) values ("大乔", 2),("貂蝉", 2);
insert into students values(default, "西施", 20, "女", 1, "1990-01-01"), (default, "王昭君", 20, "女", 1, "1990-01-01");
2,修改
update 表名 set 列1=值1,列2=值2... where 条件;
例:
update students set gender=0,hometown='北京' where id=5;
实例:
update students set gender=1; -- 全部都改
update students set gender=1 where name="小李飞刀"; -- 只要name是小李飞刀的 全部的修改
update students set age=22, gender=1 where id=3; -- 只要id为3的 进行修改
3,查
1)查询所有列
select * from 表名;
例:
select * from classes;
2)查询指定列
select 列1,列2,... from 表名;
例:
select id,name from classes;
3)查询按条件
select * from students where name="小李飞刀"; -- 查询 name为小李飞刀的所有信息
select * from students where id>3; -- 查询 name为小李飞刀的所有信息
4)-- 可以使用as为列或表指定别名
-- select 字段[as 别名] , 字段[as 别名] from 数据表 where ....;
select name as 姓名,gender as 性别 from students;
5)-- 字段的顺序
select id as 序号, gender as 性别, name as 姓名 from students;
4,删
1)物理删除
delete from 表名 where 条件;
例:
delete from students where id=5;
实例:
delete from students; -- 整个数据表中的所有数据全部删除
delete from students where name="小李飞刀";
2)逻辑删除
update students set isdelete=1 where id=1;
-- 用一个字段来表示 这条信息是否已经不能再使用了
-- 给students表添加一个is_delete字段 bit 类型
alter table students add is_delete bit default 0;
update students set is_delete=1 where id=6;
注:
总结:
查询句式: select 字段名称 [as 别名] from 表;
更新句式: update 表名 set 字段名=新值 where 条件;
插入句式: insert into 表名 [全列插不填字段名] values ()[,(),()]
删除句式: delete from 表名 where 条件;