mySQL教程 第1章 数据库设计

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

E-R设计

很多同学在学SQL语句时,觉得非常困难,那是因为你在学一个你根本不了解的数据库,数据库中的表不是你设计的,表与表之间的关系你不明白。因此在学SQL语句之前,先介绍一下数据库设计。

下面举例说明数据库设计:

学校需要开发一个系统记录有学生、课程和成绩信息。数据库如何设计?

这里面涉及到两个实体,学生表、课程,这些表为实体表。

这些表之间有什么关系呢?、学生考试出成绩,成绩记录在成绩表。

一个学生可以参加多门课程,关系是1对多。

数据库设计实例

clip_image001

设计数据库和表clip_image002

安装mySQL

运行apt-get update命令以确保您的软件包列表是最新的。

root@ubuntuServer:~# apt-get update

安装mySQL服务

root@ubuntuServer:~#apt-get install mysql-server

设置mySQL允许远程连接

需要更改配置文件和创建远程连接的mySQL用户。

1. 更改配置文件允许远程连接mySQL

默认mySQL只允许本地连接,需要更改配置文件。

root@ubuntuServer:~# vi /etc/mysql/my.cnf

注释掉红色部分。

clip_image003

重启mySQL服务

root@ubuntuServer:~# /etc/init.d/mysql restart

关闭防火墙或打开3306端口

root@ubuntuServer:~# ufw disable

2. 创建远程管理员

mySQL的登录账户包括用户名和计算机名组成,比如root@127.0.0.1和root@localhost是两个mySQL用户,有不同的权限和密码。

登录mySQL

mysql> use mysql; 切换数据库

查看user表

Select host,user,password from user;

clip_image004

创建新mySQL管理员root在192.168.80.%网段连接mySQL,

以下命令创建并授权'root'@'192.168.80.%'用户,all privileges代表所有权限,*.*代表所有数据库所有表,identified by 代表该用户的密码,with grant option代表该用户还可以授权其他用户。

mysql> grant all privileges on *.* to 'root'@'192.168.80.%' identified by 'a1!' with grant option;

运行以下命令刷新权限

mysql> flush privileges;

运行以下命令查看,创建的用户

mysql> select host,user from user;

clip_image005

使用管理工具连接mySQL

以下操作连接将会使用以上创建的root@192.168.80.%用户连接mySQL。并创建数据库

在物理机上安装MyManagerLiteSetup.exe,语言选择“English”。

clip_image006

clip_image007

clip_image008

clip_image009

clip_image010

准备mySQL学习环境

创建以后学习过程中用到的表。

clip_image011

将以下代码复制到SQL Manager工具中,选中代码,按 clip_image012或F9运行,完成

clip_image013

1. 创建学生表

CREATE TABLE `TStudent` (

`StudentID` varchar(15) NOT NULL,

`Sname` varchar(10) DEFAULT NULL,

`sex` char(1) DEFAULT NULL,

`cardID` varchar(20) DEFAULT NULL,

`Birthday` datetime DEFAULT NULL,

`Email` varchar(40) DEFAULT NULL,

`Class` varchar(20) DEFAULT NULL,

`enterTime` datetime DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2. 创建课程表

create table TSubject

(

subJectID nvarchar(10),

subJectName nvarchar(30),

BookName nvarchar(30),

Publisher nvarchar(20)

)ENGINE=InnoDB DEFAULT CHARSET=utf8;

3. 创建分数表

create table TScore

(

StudentID nvarchar(15),

subJectID nvarchar(10),

mark decimal

)ENGINE=InnoDB DEFAULT CHARSET=utf8;

4. 插入课程信息

insert into TSubject values ('0001','计算机网络','奠基计算机网络','清华出版社');

insert into TSubject values ('0002','数据结构','大话数据结构','人邮出版社');

insert into TSubject values ('0003','JAVA开发','JAVA企业级开发','人邮出版社')

5. 创建函数 该函数能够产生学生姓名

create function create_name()

RETURNS varchar(3)

begin

DECLARE LN VARCHAR(300);

DECLARE MN VARCHAR(200);

DECLARE FN VARCHAR(200);

DECLARE LN_N INT;

DECLARE MN_N INT;

DECLARE FN_N INT;

SET LN='李王张刘陈杨黄赵周吴徐孙朱马胡郭林何高梁郑罗宋谢唐韩曹许邓萧冯曾程蔡彭潘袁于董余苏叶吕魏蒋田杜丁沈姜范江傅钟卢汪戴崔任陆廖姚方金邱夏谭韦贾邹石熊孟秦阎薛侯雷白龙段郝孔邵史毛常万顾赖武康贺严尹钱施牛洪龚';

SET MN='伟刚勇春菊毅俊峰强军平保东文辉力明永健世广志瑗琰韵融园艺咏卿聪澜纯毓悦昭冰爽琬茗羽希宁欣飘育滢馥新利筠柔竹霭凝晓欢霄枫芸菲寒伊亚宜可姬舒义兴良海山仁波宁贵福生龙元全国胜学祥亮政谦亨奇固之岚苑富顺信子杰涛昌成康星光天达安岩中茂进林有坚和彪博诚先敬震振壮会思群豪清飞彬娜静淑惠珠翠雅芝妍茜秋珊莎锦黛青倩婷姣婉娴瑾颖露瑶怡婵雁蓓纨仪荷丹蓉眉君琴蕊薇菁梦素伟刚勇毅俊峰强军平保东文辉力明永健世广志义兴良海山仁波宁贵福生龙元全国胜学祥才发武新利清飞彬富顺信子杰涛昌成康星光天达安岩中茂进林有坚和彪博诚先敬震振壮会思群豪心邦承乐绍功松善厚庆磊民友裕河哲江超浩亮政谦亨奇固之轮翰朗伯宏言若鸣朋斌梁栋维启克伦翔旭鹏泽晨辰士以建家致树炎德行时泰盛雄琛钧冠策腾楠榕风航弘';

SET FN='伟刚勇毅俊云莲真环雪荣爱妹霞香月莺媛艳瑞凡佳嘉琼勤珍贞莉桂娣叶璧才发武丽琳轮翰朗伯宏言若鸣朋斌梁栋维启克伦翔旭鹏泽晨辰士以建家致树炎德河哲江超浩璐娅琦晶裕华慧巧美婕馨影荔枝思心邦承乐绍功松善厚庆磊民友玉萍红娥玲芬芳燕彩兰凤洁梅秀娟英行时泰盛雄琛钧冠策腾楠榕风航弘峰强军平保东文辉力明永健世广志义兴良海山仁波宁贵福生龙元全国胜学祥才发武新利清飞彬富顺信子杰涛昌成康星光天达安岩中茂进林有坚和彪博诚先敬震振壮会思群豪心邦承乐绍功松善厚庆磊民友裕河哲江超浩亮政谦亨奇固之轮翰朗伯宏言若鸣朋斌梁栋维启克伦翔旭鹏泽晨辰士以建家致树炎德行时泰盛雄琛钧冠策腾楠榕风航弘';

SET LN_N=CHAR_LENGTH(LN);

SET MN_N=CHAR_LENGTH(MN);

SET FN_N=CHAR_LENGTH(FN);

return Concat(substring(LN,ceil(rand()*LN_N),1),substring(MN,ceil(rand()*MN_N),1),substring(FN,ceil(rand()*FN_N),1));

end

6. 创建添加学生的存储过程

create procedure addStudent(in num int)

begin

declare i int;

set i=1;

delete from TStudent;

while num>=i do

insert TStudent values (

LPAD(convert(i,char(5)),5,'0'),

create_name(),

if(ceil(rand()*10)%2=0,'男','女'),

RPAD(convert(ceil(rand()*1000000000000000000),char(18)),18,'0'),

Concat('198',convert(ceil(rand()*10),char(1)),'-',LPAD(convert(ceil(rand()*12),char(2)),2,'0'),'-',LPAD(convert(ceil(rand()*30),char(2)),2,'0')),

Concat(PINYIN(sname),'@hotmail.com'),

case ceil(rand()*3) when 1 then '网络与网站开发' when 2 then 'JAVA' ELSE 'NET' END,

NOW());

set i=i+1;

end while;

select * from TStudent;

end

7. 创建汉字转拼音的函数,用来产生用户用户的邮箱

创建汉字转拼音的函数使用的表

CREATE TABLE `pinyin` (

`letter` char(1) NOT NULL,

`chinese` char(1) NOT NULL,

PRIMARY KEY (`letter`)

) ENGINE=MyISAM DEFAULT CHARSET=gbk;

插入数据

INSERT INTO `pinyin` VALUES ('A','驁'),('B','簿'),('C','錯'),('D','鵽'),('E','樲'),('F','鰒'),('G','腂'),

('H','夻'),('J','攈'),('K','穒'),('L','鱳'),('M','旀'),('N','桛'),('O','漚'),('P','曝'),('Q','囕'),('R','鶸'),

('S','蜶'),('T','籜'),('W','鶩'),('X','鑂'),('Y','韻'),('Z','咗');

创建汉字转拼音的函数

CREATE FUNCTION PINYIN(str CHAR(255))

RETURNS char(255)

BEGIN

DECLARE hexCode char(4);

DECLARE pinyin varchar(255);

DECLARE firstChar char(1);

DECLARE aChar char(1);

DECLARE pos int;

DECLARE strLength int;

SET pinyin = '';

SET strLength = CHAR_LENGTH(LTRIM(RTRIM(str)));

SET pos = 1;

SET @str = (CONVERT(str USING gbk));

WHILE pos <= strLength DO

SET @aChar = SUBSTRING(@str,pos,1);

SET hexCode = HEX(@aChar);

IF hexCode >= "8140" AND hexCode <= "FEA0" THEN

SELECT letter into firstChar

FROM pinyin

WHERE chinese >= @aChar

LIMIT 1;

ELSE

SET firstChar = @aChar;

END IF;

SET pinyin = CONCAT(pinyin,firstChar);

SET pos = pos + 1;

END WHILE;

RETURN UPPER(pinyin);

END

8. 创建插入学生成绩的存储过程 学生成绩在50-100分之间

create procedure fillSore()

begin

DECLARE St_Num INT;

DECLARE Sb_Num INT;

DECLARE i1 INT;

DECLARE i2 INT;

set i1=1;

set i2=1;

delete from TScore;

select count(*) into St_Num from TStudent;

select count(*) into Sb_Num from TSubject;

while St_Num>=i1 do

set i2=1;

while Sb_Num>=i2 do

insert TScore values

(LPAD(convert(i1,char(5)),5,'0'),LPAD(convert(i2,char(4)),4,'0'),ceil(50+rand()*50));

set i2=i2+1;

END WHILE;

set i1=i1+1;

END WHILE;

end

9. 插入1000个学生

call addStudent(1000)

select * from TStudent

10. 插入成绩

call fillSore()

11. 查看三张表连接的结果

select a.*,b.*,c.* from TStudent a join TScore b on a.studentid=b.studentid join TSubject c on b.subjectid=c.subjectid

clip_image014

设置mySQL字符集

支持中文的字符集是utf8,该设置可以更改mySQL配置文件进行全局设置,也可以针对数据库设置,也可以针对表设置,也可以针对列设置。字符集更改后新插入的数据生效,对以前不生效。

练习:更改MySQL的默认字符集

直接修改 my.cnf,增加一行内容,然后重启 MySQL,使之全局生效,影响新建的所有数据库。

default-character-set = utf8

clip_image015

重启mySQL服务

root@ubuntuServer:~# /etc/init.d/mysql restart

查看全局默认字符集

clip_image016

查看支持的所有字符集

mysql> show character set;

clip_image017

练习:为一个数据库指定字符集

指定数据库字符集后,该数据库下创建的表默认都采用该库指定的字符集。

1、创建数据库时,指定其字符集

CREATE DATABASE db DEFAULT CHARSET UTF8;

2、或者采用 ALTER 语法来转换字段的字符集

ALTER DATABASE db DEFAULT CHARSET UTF8;

使用图形管理界面也可以为数据库指定字符集

clip_image018

clip_image019

练习:为 一个数据表指定字符集

指定数据表字符集后,该数据表里的所有字符型字段默认都使用该表指定的字符集。

1、创建数据表时,指定其字符集

CREATE TABLE tbl

(

......

) ENGINE = MyISAM DEFAULT CHARSET UTF8;

2、或者采用 ALTER 语法来转换字段的字符集

ALTER TABLE tbl CONVERT TO CHARACTER SET utf8;

3、采用其他客户端工具来设定,例如 Navicat/MySQL Front/PhpMyAdmin

clip_image020

练习:为一个字段指定字符集

尽管数据表创建时已经指定默认字符集了,但是该表里面的字段还是可以指定自己的字符集的。

1、创建数据表时,指定其字符集

CREATE TABLE tbl

(

......

name CHAR(20) CHARACTER SET UTF8,

......

) ENGINE = MyISAM DEFAULT CHARSET UTF8;

2、或者采用 ALTER 语法来转换字段的字符集

ALTER TABLE tbl CHANGE name name CHAR(20) CHARACTER SET utf8;

3、采用其他客户端工具来设定,例如 Navicat/MySQL Front/PhpMyAdmin

clip_image021

练习:设定客户端字符集

为客户端连接指定字符集,最好服务器的字符集一致。

clip_image022

设置putty字符集

查看姓名是乱码

clip_image023

clip_image024

点击“应用”。

clip_image025

clip_image026

MySQL存储引擎

MySQL存储引擎概述

插件式存储引擎是MySQL数据库最重要的特性之一,用户可以根据应用的需要选择如何存储和索引数据库,是否使用事物等。mySQL默认支持多种存储引擎,以适应不同领域的数据库应用需要。用户可以通过选择使用不同的存储引擎提高应用的效率,提供灵活的存储,用户设置可以按照自己的需要定制和使用自己的存储引擎,以实现最大程度的可定制性。

MySQL常用的存储引擎为MyISAM、InnoDB、MEMORY、MERGE,其中InnoDB提供事务安全表,其他存储引擎都是非事务安全表。

MyISAM是MySQL的默认存储引擎。MyISAM不支持事务、也不支持外键,但其访问速度快,对事务完整性没有要求。

InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是比起MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。MySQL支持外键存储引擎只有InnoDB,在创建外键的时候,要求附表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。

存储引擎各自的一些特点

上面提到的四种存储引擎都有各自适用的环境,这取决于它们独有的一些特征。主要体现在性能、事务、并发控制、参照完整性、缓存、 故障恢复,备份及回存等几个方面

目前比较普及的存储引擎是MyISAM和InnoDB.而MyISAM又是绝大部分Web应用的首选。MyISAM与InnoDB的主要的不同点在于性能和事务控制上。

MyISAM是早期ISAM(Indexed Sequential Access Method,我现在用的MySQL5.0已经不支持ISAM了)的扩展实现,ISAM被设计为适合处理读频率远大于写频率这样一种情况,因此ISAM以及后来的MyISAM都没有考虑对事物的支持,不需要事务记录,ISAM的查询效率相当可观,而且内存占用很少。MyISAM在继承了这类优点的同时,与时俱进的提供了大量实用的新特性和相关工具。例如考虑到并发控制,提供了表级锁。而且由于MyISAM是每张表使用各自独立的存储文件(MYD数据文件和MYI索引文件),使得备份及恢复十分方便(拷贝覆盖即可),而且还支持在线恢复。

所以如果你的应用是不需要事务,不支持外键。处理的只是基本的CRUD(增删改查)操作,那么MyISAM是不二选择。

1. 设置mysql的默认存储引擎

编辑my.cnf配置文件,在服务器端配置信息[mysqld]下面添加:

default-storage-engine = MyISAM

即可设置mysql数据库的默认引擎为MyISAM

2. 指定表的存储引擎

如:

create table t_innodb( id int(3))

engine = innodb;

然后使用

mysql> show table status like 't_innodb';

查看表的详细信息。

3. 修改表的存储引擎

ALTER TABLE t_name ENGINE = innodb;

练习:更改默认存储引擎和表的存储引擎

1. 更改默认存储引擎

查看默认存储引擎

clip_image027

更改默认存储引擎

编辑配置文件

clip_image028

在[mysql]下添加

default-storage-engine = InnoDB

clip_image029

再次查看默认引擎,发现已经被更改

clip_image030

重启mySQL服务

clip_image031

2. 更表的存储引擎

双击某个表,可以更改表的存储引擎

使用命令更改

mysql> use schoolDB;

mysql> alter table TStudent engine=InnoDB;

使用管理工具更改

clip_image032

InnoDB存擎的特点

1. 自动增长列

自动增长列可以送给插入,但是插入的如果是空或者为0,则实际插入的值是自动增长后的值。

创建一个表,指定自动增长列,存储引擎innoDB。

create table au

(

studentid int not null auto_increment,

name varchar(10),

primary key(studentid)

)

engine=innodb CHARACTER SET UTF8,

插入记录,有空值且自增列也没按顺序

insert au values (1,'韩立刚'),(3,'韩立辉'),(2,'张京'),(null,'杨帅')

可以看到自增列的值

select * from au

clip_image033

外键约束

MySQL支持外键存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建索引

在删除更新父表时,对子表进行相应的操作,包括restrict、cascade、set null和no action

使用InnoDB存储引擎数据按主键顺序存放

如果不创建索引,数据以插入顺序存放

create table au1

(

studentid int,

name varchar(10),

primary key(studentid)

)

engine=innodb

insert au1 values (1,'韩立刚'),(3,'韩立辉'),(2,'张京'),(8,'杨帅'),(6,'杨柳青')

select * from au1

clip_image034

创建数据库和表

练习:创建数据库

clip_image035

也可使用命令创建数据库

clip_image036

输入以下命令 create database SchoolDB; 选中执行

clip_image037

练习:创建表

选中刚才创建的数据库 执行创建表的语句

clip_image038

创建学生表

create table TStudent

(StudentID nvarchar(15),

Sname nvarchar(10),

sex nchar(1),

cardID nvarchar(20),

Birthday datetime,

Email nvarchar(40),

Class nvarchar(20),

enterTime datetime )

创建课程表

create table TSubject

(

subJectID nvarchar(10),

subJectName nvarchar(30),

BookName nvarchar(30),

Publisher nvarchar(20)

)

创建分数表

create table TScore

(

StudentID nvarchar(15),

subJectID nvarchar(10),

mark decimal

)

练习:使用图形界面产生表的SQL语句

使用图形界面可以产生创建、删除、更改对象的SQL语句。

clip_image039

clip_image040

使用mySQL帮助

查看mySQL帮助

如果你不知道帮助能够提供什么?输入

? contents

可以查看可用的帮助

clip_image041

输入? Data definition

clip_image042

查看创建表的语法

clip_image043

快速查阅帮助

在实际应用当中,如果需要快速查看某项语法时,可以使用关键字进行快速查询。比如想知道show命令都能看到些什么东西,可以使用如下命令。

clip_image044

查看数据库

clip_image045

查看创建数据库的命令

clip_image046

查看创建表的命令

clip_image047

 

 



本文转自 onesthan 51CTO博客,原文链接:http://blog.51cto.com/91xueit/1137959,如需转载请自行联系原作者

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
12天前
|
关系型数据库 MySQL 网络安全
|
16天前
|
SQL 数据可视化 关系型数据库
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
|
16天前
|
存储 关系型数据库 MySQL
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
|
12天前
|
存储 关系型数据库 MySQL
MySQL基础入门:数据库操作全攻略
MySQL基础入门:数据库操作全攻略
44 0
|
12天前
|
关系型数据库 MySQL 数据库
卸载云服务器上的 MySQL 数据库
卸载云服务器上的 MySQL 数据库
30 0
|
2天前
|
SQL 关系型数据库 MySQL
MySQL环境搭建——“MySQL数据库”
MySQL环境搭建——“MySQL数据库”
|
2天前
|
SQL NoSQL 关系型数据库
初识MySQL数据库——“MySQL数据库”
初识MySQL数据库——“MySQL数据库”
|
5天前
|
关系型数据库 MySQL 数据库
数据库基础(mysql)
数据库基础(mysql)
|
5天前
|
SQL 关系型数据库 数据库
【后端面经】【数据库与MySQL】SQL优化:如何发现SQL中的问题?
【4月更文挑战第12天】数据库优化涉及硬件升级、操作系统调整、服务器/引擎优化和SQL优化。SQL优化目标是减少磁盘IO和内存/CPU消耗。`EXPLAIN`命令用于检查SQL执行计划,关注`type`、`possible_keys`、`key`、`rows`和`filtered`字段。设计索引时考虑外键、频繁出现在`where`、`order by`和关联查询中的列,以及区分度高的列。大数据表改结构需谨慎,可能需要停机、低峰期变更或新建表。面试中应准备SQL优化案例,如覆盖索引、优化`order by`、`count`和索引提示。优化分页查询时避免大偏移量,可利用上一批的最大ID进行限制。
32 3
|
6天前
|
存储 关系型数据库 MySQL
【后端面经】【数据库与MySQL】为什么MySQL用B+树而不用B树?-02
【4月更文挑战第11天】数据库索引使用规则:`AND`用`OR`不用,正用反不用,范围中断。索引带来空间和内存代价,包括额外磁盘空间、内存占用和数据修改时的维护成本。面试中可能涉及B+树、聚簇索引、覆盖索引等知识点。MySQL采用B+树,因其利于范围查询和内存效率。数据库不使用索引可能因`!=`、`LIKE`、字段区分度低、特殊表达式或全表扫描更快。索引与NULL值处理在不同数据库中有差异,MySQL允许NULL在索引中的使用。
11 3