Mysql 基本操作

** 目标

  1. 了解数据库的发展史---文件系统->一代模型:层次,网状模型-> 关系型模型
  2. 了解什么是SQL语句----structured query language(结构化查询语句)
  3. 了解启动和停止MySQL服务器 ----Windows: net net start/stop mysql
  4. 能够连接MySQL数据库---mysql -h(ip地址) -u(用户名) -p(密码) -P(端口号)
  5. 能够关闭数据库连接 ---exit / quit / (\q)
  6. 能够创建数据库 ---create database
  7. 能够查看所有数据库 --show databases
  8. 能够修改数据库的字符编码 ---alter database 名 charset=‘....’
  9. 能够删除数据库 ---drop database 名
  10. 能够选择数据库 ---use 名
  11. 能够创建表 --- create table 名
  12. 能够查看当前数据库中的所有表 ---show databases
  13. 能够查看表结构 ---desc(ribe) 名
  14. 能够查看创建表的SQL语句 --- show create table 名
  15. 能够能够复制表
    ---[复制表数据]create table 新名 select [column] 字段 from
    --- [复制表结构]create table 新名 like 名
  16. 能够给表添加字段 --- alter table 名 add 字段名 字段属性 [位置: first , after ]
  17. 能够给表删除字段 --- alter table 名 drop【column】字段
  18. 能够修改表字段
    ---alter table 名 change 字段名 新名 字段属性
    --- alter table 名 midify 字段名 新字段属性
  19. 能够修改表引擎 ---alter table 名 engine= 名
  20. 能够修改表名 --- alter table 名 rename to 新名
  21. 能够向表中添加数据 -- insert into table名 set (字段。。。) values (. ..)
  22. 能够修改表中的数据 -- update table名 set 字段= [where ]
  23. 能够删除表中的数据 -- delete from table名 [where]
  24. 清空表 --truncate table 名

1.数据库作用

数据库:存放数据的仓库,数据库中存放的是表,一个数据库中可以存放多个表

表:表是用来存放数据的。


2. 数据库的发展史

2.1 萌芽阶段:文件系统

最初始的数据库是用磁盘来存储数据的。文件就是最早的数据库。

2.2 第一代数据库:层次模型、网状模型

2.2.1 层次模型

缺点:
1、 查找不同类的数据效率低了(导航的结构的缺点)

2、 数据不完整(不能区分到底是一个李白还是两个李白)

2.2.2 网状模型

网状模型解决了层次数据的数据不完整的问题,但是没有解决层次模型的导航问题。

2.3 第二代数据库:关系型数据库

特点:

  1. 每个表都是独立的

  2. 表与表之间通过公共字段来建立关系

优点:解决了导航问题,并且数据完整性得到解决

缺点:多表查询效率低了

提示:我们现在用的主流的数据库都是关系模型的。

多学一招:NoSQL(非关系型数据库)解决关系型数据库多表查询效率的问题,常见的非关系型数据库有:Redis、mongodb。数据库中存储格式是键值对。

3. Mysql 目录

image.png

4. SQL 介绍

4.1 SQL是什么

Structured Query Language(结构化查询语言),是用来操作关系型数据库的一门语言。这是一个关系型数据库的通用操作语言,也成为标准SQL,也叫SQL-92。

多学一招:数据库的生产厂商为了占有市场份额,都会在标准SQL的基础上扩展一些自己的东西以吸引用户。

4.2 常见的关系型数据库

关系型数据库 开发公司 使用语言
SQL Server 微软公司 T-SQL
Oracle 甲骨文公司 PL/SQL
MySQL MySQL AB 公司开发——甲骨文公司收购 MySQL

思考:已知标准SQL可以在所有的关系型数据库上运行,在Oracle上编写的PL/SQL能否在MySQL上运行?

答:不能,只能运行标准SQL

5.连接服务器

通过命令行面板连接

host:主机 -h
username:用户名 -u
password:密码 -p
port:端口 -P

方法一:

方法二:

多学一招:如果MySQL服务器在本地,IP地址可以省略;如果MySQL服务器用的是3306端口,-P也是可以省略

6. 关闭连接

方法一:exit
方法二:quit
方法三:\q


脚下留心:MySQL中的命令后面要加分号

7.数据库的操作

7.1 显示数据库

语法:show databases 
 mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.11 sec)

安装MySQL后,MySQL自带了4个数据库

  1. information_schema:存储了MySQL服务器管理数据库的信息。
  2. performance_schema:MySQL5.5新增的表,用来保存数据库服务器性能的参数
  3. mysql:MySQL系统数据库,保存的登录用户名,密码,以及每个用户的权限等等
  4. test:给用户学习和测试的数据库。

7.2 创建数据库

语法:create database [if not exists] `数据名` [字符编码]

 create database stu;
Query OK, 1 row affected (0.09 sec)

如果创建的数据库已存在,就会报错

 create database stu;
ERROR 1007 (HY000): Can't create database 'stu'; database exists

解决:创建数据库的时候判断一下数据库是否存在,如果不存在再创建

create database if not exists stu;
Query OK, 1 row affected, 1 warning (0.00 sec)

如果数据库名是关键字和特殊字符要报错

解决:在特殊字符、关键字行加上反引号

create database `create`;
Query OK, 1 row affected (0.05 sec)

多学一招:为了创建数据库时万无一失,我们可以在所有的数据库名上加上反引号

创建数据库的时候可以指定字符编码

create database teacher charset=gbk;
Query OK, 1 row affected (0.01 sec)

gbk     简体中文
gb2312: 简体中文
utf8:   通用字符编码

脚下留心:创建数据库如果不指定字符编码,默认和MySQL服务器的字符编码是一致的。

7.4 删除数据库

语法:drop database [if exists] 数据库名

删除数据库

 drop database teacher;
Query OK, 0 rows affected (0.00 sec)

如果删除的数据库不存在,会报错

 drop database teacher;
ERROR 1008 (HY000): Can't drop database 'teacher'; database doesn't exist

解决:删除之前判断一下,如果存在就删除

drop database if exists teacher;
Query OK, 0 rows affected, 1 warning (0.00 sec)

7.5 显示创建数据库的SQL语句

语法:show create database 数据库名
 show create database stu;
+----------+--------------------------------------------------------------+
| Database | Create Database                                              |
+----------+--------------------------------------------------------------+
| stu      | CREATE DATABASE `stu` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+--------------------------------------------------------------+
1 row in set (0.01 sec)

mysql> show create database teacher;
+----------+-----------------------------------------------------------------+
| Database | Create Database                                                 |
+----------+-----------------------------------------------------------------+
| teacher  | CREATE DATABASE `teacher` /*!40100 DEFAULT CHARACTER SET gbk */ |
+----------+-----------------------------------------------------------------+
1 row in set (0.00 sec)

7.6 修改数据库

修改数据库的字符编码

语法:

alter database 数据库名 charset=字符编码
alter database teacher charset=utf8;
Query OK, 1 row affected (0.00 sec)
show create database teacher;

+----------+------------------------------------------------------------------+
| Database | Create Database                                                  |
+----------+------------------------------------------------------------------+
| teacher  | CREATE DATABASE `teacher` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+------------------------------------------------------------------+
1 row in set (0.00 sec)

7.7 选择数据库

语法:

use 数据库名

选择数据库

mysql> use stu;
Database changed

8.表的操作

8.1 显示所有表

语法:

show tables

8.2 创建表

语法:

create table [if not exists] 表名(
    字段名 数据类型 [null|not null] [auto_increment] [primary key] [comment],
    字段名 数据类型 [default]…
)engine=存储引擎

单词

null | not null     空|非空
default             默认值
auto_increment      自动增长
primary key         主键
comment             备注
engine              引擎   innodb  myisam  memory  引擎是决定数据存储的方式

创建简单的表

 create database itcast;
Query OK, 1 row affected (0.00 sec)
 use itcast;
Database changed
 show tables;
Empty set (0.05 sec)

 create table stu(             #创建表
    -> id int,
    -> name varchar(30)
    -> );
Query OK, 0 rows affected (0.13 sec)

 show tables;     
+------------------+
| Tables_in_itcast |
+------------------+
| stu              |
+------------------+

创建复杂的表

set names gbk;     
Query OK, 0 rows affected (0.05 sec)

create table if not exists teacher(
   -> id int auto_increment primary key comment '主键',
   -> name varchar(20) not null comment '姓名',
   -> phone varchar(20) comment '电话号码',
   -> `add` varchar(100) default '地址不详' comment '地址'
   -> )engine=innodb;
Query OK, 0 rows affected (0.09 sec)

多学一招:create table 数据库名.表名,用于给指定的数据库创建表

create table data.stu(  #给data数据库中创建stu表
   -> id int,
   -> name varchar(10));
Query OK, 0 rows affected (0.00 sec)

8.3 显示创建表的语句

语法:

show create table 表名

显示创建teacher表的语句

 show create table teacher;
+---------+--------------------------------------------------------------------------
-------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
-------+
| Table   | Create Table


       |
+---------+--------------------------------------------------------------------------
-------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
-------+
| teacher | CREATE TABLE `teacher` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(20) NOT NULL COMMENT '姓名',
  `phone` varchar(20) DEFAULT NULL COMMENT '电话号码',
  `add` varchar(100) DEFAULT '地址不详' COMMENT '地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8                         |

将两个字段竖着排列 show create table 表名\G

show create table teacher\G;
-------------------------------------
      Table: teacher
Create Table: CREATE TABLE `teacher` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
 `name` varchar(20) NOT NULL COMMENT '姓名',
 `phone` varchar(20) DEFAULT NULL COMMENT '电话号码',
 `add` varchar(100) DEFAULT '地址不详' COMMENT '地址',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

8.4 查看表结构

语法:

desc[ribe] 表名

查看teacher表的结构

 describe teacher;
+-------+--------------+------+-----+----------+----------------+
| Field | Type         | Null | Key | Default  | Extra          |
+-------+--------------+------+-----+----------+----------------+
| id    | int(11)      | NO   | PRI | NULL     | auto_increment |
| name  | varchar(20)  | NO   |     | NULL     |                |
| phone | varchar(20)  | YES  |     | NULL     |                |
| add   | varchar(100) | YES  |     | 地址不详        |                |
+-------+--------------+------+-----+----------+----------------+
4 rows in set (0.08 sec)

 desc teacher;
+-------+--------------+------+-----+----------+----------------+
| Field | Type         | Null | Key | Default  | Extra          |
+-------+--------------+------+-----+----------+----------------+
| id    | int(11)      | NO   | PRI | NULL     | auto_increment |
| name  | varchar(20)  | NO   |     | NULL     |                |
| phone | varchar(20)  | YES  |     | NULL     |                |
| add   | varchar(100) | YES  |     | 地址不详        |                |
+-------+--------------+------+-----+----------+----------------+
4 rows in set (0.01 sec)

8.5 删除表

语法:

drop table [if exists] 表1,表2,… 

删除表

mysql> drop table stu;
Query OK, 0 rows affected (0.08 sec)

如果删除一个不存在的表就会报错,删除的时候可以判断一下,存在就删除。

 drop table stu;
ERROR 1051 (42S02): Unknown table 'stu'

 drop table if exists stu;
Query OK, 0 rows affected, 1 warning (0.00 sec)

可以一次删除多个表

drop table a1,a2;
Query OK, 0 rows affected (0.00 sec)

8.6 修改表

语法:alter table 表名

1、添加字段:alter table 表名add [column] 字段名 数据类型 [位置]

例题一:添加字段

alter table teacher add age int;
Query OK, 0 rows affected (0.09 sec)
Records: 0  Duplicates: 0  Warnings: 0

desc teacher;
+-------+--------------+------+-----+----------+----------------+
| Field | Type         | Null | Key | Default  | Extra          |
+-------+--------------+------+-----+----------+----------------+
| id    | int(11)      | NO   | PRI | NULL     | auto_increment |
| name  | varchar(20)  | NO   |     | NULL     |                |
| phone | varchar(20)  | YES  |     | NULL     |                |
| add   | varchar(100) | YES  |     | 地址不详        |                |
| age   | int(11)      | YES  |     | NULL     |                |
+-------+--------------+------+-----+----------+----------------+
5 rows in set (0.00 sec)

例题二:在第一个位置上添加字段

 alter table teacher add email varchar(30) first;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

 desc teacher;
+-------+--------------+------+-----+----------+----------------+
| Field | Type         | Null | Key | Default  | Extra          |
+-------+--------------+------+-----+----------+----------------+
| email | varchar(30)  | YES  |     | NULL     |                |
| id    | int(11)      | NO   | PRI | NULL     | auto_increment |
| name  | varchar(20)  | NO   |     | NULL     |                |
| phone | varchar(20)  | YES  |     | NULL     |                |
| add   | varchar(100) | YES  |     | 地址不详        |                |
| age   | int(11)      | YES  |     | NULL     |                |
+-------+--------------+------+-----+----------+----------------+

例题三:在指定的字段后添加字段

alter table teacher add sex varchar(2) after name;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

 desc teacher;
+-------+--------------+------+-----+----------+----------------+
| Field | Type         | Null | Key | Default  | Extra          |
+-------+--------------+------+-----+----------+----------------+
| email | varchar(30)  | YES  |     | NULL     |                |
| id    | int(11)      | NO   | PRI | NULL     | auto_increment |
| name  | varchar(20)  | NO   |     | NULL     |                |
| sex   | varchar(2)   | YES  |     | NULL     |                |
| phone | varchar(20)  | YES  |     | NULL     |                |
| add   | varchar(100) | YES  |     | 地址不详        |                |
| age   | int(11)      | YES  |     | NULL     |                |
+-------+--------------+------+-----+----------+----------------+
7 rows in set (0.00 sec)

2、删除字段:alter table 表 drop [column] 字段名

mysql> alter table teacher drop email;
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

3、修改字段(改名改类型):alter table 表 change [column] 原字段名 新字段名 数据类型 …

将字段sex改为xingbie,数据类型为int

 alter table teacher change sex xingbie int;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

4、修改字段(不改名):alter table 表 modify 字段名 字段属性…

将性别的数据类型改为varchar(2)

alter table teacher modify xingbie varchar(2);
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

5、修改引擎:alter table 表名 engine=引擎名

alter table teacher engine=myisam;
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

6、修改表名:alter table 表名 rename to 新表名

alter table teacher rename to stu;
Query OK, 0 rows affected (0.00 sec)

show tables;
+------------------+
| Tables_in_itcast |
+------------------+
| stu              |
+------------------+
1 row in set (0.00 sec)

8.7 复制表

语法一:create table 新表 select 字段 from 旧表

特点:不能复制父表的主键,能够复制父表的数据

 create table stu1 select * from stu;
Query OK, 1 row affected (0.06 sec)
Records: 1  Duplicates: 0  Warnings: 0

select * from stu1;    
+----+------+------+-------+
| id | name | addr | score |
+----+------+------+-------+
|  1 | rose | 上海    |    88 |
+----+------+------+-------+
1 row in set (0.00 sec)

desc stu1;    
+-------+-------------+------+-----+----------+-------+
| Field | Type        | Null | Key | Default  | Extra |
+-------+-------------+------+-----+----------+-------+
| id    | int(11)     | NO   |     | 0        |       |
| name  | varchar(20) | NO   |     | NULL     |       |
| addr  | varchar(50) | YES  |     | 地址不详        |       |
| score | int(11)     | YES  |     | NULL     |       |
+-------+-------------+------+-----+----------+-------+
4 rows in set (0.00 sec)
语法二:create table 新表 like 旧表

特点:只能复制表结构,不能复制表数据

create table stu2 like stu
Query OK, 0 rows affected (0.00 sec)

mysql> select * from stu2;   
Empty set (0.01 sec)

mysql> desc stu2;  
+-------+-------------+------+-----+----------+----------------+
| Field | Type        | Null | Key | Default  | Extra          |
+-------+-------------+------+-----+----------+----------------+
| id    | int(11)     | NO   | PRI | NULL     | auto_increment |
| name  | varchar(20) | NO   |     | NULL     |                |
| addr  | varchar(50) | YES  |     | 地址不详        |                |
| score | int(11)     | YES  |     | NULL     |                |
+-------+-------------+------+-----+----------+----------------+
4 rows in set (0.00 sec)

8.8 数据操作

创建测试表

 create table stu(
    -> id int auto_increment primary key comment '主键',
    -> name varchar(20) not null,
    -> addr varchar(50) default '地址不详',
    -> score int comment '成绩'
    -> );
Query OK, 0 rows affected (0.01 sec)

8.8.1 插入数据

插入一条数据

语法:insert into 表名 (字段名, 字段名,…) values (值1, 值1,…)

例题一:插入数据

 insert into stu (id,name,addr,score) values (1,'tom','上海',88);
Query OK, 1 row affected (0.11 sec)

例题二:插入的字段可以和表的字段顺序不一致。值的顺序必须和插入字段的顺序一致。

 insert into stu (name,score,addr,id) values ('berry',77,'北京',2);
Query OK, 1 row affected (0.00 sec)

例题三:可以插入部分字段,但是,非空字段必须插入

 insert into stu (id,name,addr) values (3,'ketty','上海');

例题四:自动增长字段不用插入,数据库会自动插入增长的数字

 insert into stu (name,addr) values ('rose','北京');
Query OK, 1 row affected (0.00 sec)

例题五:自动增长列的值插入null即可

 insert into stu (id,name,addr,score) values (null,'李白','上海',66);
Query OK, 1 row affected (0.00 sec)

例题六:插入值的顺序和个数与表字段的顺序和个数一致,插入的字段可以省略

 insert into stu values (null,'杜甫','北京',null);
Query OK, 1 row affected (0.00 sec)

例题七:通过default关键字插入默认值

 insert into stu values (null,'李清照',default,66);

脚下留心:
1、插入字段的顺序与值的顺序必须一致

插入多条数据

insert into stu values (null,'辛弃疾',default,66),(null,'岳飞','河南',77);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

1.11.2 更新数据

语法:

update 表名 set 字段=值 [where 条件] 

例题一:将1号学生的地址改成山东

update stu set addr='山东' where id=1

例题二:将ketty的成绩改为99

 update stu set score=99 where name='ketty';

例题三:将berry地址改成上海,成绩改成66

 update stu set addr='上海',score=66 where name='berry';

例题四:将上海的学生成绩改为60

 update stu set score=60 where addr='上海';

例题五:条件可以省略,如果省略,更改所有数据(将所有数据的地址改为湖南,成绩改为70)

 update stu set addr='湖南',score=70;

例题六:将2、3的学生成绩改为65

 update stu set score=65 where id=2 or id=3;

8.9 删除数据

语法

delete from 表名 [where 条件] 

例题一:删除学号是1号的学生

delete from stu where id=1;

例题二:删除成绩小于等于65分的

delete from stu where score<=65;

例题三:删除表中所有记录

delete from stu;

8.10清空表

语法:

truncate table 表名

例题

 truncate table stu;
Query OK, 0 rows affected (0.00 sec)

脚下留心:delete from 表和truncate table 表区别?
delete from 表:遍历表记录,一条一条的删除
truncate table:将原表销毁,再创建一个同结构的新表。就清空表而言,这种方法效率高。

8.10查询表

语法:

select 列名 from 表

例题:

 select name,score from stu;
+------+-------+
| name | score |
+------+-------+
| rose |    88 |
+------+-------+
1 row in set (0.00 sec)

 select id,name,addr,score from stu;
+----+------+------+-------+
| id | name | addr | score |
+----+------+------+-------+
|  1 | rose | 上海    |    88 |
+----+------+------+-------+
1 row in set (0.00 sec)

 select * from stu;  
+----+------+------+-------+
| id | name | addr | score |
+----+------+------+-------+
|  1 | rose | 上海    |    88 |
+----+------+------+-------+
1 row in set (0.00 sec)

9. SQL分类

DDL(data definition language)数据库定义语言CREATE、ALTER、DROP、SHOW

DML(data manipulation language)数据操纵语言SELECT、UPDATE、INSERT、DELETE

DCL(Data Control Language)数据库控制语言,是用来设置或更改数据库用户或角色权限的语句

10. 数据表的文件介绍

一个数据库对应一个文件夹

一个表对应一个或多个文件

引擎是myisam,一个表对应三个文件

引擎是innodb,一个表对应一个表结构文件

所有的innodb引擎的数据统一的存放在data\ibdata1文件中。如果数据量很大,MySQL会自动的创建ibdata2,ibdata3,…,目的就是为了便于管理。

引擎是memory,数据存储在内存中,重启服务数据丢失,但是读取速度非常快。

你可能感兴趣的:(Mysql 基本操作)