MySQL 数据库基础入门
一、简介:
1.数据:
数据就是数据库中存储的基本对象,比如数字1,2,3,4,5,6等,就是简单的一种数据。准备的说:描述事物的符号记录称为数据(描述符号可以是数字、文字、图像、声音等),它们都可经过数字化存入计算机
。
2.数据库:
数据库就是存放数据的仓库
,这个仓库是在计算机存储设备上,并按一定的格式存放。
数据库三个基本特点:
1.永久存储:长期存储在计算机内
2.有组织:数据按一定的数据模型组织进行存储
3.可共享:只要每个用户连接到数据库,都可以共享此数据
3.数据库管理系统(DBMS):
数据库管理系统是位于用户和操作系统之间的一层数据管理软件
。
4.数据库系统(DBS):
数据库系统:在计算机系统中引入数据后的系统,一般由数据库、数据库管理系统、应用系统、数据库管理员构成
。
一般情况我们都称数据库系统为数据库。
二、关系型数据库与非关系型数据库:
1.关系型数据库:
关系型数据库:数据结构是表,由二维表联系所组成的一个数据组织
常用的关系型数据库:
1.Oracle Datebase:甲骨文公司的数据库管理系统
2.SQL Server:微软公司的数据库管理系统
3.DB2:IBM 公司的数据库管理系统
4.PostgreSQL:开源的数据库管理系统
5.MySQL:开源的数据库管理系统
1.1.优点:
1.体积较小;
2.成本较低;
3.开源;
4.使用方便;
5.支持复杂查询;
6.易于维护;
7.支持多种操作系统;
8.支持多种语言连接操作;
1.2.分析优点:
1.MySQL 的核心程序采用完全的多线程编程
,线程是轻量级的进行,它可以灵活为用户提供服务。用多线程和C语言实现的mysql能很容易充分利用CPU
。
2.MySql有一个非常灵活而且安全的权限和口令系统
。当客户端与MySql服务器连接时,他们之间所有的口令传送被加密,而且MySql支持主机认证
;
3.支持大型的数据库, 可以方便地支持上千万条记录的数据库
。
4.拥有一个非常快速而且稳定的基于线程的内存分配系统
,可以持续使用面不必担心其稳定性。
5.MySQL可用于Unix,Windows,以及OS/2等平台。
1.3.缺点:
1.若海量数据时,读写性能较差;
2.固定的表结构,灵活度较差;
3.高并发读写需求,硬盘I/O是很大瓶颈;
2.非关系型数据库:
非关系型数据库:严格说并不是一种数据库,而是一种数据结构化存储方法的集合,可以是文档或键值对
。
常用的非关系型数据库:
1.Redis;
2.MongoDB;
2.1.优点:
1.格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等;
2.速度快:非关系型数据库可以使用硬盘或内存作为载体,而关系型数据库只能使用硬盘;
3.高扩展性;
4.成本低:部署简单;
2.2.缺点:
1.不提供SQL语句支持,学习和使用成本较高;
2.数据结构相对复杂,面对复杂查询不是很友善;
三、SQL简介:
1:什么是SQL?
SQL:是用来操作数据的一种语言
。
简单理解:数据库中的数据,都是放在硬盘上
,连接数据库之后,需要使用SQL语言指定
地告诉它,需要什么样的数据。
2:SQL功能:
1.数据查询:select
2.数据定义:create、drop、alter
3.数据操纵:insert、update、delete
4.数据控制:grant、revoke
四、数据库、表基本操作:
1.数据库操作:
查看所有库:show databases;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| fe_cow |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.01 sec
选库语句:use [库名]
mysql> use fe_cow;
Database changed
创建数据库:create database [数据库名] charset [utf8 字符集]
mysql> create database student charset utf8;
Query OK, 1 row affected (0.02 sec)
# 查看新建的数据库:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| fe_cow |
| mysql |
| performance_schema |
| student | # 新建的数据库
| sys |
+--------------------+
6 rows in set (0.00 sec)
删除数据库:drop database [数据库名]
# 此操作需谨慎!!!
mysql> drop database student;
Query OK, 0 rows affected (0.08 sec)
数据库改名:Mysql中,表/列可以改名,但是数据库不能改名
2.数据库下表操作:
查看所有表:show tables;
mysql> show tables;
+-------------------+
| Tables_in_student |
+-------------------+
| class |
+-------------------+
创建表:create table [指定表名] (设置表字段) engine [指表引擎] charset [字符集]
mysql> create table class (id int, name varchar(10))engine myisam charset utf8;
Query OK, 0 rows affected (0.03 sec)
# 查看新创建的表:
mysql> show tables;
+-------------------+
| Tables_in_student |
+-------------------+
| class |
+-------------------+
1 row in set (0.00 sec)
修改表名:rename table [老表名] to [新表名]
mysql> rename table class to new_class;
Query OK, 0 rows affected (0.01 sec)
# 查看当前表:
mysql> show tables;
+-------------------+
| Tables_in_student |
+-------------------+
| new_class |
+-------------------+
1 row in set (0.00 sec)
查看表结构:desc [表名]
mysql> desc new_class;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.04 sec)
修改表结构:alter table [指定表名] add [新增字段名] (设置数据类型)
mysql> desc class;
# 查看表现有结构
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| gender | char(6) | YES | | NULL | |
| age | int(2) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.02 sec)
# 给class 表增加字段名为nickname 类型属于varchar类型
mysql> alter table class add nickname varchar(20);
Query OK, 0 rows affected (0.14 sec)
Records: 0 Duplicates: 0 Warnings: 0
# 查看目前表的结构
mysql> desc class;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| gender | char(6) | YES | | NULL | |
| age | int(2) | YES | | NULL | |
| nickname | varchar(20) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
删除表:drop table [表名]
mysql> drop table new_class;
Query OK, 0 rows affected (0.01 sec)
# 查看表:
mysql> show tables;
Empty set (0.00 sec)
清空表数据:truncate [表名]
mysql> truncate class;
Query OK, 0 rows affected (0.03 sec)
删除表数据:delete from [表名]
mysql> delete from class ;
Query OK, 2 rows affected (0.01 sec) # 2 rows 表示删除数据的行数
truncate和delete区别:
truncate 相当于删除表,再重新创建一张同样结构的表,操作之后得到一张全新的表。
delete 相当于从删除所有的层面来操作。
如果表中的主键是自增型的,使用truncate的话,主键ID从1开始记起;
若决定清空表中数据的话,建议使用truncate,速度会更快一些
五、增删改查(CURD)基本操作:
1.增:
值与列,按顺序一一对应
技巧:
1.插入那张表? insert into [表名]
2.插入那几列? (列1, 列2, 列n)
3.这几列分别插入什么值? values(值1, 值2,值n)
增加:insert into [表名] (列1, 列2, 列n) values(值1,值2,值n)
插入部分列:
# 仅仅插入名字和年龄的数据:
mysql> insert into class (name, age) values('ali', 10);
Query OK, 1 row affected (0.01 sec)
# 查看表中数据:
mysql> select * from class;
+------+------+--------+------+
| id | name | gender | age |
+------+------+--------+------+
| NULL | ali | NULL | 10 |
+------+------+--------+------+
1 row in set (0.00 sec)
插入所有列:
# 往class 表中插入所有列的数据
mysql> insert into class (id, name, gender, age) values(2, 'pig', 'sex', 10);
Query OK, 1 row affected (0.01 sec)
# 查看当前表中的数据
mysql> select * from class;
+------+------+--------+------+
| id | name | gender | age |
+------+------+--------+------+
| NULL | ali | NULL | 10 |
| 2 | pig | sex | 10 |
+------+------+--------+------+
2 rows in set (0.00 sec)
简写插入所有列的写法:
# 所有列的写法
mysql> insert into class values(3, 'she', 'sex', 12);
Query OK, 1 row affected (0.01 sec)
# 查看表中数据:
mysql> select * from class;
+------+------+--------+------+
| id | name | gender | age |
+------+------+--------+------+
| NULL | ali | NULL | 10 |
| 2 | pig | sex | 10 |
| 3 | she | sex | 12 |
+------+------+--------+------+
3 rows in set (0.00 sec)
批量插入:
mysql> insert into class values(3, 'she', 'sex', 12), (4, 'her', 'sex', 13), (5, 'it', 'sex', 15);
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
# 查看表中数据:
mysql> select * from class;
+------+------+--------+------+
| id | name | gender | age |
+------+------+--------+------+
| NULL | ali | NULL | 10 |
| 2 | pig | sex | 10 |
| 3 | she | sex | 12 |
| 3 | she | sex | 12 |
| 4 | her | sex | 13 |
| 5 | it | sex | 15 |
+------+------+--------+------+
6 rows in set (0.00 sec)
2.改:
技巧:
1.改哪张表? update [表名]
2.改哪几列的值? set 列1 = 新值1
3.在哪列进行更改? where 列1 = 值1
更改:update [表名] set 列1 = 新值1 where [表达式]
注意:更改操作的时候,不指定WHERE [表达式]的话,会将整个表中列对应的值进行更改
# 先查看表中数据:
mysql> select * from class;
+------+------+--------+------+
| id | name | gender | age |
+------+------+--------+------+
| NULL | ali | NULL | 10 |
| 2 | pig | sex | 10 |
| 3 | she | sex | 12 |
| 3 | she | sex | 12 |
| 4 | her | sex | 13 |
| 5 | it | sex | 15 |
+------+------+--------+------+
6 rows in set (0.00 sec)
# 使用WHERE 后面的表达式, 进行更改:
mysql> update class set gender = 'woman';
Query OK, 6 rows affected (0.01 sec)
Rows matched: 6 Changed: 6 Warnings: 0
# 查看当前表中数据, 可以看出将所有gender列中的值, 进行更改:
mysql> select * from class;
+------+------+--------+------+
| id | name | gender | age |
+------+------+--------+------+
| NULL | ali | woman | 10 |
| 2 | pig | woman | 10 |
| 3 | she | woman | 12 |
| 3 | she | woman | 12 |
| 4 | her | woman | 13 |
| 5 | it | woman | 15 |
+------+------+--------+------+
6 rows in set (0.00 sec)
指定更改:
# 将class表中,age=10的, 将gender列对应的值更改为'man'
mysql> update class set gender = 'man' where age = 10;
Query OK, 2 rows affected (0.01 sec)
Rows matched: 2 Changed: 2 Warnings: 0
# 查看当前表中的值:
mysql> select * from class;
+------+------+--------+------+
| id | name | gender | age |
+------+------+--------+------+
| NULL | ali | man | 10 |
| 2 | pig | man | 10 |
| 3 | she | woman | 12 |
| 3 | she | woman | 12 |
| 4 | her | woman | 13 |
| 5 | it | woman | 15 |
+------+------+--------+------+
6 rows in set (0.00 sec)
3.查:
技巧:
1.查哪张表的数据?
2.查哪些列的数据?
3.查哪些行的数据?
查:select 列1, 列2, 列n from [表名] where [表达式]
查询整张表,所有列的数据:
# 查看class表中所有的列的数据
mysql> select * from class;
+------+------+--------+------+
| id | name | gender | age |
+------+------+--------+------+
| NULL | ali | man | 10 |
| 2 | pig | man | 10 |
| 3 | she | woman | 12 |
| 3 | she | woman | 12 |
| 4 | her | woman | 13 |
| 5 | it | woman | 15 |
+------+------+--------+------+
6 rows in set (0.00 sec)
查询该表,将指定列的数据进行返回:
# 查询class表中, name 跟age 列的数据, 并且满足 age > 10的数据:
mysql> select name, age from class where age > 10 ;
+------+------+
| name | age |
+------+------+
| she | 12 |
| she | 12 |
| her | 13 |
| it | 15 |
+------+------+
4 rows in set (0.00 sec)
4.删:
技巧:
1.从哪张表删除数据?
2.要删除哪些行?
删除:delete from [表名] where [表达式]
删除表达式为真的数据:
# 删除class表中, age = 10 的数据
mysql> delete from class where age = 10;
Query OK, 2 rows affected (0.01 sec)
mysql> select * from class;
+------+------+--------+------+
| id | name | gender | age |
+------+------+--------+------+
| 3 | she | woman | 12 |
| 3 | she | woman | 12 |
| 4 | her | woman | 13 |
| 5 | it | woman | 15 |
+------+------+--------+------+
4 rows in set (0.00 sec)
删除该表中所有的数据:
# 不设置表达式,执行该命令会将表中所有的数据进行删除
mysql> delete from class;
Query OK, 4 rows affected (0.01 sec)
mysql> select * from class;
Empty set (0.00 sec)
注意:对数据进行删除、修改时需要加以小心