文章目录
前言
-
什么是数据库?
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。
-
什么是关系型数据库?
关系数据库是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。它将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
特点:
1.数据以表格的形式出现
2.每行为各种记录名称
3.每列为记录名称所对应的数据域
4.许多的行和列组成一张表单
5.若干的表单组成database -
什么是MySQL?
MySQL是一个关系型数据库管理系统(管理数据库的软件)。由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。
一、MySQL的安装
看狂神的视频说是5.x的版本较为稳定,因此在windows上通过压缩包的形式安装了MySQL,可参考MySQL安装视频。以及可视化软件SQLyog安装教程。
二、MySQL基本操作语句
- Tips
- 不区分大小写。
- 通常语句后都需要以分号【;】结尾。
- 代码以【–】进行单行注释,以【-* *-】进行多行注释。
- 和关键词重名的变量明需用两个反引号【`】引出。
1. 启动/停止MySQL服务
1)启动MySQL服务
net start mysql
2)停止MySQL服务
net stop mysql
2. 登录/退出数据库
1)登录数据库
mysql -u username -ppassword -- 注意:-p后没有空格直接输入密码,否则按回车键后重新输入密码
2)退出数据库
exit
3. 数据库基本操作语句
1)创建数据库
create database if not exists databaseName;
2)删除数据库
drop database if exists databaseName;
3)显示所有数据库
show databases;
4)切换数据库
use databaseName; -- 切换到哪个数据库用填哪个数据库名称
5)查看创建数据库的语句
SHOW CREATE DATABASE 数据库名
4. 表的基本操作语句
1)创建一个表
CREATE TABLE IF NOT EXISTS `表明` (
`字段名1` 列类型 属性 索引 注释,
`字段名2` 列类型 属性 索引 注释
) 表类型 字符集设置 注释;
- 例如:在数据集school下创建表student。
UNSIGNED:无符号整数,不能为负数
NOT NULL:数据不能为空(就是不能不填)。
AUTO_INCREMENT:自增,默认1,若要设置【AUTO_INCREMENT=自增数】
DEFAULT:设置默认值
ZEROFILL :不足位数用0填充
COMMENT :注释
PRIMARY KEY:主键
ENGINE:引擎,表类型
CHARSET:字符集
CREATE TABLE IF NOT EXISTS `school`.`student` (
`id` INT(3) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT 'annoy' COMMENT '姓名',
`age` INT(3) ZEROFILL NOT NULL DEFAULT 22 COMMENT '年龄',
PRIMARY KEY (`id`)
) ENGINE=INNODB CHARSET=utf8;
2)查看表信息
- 查看创建某个表的语句
SHOW CREATE TABLE 表名
- 查看某个表的结构
DESC 表名
- 显示当前数据库中所有表
SHOW TABLES
3)修改表
- 修改表名
ALTER TABLE `旧表名` RENAME `新表名`
- 增加表的字段
ALTER TABLE `表名` ADD `字段名` 列属性
- 删除表的字段
ALTER TABLE `表名` DROP `字段名`
- 修改表的字段
ALTER TABLE `表名` MODIFY `字段名` 列属性 -- 修改约束
ALTER TABLE `表名` CHANGE `旧字段名` `新字段名` 列属性 -- 重命名字段,也可修改约束
4)删除某个表
DROP TABLE IF EXISTS `表名`
5. 外键
1)创建表时添加外键
-- 表1中的主键作为表2中的外键
-- 在表2中操作
KEY FK_外键字段名 (`外键字段名`),
CONSTRAINT FK_外键字段名 FOREIGN KEY (`外键字段名`) REFERENCES `表1名` (`主键字段名`)
- 示例:grade表的gradeid字段作为student表的外键
CREATE TABLE IF NOT EXISTS `grade`(
`gradeid` INT(10) NOT NULL COMMENT '年级号',
`gradename` VARCHAR(20) NOT NULL COMMENT '年级',
PRIMARY KEY(`gradeid`)
)ENGINE=INNODB CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(10) NOT NULL COMMENT '学号',
`name` VARCHAR(20) NOT NULL COMMENT '姓名',
`gradeid` INT(10) NOT NULL COMMENT '年级号',
PRIMARY KEY(`id`),
KEY FK_gradeid (`gradeid`),
CONSTRAINT FK_gradeid FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`)
)ENGINE=INNODB CHARSET=utf8;
2)创建表后添加外键关系
-- 表1中的主键作为表2中的外键
-- 对表2中操作
ALTER TABLE `表2名`
ADD CONSTRAINT FK_外键字段名 FOREIGN KEY (`外键字段名`) REFERENCES `表1名` (`主键字段名`)
- 示例:grade表的gradeid字段作为student表的外键
CREATE TABLE IF NOT EXISTS `grade`(
`gradeid` INT(10) NOT NULL COMMENT '年级号',
`gradename` VARCHAR(20) NOT NULL COMMENT '年级',
PRIMARY KEY(`gradeid`)
)ENGINE=INNODB CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(10) NOT NULL COMMENT '学号',
`name` VARCHAR(20) NOT NULL COMMENT '姓名',
`gradeid` INT(10) NOT NULL COMMENT '年级号',
PRIMARY KEY(`id`)
)ENGINE=INNODB CHARSET=utf8;
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`)
- 注意:
1.删除表时需要先删除有外键的表(表2),再删除主键作为外键的表(表1)
2.一般不使用数据库级的外键,因为在delete或update是需考虑很麻烦,若之后想用多张表的数据,使用程序级别去实现外键(这里我还没学到)。
6. 数据操作语言
1> DML语言(增删改)
1)添加 insert
- 一次插入一组值
INSERT INTO `表名` (`字段1`,`字段2`,...)
VALUES ('字段1的值','字段2的值',...)
- 一次插入多组值
INSERT INTO `表名` (`字段1`,`字段2`,...)
VALUES ('第一组字段1的值','第一组字段2的值',...),
('第二组字段1的值','第二组字段2的值',...),
('第n组字段1的值','第n组字段2的值',...)
- 注意:字段名可省略,但插入值的顺序需要和创建表时的字段顺序相同
2)修改 update
- 不指定条件下,会修改该字段下所有内容
UPDATE `表名` SET `字段名`='修改后的值'
- 指定条件下,修改一个字段内容
UPDATE `表名` SET `字段名`='修改后的值' WHERE 筛选条件
- 指定条件下,修改多个字段内容
UPDATE `表名` SET `字段名1`='修改后的值',`字段名2`='修改后的值',`字段名n`='修改后的值'
WHERE 筛选条件
- where后的操作符
=、!=或<>、<、>、<=、>=、BETWEEN…AND…、AND、OR、NOT、IS NULL、IS NOT NULL、LIKE(字符匹配,结果为真)、IN(在其中某个值中为真)
3)删除 delete
- 删除指定数据
DELETE FROM `表名` WHERE 筛选条件
- 清空表中数据
TRUNCATE `表名` -- 不会影响事务,自增计数器会归1
DELETE FROM `表名` -- engine为innodb重启后自增计数器会归1(内存),engine为myisam重启后不会影响自增(文件)
2> DQL语言(查)
SELECT查询语句
SELECT [ALL | DISTINCT] -- 显示所有结果(默认ALL)/显示去重后结果
* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]] -- 查询的内容:*全部/表中所有字段内容/表中部分字段内容
FROM table_name [as table_alias] -- 指定从哪个表进行查询
[left | right | inner join table_name2] -- 联合查询(7种)
[WHERE ...] -- 指定查询该结果需满足的条件
[GROUP BY field1, field2, ...] -- 指定结果按照哪几个字段进行分组
[HAVING ...] -- 过滤分组的记录必须满足的次要条件
[ORDER BY field1 ASC | DESC] -- 排序:指定查询记录按一个或多个条件排序
[LIMIT {[offset,]row_count | row_countOFFSET offset}]; -- 分页:指定查询的记录从哪条至哪条
1)查询基本信息
- 查询表中全部信息
SELECT * FROM ·`表名`
- 查询表中某些字段全部信息,字段名的查询结果可用别名显示
SELECT `字段名1` AS `别名`,`字段名2` FROM `表名` AS `别名`
- 函数cancat(c1,c2,c3…)连接多个内容
SELECT CONCAT(c1,c2,c3....) AS newname FROM `表名` -- c1,c2,c3....可为字段名,字符串,字符,数值..
- 去重DISTINCT:去除查询结果中重复的数据
SELECT DISTINCT `字段名` FROM `表名`
2)where条件查询
- where筛选条件查询
SELECT * FROM ·`表名` WHERE 筛选条件
- 模糊查询
-- LIKE:字符匹配
SELECT `字段名` FROM `表名` WHERE `字段名` LIKE '9%' -- %剩余全部字符
SELECT `字段名` FROM `表名` WHERE `字段名` LIKE '9_' -- '_'表示一个字符
-- IN:匹配多个内容中的某一个
SELECT * FROM `字段名`WHERE `表名` IN(匹配内容1,匹配内容2...)
- 子查询
SELECT ..
FROM ..
WHERE 字段名 = (
SELECT ..
...
)
3)联表查询
步骤:
①确定需要查询的字段来自哪些表。
②确定使用上述七种连接方法的哪一种实现连接。
③确定连接交叉点,即两表种数据相同的字段
④需要时,添加筛选条件
SELECT `字段名`
FROM 表1 AS 表1别名
XXX JOIN 表2 AS 表2别名 -- 选择连接方法
ON 表1别名.数据相同的字段名 = 表2别名.数据相同的字段名
XXX JOIN 表3 AS 表3别名 -- 连接多个表,两个表连接好往后追加
ON 表1/2/3别名.数据相同的字段名 = 表1/2/3别名.数据相同的字段名
WHERE 筛选条件
- 自连接
若一张表中的信息具有父类子类关系,若查询父类及其对应的子类的字段信息可使用该方法。
具体:把一张表当两张表操作,where筛选条件为父类与子类的关系
SELECT 表别名1.字段1 AS "parent", 表别名2.字段1 AS "son"
FROM 表名 AS 表别名1, 表名 AS 表别名2
WHERE 表别名1.具有关系的字段名1 = 表别名2.具有关系的字段名2
4)排序
ORDER BY `字段名` ASC -- 升序
ORDER BY `字段名` DESC -- 降序
5)分页
limit (n-1) * pagesize, pagesize -- n:当前页数 pagesize:每页显示个数
6)分组和过滤
GROUP BY `字段名` -- 通过字段名进行分组
HAVING 过滤条件 -- 分组的过滤条件