目录
3.1非关系数据库也被称作NoSQL(Not Only SQL)
一数据库原理
1.1数据库系统管理系统(DBMS)
是实现对数据库资源有效组织,管理和存取的系统软件
数据库的建立和维护功能,数据定义功能,数据操控功能,数据库的运行管理功能,通信功能
1.2数据库系统
是一个人机系统,由硬件,OS,数据库,DBMS,应用软件和数据库用户组成
用户可以通过DBMS或应用程序操作数据库
1.3数据库系统发展阶段
萌芽阶段:文件系统
使用磁盘文件来存储数据
出现了网络模型,层次模型的数据库
中级阶段:第二代数据库
关系数据库和结构化查询语言
高级阶段:新一代数据库
“关系-对象”型数据库
1.4DBMS数据库管理系统
-
Database:数据库是数据的汇集,它以一定的组织形式存于存储介质上
-
DBMS:是管理数据库的系统软件,它实现数据库系统的各种功能。是数据库系统的核心
-
DBA:负责数据库的规划、设计、协调、维护和管理等工作
-
应用程序:指以数据库为基础的应用程序
1.5数据库管理系统的优点
相关联的数据的集合,较少的数据冗余,程序与数据互相独立,保证数据的安全,可靠。最大限度的保证数据的正确性,数据可以并发使用并能同时保证一致性。
1.6数据库管理系统的基本功能
数据定义
数据处理
数据安全
数据备份
1.7数据库系统的架构
单机架构
大型主机/终端架构
主从式架构(c/s)
分布式架构
1.8当今主数据库介绍
1.SQL Server(微软公司产品)
面向windows操作系统
简单,易用
2,Oracle(甲骨文公司产品)
面向所有主流平台
安全,完善,操作复杂
3.DB2(IBM公司产品)
面向所有主流平台
大型,安全,完善
4.MySQL(甲骨文公司收购)
免费开源体积小
二,数据库类型
2.1关系型数据库
关系数据库系统是基于关系模型的数据库系统
关系模型的数据结构使用简单易懂的二维数据表
关系数据库包含了实体,关系和属性三个要素
2.2关系型数据库相关概念
-
关系Relational :关系就是二维表,其中:表中的行、列次序并不重要
-
行row:表中的每一行,又称为一条记录record
-
列column:表中的每一列,称为属性,字段,域field
-
主键Primary key:PK , 用于惟一确定一个记录的字段,一张表只有一个主键
-
域domain:属性的取值范围,如,性别只能是'男'和'女'两个值,人类的年龄只能0-150
2.3常用关系数据库
- 关系型数据库:Oracle,、MySQL、SQL Server、Sybase、Informix、access、DB2、 FoxPRO
- 应用举例:12306用户信息系统、淘宝账号系统、联通手机号信息系统、银行用户账号系统、网站用户信息系统
2.4数据的操作
数据提取:在数据集合中提取感兴趣的内容。SELECT
数据更新:变更数据库中的数据。INSERT,DELETE,UPDATE
2.5数据库规划流程
收集数据,得到字段,手机必要且完整的数据项转换成数据表的字段
三,非关系数据库介绍
3.1非关系数据库也被称作NoSQL(Not Only SQL)
非存储数据不以关系模型为依据,不需要固定的表格是
非关系数据库的优点:
1易于维护:使用表结构,格式一致
2使用方便:SQL语言通用,可用于复杂查询
3复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询
缺点:
1读写性能比较差,尤其是海量数据的高效率读写
2固定的表结构,灵活性稍欠
3高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
3.2特点
性能卓越,服务稳定
开源,无版权限制,成本低
多线程,多用户
基于C/S(客户端/服务器)架构
安全可靠
三,安装MySQL
yum安装,编译安装参考架构
MySQL组成:
客户端程序
-
mysql: 交互式的CLI工具
-
mysqladmin:基于mysql协议管理mysqld
-
mysqlimport:数据导入工具
MyISAM存储引擎的管理工具:
-
myisamchk:检查MyISAM库
-
myisampack:打包MyISAM表,只读
服务器端程序
-
mysqld_safe
-
mysqld
-
mysqld_multi 多实例 ,示例:mysqld_multi
yum install mariadb-server -y #yum安装mysql
systemctl start mariadb.service
mysql
mysql_secure_installation
mysql命令:
mysql [OPTIONS] [database]
命令格式
-A, --no-auto-rehash 禁止补全
-u, --user= 用户名,默认为root
-h, --host= 服务器主机,默认为localhost
-p, --passowrd= 用户密码,建议使用-p,默认为空密码
-P, --port= 服务器端口
-S, --socket= 指定连接socket文件路径
-D, --database= 指定默认数据库
-C, --compress 启用压缩
-e "SQL" 执行SQL命令
-V, --version 显示版本
-v --verbose 显示详细信息
--print-defaults 获取程序默认使用的配置
#默认空密码登录
mysql -uroot -p
mysql>use mysql #切换数据库
mysql> select database(); #查看当前数据库
mysql>select user(); #查看当前用户
mysql>SELECT User,Host,Password FROM user;
mysql>system clear #清屏
mysql> ^DBye #ctrl+d 退出
mysqladmin命令
mysqladmin [OPTIONS] command command...
#查看mysql服务是否正常,如果正常提示mysqld is alive
mysqladmin -u用户 -p密码 ping
mysqladmin -uroot -p123123 ping
#关闭mysql服务,但mysqladmin命令无法开启
mysqladmin -uroot -pcentos shutdown
#创建数据库testdb
mysqladmin -uroot -pcentos create testdb
#删除数据库testdb
mysqladmin -uroot -pcentos drop testdb
#修改root密码
mysqladmin -uroot -pcentos password 'magedu'
#日志滚动,生成新文件/var/lib/mysql/mariadb-bin.00000N
mysqladmin -uroot -pcentos flush-logs
四,多实例介绍
什么是数据库多实例
多实例类似微信双开,端口号类比微信账号,数据库类比聊天窗口,表类比聊天记录
MySQL多实例就是在一台服务器上同时开启多个不同的服务端口(如3306,3307,3308等),同时运行多个MySQL服务进程,这些服务进程通过不同的Socket监听不同的服务端口来提供服务。
多实例可能是MySQL的不同版本,也可能是MySQL的同一版本实现。
多实例的好处
可有效利用服务器资源。相当单个服务求资源有限时候,可以充分利用剩余资源提供过多的服务,且可以实现资源的逻辑隔离节约服务器资源。例如,公司服务器资源紧张,但是数据库又需要各自尽量独立的提供服务,并且还需要到主从复制等技术,多实例就是最佳的选择。
-
多实例弊端
存在资源互相抢占的问题。比如:当某个数据库实例并发很高或者SQL查询慢时,整个实例会消耗
大量的CPU、磁盘I/O等资源,导致服务器上面其他的数据库实例在提供服务的质量也会下降,所以
具体的需求要根据自己的实际情况而定。
五,MySQL数据库管理基本操作
数据库——>数据表——>行(记录):用来描述一个对象的信息
数据库——>数据表——>列(字段):用来描述对象的一个属性
常用的数据类型:
int:整型
float:单精度浮点4字节32位
double:双精度浮点8字节64位
char:固定长度的字符类型
varchar:可变长度的字符类型
text:文本
image:图片
decimal(5,2):5个有效长度数字,小数点后面又2位
六,SQL分类
-
数据库:database
-
表:table,行:row 列:column
-
索引:index
-
视图:view
-
存储过程:procedure
-
存储函数:function
-
触发器:trigger
-
事件调度器:event scheduler,任务计划
-
用户:user
-
权限:privilege
SQL 语言规范
在数据库系统中,SQL 语句不区分大小写,建议用大写
SQL语句可单行或多行书写,默认以 " ; " 结尾
关键词不能跨多行或简写
用空格和TAB 缩进来提高语句的可读性
子句通常位于独立行,便于编辑,提高可读性
数据库对象和命名
数据库的组件(对象):
数据库、表、索引、视图、用户、存储过程、函数、触发器、事件调度器等
命名规则:
必须以字母开头,后续可以包括字母,数字和三个特殊字符(# _ $)
不要使用MySQL的保留字,tabble select show databases
mysql>help create #help后面跟上具体命令可以查看帮助
show charset;
#查看支持字符集
mysql> show databases;
#查看当前数据库
mysql> use mysql;
#使用 mysql表
MySQL root@localhost:school> select * form lgy;
#查看ky15表格的
六,管理数据库
6.1创建数据库
cd /etc/yum.repos.d
vim mysql.repo
[mysql]
name=mysql5.7
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-5.7-community-el7-x86_64/
gpgcheck=0
yum -y install mysql-community-server
systemctl start mysqld
ss -ntap |grep 3306
mysql -u root -p
grep password /var/log/mysqld.log
mysql -u root -p'/1Dva;aSyf=?'
status
alter user root@'localhost' identified by 'Lgy147896325.'; #更改密码
mysql>use mysql #切换数据库
mysql> select database(); #查看当前数据库
mysql>select user(); #查看当前用户
mysql>SELECT User,Host,Password FROM user;
mysql>system clear #清屏
mysql> ^DBye #ctrl+d 退出
#查看mysql版本
[root@centos7 ~]#mysql -V
#修改提示符
[root@localhost ~]#vim /etc/my.cnf
[mysql]
prompt=(\\u@\\h) [\\d]>\\_
auto-rehash
mysqladmin命令
mysqladmin [OPTIONS] command command...
#查看mysql服务是否正常,如果正常提示mysqld is alive
mysqladmin -u用户 -p密码 ping
mysqladmin -uroot -p123123 ping
#关闭mysql服务,但mysqladmin命令无法开启
mysqladmin -uroot -pcentos shutdown
#创建数据库testdb
mysqladmin -uroot -pcentos create testdb
#删除数据库testdb
mysqladmin -uroot -pcentos drop testdb
#修改root密码
mysqladmin -uroot -pcentos password 'magedu'
#日志滚动,生成新文件/var/lib/mysql/mariadb-bin.00000N
mysqladmin -uroot -pcentos flush-logs
七,管理数据库
7.1创建数据库
mysql> create database lgy;
Query OK, 1 row affected (0.00 sec)
mysql> show create database lgy;
+----------+----------------------------------------------------------------+
| Database | Create Database |
+----------+----------------------------------------------------------------+
| lgy | CREATE DATABASE `lgy` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+----------------------------------------------------------------+
1 row in set (0.00 sec)
7.2修改数据库
ALTER DATABASE DB_NAME character set utf8;
7.3删除数据库
mysql> drop database lgy1;
Query OK, 0 rows affected (0.00 sec)
7.4查看数据库列表
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db1 |
| lgy |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.00 sec)
mysql>
7.5数据类型
MySQL支持多种内置数据类型
数值类型
日期/时间类型
字符串(字符)类型
选择正确的数据类型对于获得高性能至关重要,三大原则:
-
更小的通常更好,尽量使用可正确存储数据的最小数据类型
-
简单就好,简单数据类型的操作通常需要更少的CPU周期
-
尽量避免NULL,包含为NULL的列,对MySQL更难优化
7.5.1整数型
tinyint(m) 1个字节 范围(-128~127)
smallint(m) 2个字节 范围(-32768~32767)
mediumint(m) 3个字节 范围(-8388608~8388607)
int(m) 4个字节 范围(-2147483648~2147483647)
bigint(m) 8个字节 范围(+-9.22*10的18次方)
上述数据类型,如果加修饰符unsigned后,则最大值翻倍
如:tinyint unsigned的取值范围为(0~255)
7.5.2浮点型(float和double),近似值
float(m,d) 单精度浮点型 8位精度(4字节) m总个数,d小数位, 注意: 小数点不占用总个数
double(m,d) 双精度浮点型16位精度(8字节) m总个数,d小数位, 注意: 小数点不占用总个数
设一个字段定义为float(6,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位
7.5.3定点数
在数据库中存放的是精确值,存为十进制 decimal(5.2) 100.01 - 999.99格式 decimal(m,d) 表示 最多 m 位数字,其中 d 个小数,小数点不算在长度内比如: DECIMAL(6,2) 总共能存6位数字,末尾2位是小数,字段最大值 9999.99 (小数点不算在长度内)参数m<65 是总个数,d<30且 d<m 是小数位
MySQL5.0和更高版本将数字打包保存到一个二进制字符串中(每4个字节存9个数字)。
例如: decimal(18,9)小数点两边将各存储9个数字,一共使用9个字节:其中,小数点前的9个数字用4个字节,小数点后的9个数字用4个字节,小数点本身占1个字节。
浮点类型在存储同样范围的值时,通常比decimal使用更少的空间。float使用4个字节存储。double占用8个字节因为需要额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时
7.5.4字符串(char,varchar,text)
char(n) 固定长度,最多255个字符,注意不是字节
varchar(n) 可变长度,最多65535个字符
tinytext 可变长度,最多255个字符
text 可变长度,最多65535个字符
mediumtext 可变长度,最多2的24次方-1个字符
longtext 可变长度,最多2的32次方-1个字符
BINARY(M) 固定长度,可存二进制或字符,长度为0-M字节
VARBINARY(M) 可变长度,可存二进制或字符,允许长度为0-M字节
内建类型:ENUM枚举, SET集合
八,实际操作
常用的数据类型:
int:整型 用于定义整数类型的数据
float:单精度浮点4字节32位 准确表示到小数点后六位
double:双精度浮点8字节64位
char:固定长度的字符类型 用于定义字符类型数据。
varchar:可变长度的字符类型
text:文本
image:图片
decimal(5,2):5个有效长度数字,小数点后面有2位 指定长度数组
#Char如果存入数据的实际长度比指定长度要小,会补空格至指定长度,
#如果存入的数据的实际长度大于指定长度,低版本会被截取,高版本会报错
查看数据库结构
SQL语言分类:
DDL:数据定义语言,用于创建数据库对象,如库、表、索引等。(create )
DML:数据操纵语言,用于对表中的数据进行管理,用来插入、删除和修改数据库中的数据(insert drop delete update )
DQL:数据查询语言,用于从数据表中查找符合条件的数据记录(select )
DCL:数据控制语言,用于设置或者更改数据库用户或角色权限(grant )
(数据控制语句,用于控制不通数据段直接的许可和访问级别的语句,这些语句定义了数据库、表、字段、用户的访问权限和安全级别,如COMMIT、ROLLBACK、GRANT、REVOKE)
查看数据库结构
mysql> show databases; #大小写不区分,分号“;”表示结束
+--------------------+
| Database |
+--------------------+
| information_schema |
| info |
| lgy |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.00 sec)
2####查看数据库中包含的表###
use 数据库名
use mysql; ##切换到mysql下
mysql> show tables in mysql; 查看数据库中表
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| columns_priv |
| db |
| engine_cost |
| event |
| func |
| general_log |
| gtid_executed |
| procs_priv |
| time_zone_transition_type |
| user |
+---------------------------+
31 rows in set (0.00 sec)
3####查看表结构(字段)####
格式:describe [数据库名.]表名;
desc user;
desc servers;
#查看表结构
可以切换方式查看表
mysql> use mysql
Database changed
mysql> desc servers;
+-------------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+-------+
| Server_name | char(64) | NO | PRI | | |
| Host | char(64) | NO | | | |
| Db | char(64) | NO | | | |
| Username | char(64) | NO | | | |
| Password | char(64) | NO | | | |
| Port | int(4) | NO | | 0 | |
| Socket | char(64) | NO | | | |
| Wrapper | char(64) | NO | | | |
| Owner | char(64) | NO | | | |
+-------------+----------+------+-----+---------+-------+
9 rows in set (0.01 sec)
desc mysql.servers;
#不想先使用数据库可以使用上面的 可以跳数据库看,不看字段
desc servers\G; ####可以使用列查看
#创建新的数据库####
CREATE DATABASE 数据库名;
###2.创建新的表####
create table 表名 (字段1 数据类型,字段2 数据类型[,...] [,PRIMARY KEY (主键名)]);
#主键一般选择代表唯一性的字段不允许为空值(null),且一个表只能有一个主键###
例:
CREATE DATABASE lgy; .
USE lgy;
CREATE TABLE ll (id int NOT NULL,name char(10) NOT NULL,score decimal(5,2),passwd char(48) DEFAULT '',PRIMARY KEY (id)) ;
desc info;
#查看表结构
###管理表中的数据####
1.向数据表中插入新的数据记录
insert into 表名(字段1,字段2,字段3) values(字段1的值,字段2的值,字段3的值);
mysql> insert into ll (id,name,score,passwd) values (2,'cr',80,'12456');
Query OK, 1 row affected (0.00 sec)
mysql> select * from ll;
+----+------+-------+--------+
| id | name | score | passwd |
+----+------+-------+--------+
| 1 | qjw | 61.00 | 123456 |
| 2 | cr | 80.00 | 12456 |
+----+------+-------+--------+
2 rows in set (0.00 sec)
SELECT * FROM ll; #查询表的全部数据记录
2.查询数据记录
SELECT 字段名1,字段名2[,...] FROM 表名 [WHERE 条件表达式];
mysql> select name number from ll;
+--------+
| number |
+--------+
| qjw |
| cr |
+--------+
2 rows in set (0.00 sec)
mysql> select name number from ll where id=2;
+--------+
| number |
+--------+
| cr |
+--------+
1 row in set (0.00 sec)
SELECT * FROM ll WHERE id < 2
#id小于2的
select * from ll where age=22;
#只找22岁的
select * from ll where age=22 and name='cr';
#只找22岁和名字叫cr的
select * from ll limit 2;
#加上limit选项可以看前几行
select * from ll limit 2,3;
#第二行之后的前三行
3 修改、更新数据表中的数据记录
update 表名 set 字段名1=修改字段值1 ,字段名2=修改的字段值2 [where 条件表达式]
mysql> update ll set name='xka',score='99'where id=3;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from ll;
+----+------+--------+--------+
| id | name | score | passwd |
+----+------+--------+--------+
| 1 | qjw | 61.00 | 123456 |
| 2 | cr | 80.00 | 12456 |
| 3 | xka | 99.00 | 156 |
| 4 | xd | 100.00 | 16 |
+----+------+--------+--------+
4 rows in set (0.00 sec)
4 在数据表中删除指定的数据记录
delete from 表名 [where 条件表达式]
delete from 表名
将整个表中的数据整个删除
mysql> delete from ll where id=4;
Query OK, 1 row affected (0.00 sec)
mysql> select * from ll;
+----+------+-------+--------+
| id | name | score | passwd |
+----+------+-------+--------+
| 1 | qjw | 61.00 | 123456 |
| 2 | cr | 80.00 | 12456 |
| 3 | xka | 99.00 | 156 |
+----+------+-------+--------+
3 rows in set (0.00 sec)
修改表名和表结构
1 修改表名
alter table 旧表名 rename 新表名;
mysql> alter table ll rename lg;
Query OK, 0 rows affected (0.01 sec)
mysql> select * from lg;
+----+------+-------+--------+
| id | name | score | passwd |
+----+------+-------+--------+
| 1 | qjw | 61.00 | 123456 |
| 2 | cr | 80.00 | 12456 |
| 3 | xka | 99.00 | 156 |
+----+------+-------+--------+
3 rows in set (0.00 sec)
2扩展表结构(增加字段)
alter table 旧表名 add address varchar(50) default '居无定所';
mysql> alter table lg add address varchar(50) default'juwudingsuo';
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> select * from lg;
+----+------+-------+--------+-------------+
| id | name | score | passwd | address |
+----+------+-------+--------+-------------+
| 1 | qjw | 61.00 | 123456 | juwudingsuo |
| 2 | cr | 80.00 | 12456 | juwudingsuo |
| 3 | xka | 99.00 | 156 | juwudingsuo |
+----+------+-------+--------+-------------+
3 rows in set (0.00 sec)
3 修改字段(列)名,添加唯一键
alter table 表名 change 旧列名 新列名 数据类型 [unique key];
unique key 唯一键,可以为多个
mysql> alter table lg change score use_name varchar(10) unique key;
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from lg;
+----+------+----------+--------+-------------+
| id | name | use_name | passwd | address |
+----+------+----------+--------+-------------+
| 1 | qjw | 61.00 | 123456 | juwudingsuo |
| 2 | cr | 80.00 | 12456 | juwudingsuo |
| 3 | xka | 99.00 | 156 | juwudingsuo |
+----+------+----------+--------+-------------+
3 rows in set (0.00 sec)
4删除字段
alter table info drop sex;
alter table 表名 drop 字段名;
mysql> alter table lg drop address;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> select * from lg;
+----+------+----------+--------+
| id | name | use_name | passwd |
+----+------+----------+--------+
| 1 | qjw | 61.00 | 123456 |
| 2 | cr | 80.00 | 12456 |
| 3 | xka | 99.00 | 156 |
+----+------+----------+--------+
3 rows in set (0.00 sec)
案列扩展
(root@localhost) [lgy]> create table if not exists lf(id int(4) zerofill primary key auto_increment, name varchar(10)not null,cardid int(18) not null unique key,hobby varchar(50));
Query OK, 0 rows affected (0.00 sec)
#if not exists:表示检测要创建的表是否已存在,如果不存在就继续创建
#int(4) zerofill:表示若数值不满4位数,则前面用"0"填充,例0001
#auto_increment:表示此字段为自增长字段,即每条记录自动递增1,默认从1开始递增;
自增长字段数据不可以重复;自增长字段必须是主键;如添加的记录数据没有指定此字段的值且
添加失败也会自动递增一次
#unique key:表示此字段唯一键约束,此字段数据不可以重复:一张表中只能有一个主键,但是一张表中可以有多个唯一键
#not null:表示此字段不允许为NULL
-----------------------------------------数据表高级操作------------------------------------------------------------------
1.克隆表,将数据表的数据记录生成到新的表中
方法一:
create table test2 like test1; #通过 LIKE 方法,复制test1表结构生成test2表
insert into test01 select * from test1;
方法二:
CREATE TABLE test01 (SELECT * from test1);
show create table test02\G #获取数据表的表结构、索引等信息
SELECT * from test02;
举例:
(root@localhost) [lgy]> create table test2 (select *from test1);
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
2.清空表,删除表内的所有数据
方法一
delete from test01;
#DELETE清空表后,返回的结果内有删除的记录条目;DELETE工作时是一行一行的删除记录数据的;如果表中有自增长字段,使用DELETE FROM删除所有记录后,再次新添加的记录会从原来最大的记录ID后面继续自增写入记录。
举例:
delete from test1
(root@localhost) [lgy]> insert into test1 (name,genter) values('sd','m');
Query OK, 1 row affected (0.00 sec)
(root@localhost) [lgy]> select * from test1;
+----+------+--------+
| id | name | genter |
+----+------+--------+
| 4 | sd | m |
+----+------+--------+
1 row in set (0.00 sec)
方法二:
truncate table test01;
#TRUNCATE清空表后,没有返回被删除的条目;TRUNCATE工作时是将表结构按原样重新建立,因此在速度上TRUNCATE会比DELETE清空表快;使用TRUNCATE TABLE清空表内数据后,ID会从1开始重新记录。
举例:
(root@localhost) [lgy]> truncate table test1;
Query OK, 0 rows affected (0.01 sec)
(root@localhost) [lgy]> insert into test1 (name,genter) values('sd','m');
Query OK, 1 row affected (0.00 sec)
(root@localhost) [lgy]> select * from test1;
+----+------+--------+
| id | name | genter |
+----+------+--------+
| 1 | sd | m |
+----+------+--------+
1 row in set (0.00 sec)
3.创建临时表
临时表创建成功之后,使用 SHOW TABLES 命令是看不到创建的临时表的,临时表会在连接退出后被销毁。
如果在退出连接之前,也可以可执行增删改查等操作,比如使用DROP TABLE语句手动直接删除临时表。
CREATE TEMPORARY TABLE 表名 (字段1 数据类型,字段2 数据类型[,...][,PRIMARY KEY (主键名)]);
例:
create temporary table test03 (
id int(4) zerofill primary key auto_increment,
name varchar(10) not null,
cardid int(18) not null unique key,
hobby varchar (50));
insert into test3 values (1,'sz','123456','running');
select * from test3;
show tables;
quit
select * from test3;
4.创建外键约束,保证数据的完整性和一致性
外键的定义:如果同一个属性字段X在表一中是主键,而在表二不是主键,则字段X称为表二的外键。
主键表和外键表的理解:
(1)、以公共关键字作主键的表为主键表(父表,主表)
(2)、以公共关键字作外键的表为外键表(从表、外表)
注意:与外键关联的主表的字段必须设置为主键。要求从表不能是临时表,主从表的字段具备相同的数据类型、字符长度和约束。
#创建主表test4
create table test4 (hobid int(4),hobname varchar(50));
#创建从表test5
create table test5 (id int(4) primary key auto_increment,name varchar(10),age int(3),hobid int(4));
#为主表test4添加一个主键约束。主键名建议以 “PK_” 开头。
alter table test4 add constraint PK_hobid primary key (hobid);
#为从表test05表添加外键,并将test05 表的hobid 字段和test04 表的hobid字段建立外键关联。外键名建议以 “FK_” 开头。
alter table test5 add constraint FK_hob foreign key (hobid) references test4 (hobid);
desc test5;
#插入新的数据记录时,要先主表再从表
insert into test4 values(1,'runing');
insert into test5 values(1,'zhangsan',18,1);
#删数数据记录时,要先从表再主表,也就是说删除主键表时必须先删除其他与之关联的表。
drop tables test5;
drop tables test4;
#查看和删除外键约束
show create table test5; .
alter table test5 drop foreign key FK_hob;
alter table test5 drop key FK_hob;
desc test5;
MySQL中6种常见的约束:
主键约束(primary key)
外键约束(foreign key)
非空约束(not null)
唯一性约束(unique [key|index] )
默认值约束(default)
自增约束(auto_increment)
九,总结
#删除类型
drop table table_name
1)属于DDL
2)不可回滚(无法恢复)
3)不可带where
4)表内容和结构删除
5)删除速度快
truncate table table_name
1)属于DDL
2)不可回滚
3)不可带where
4)表内容删除
5)删除速度快
delete from table_name
1)属于DML
2)可回滚(可恢复)
3)可带where
4)表结构在,表内容要看where执行的情况
5)册删除速度慢,需要逐行删除
不再需要一张表的时候,用drop
想删除部分数据行时候,用delete,并且带上where子句
保留表而删除所有数据的时候用truncate
#删除
速度
drop> truncate > delete
安全性
delete 最好
文章评论