一、数据库概述
1、定义
存储数据的仓库
2、意义
用于保存和管理数据,便于检索(查询)存储的数据记录
3、常用的关系型数据库系统:
所谓的关系型数据库系统指存储的数据之间存在关联关系
(1)MySQLl--免费(Oracle的产品)
(2)Oracle--甲骨文,个人版和开发版免费,商业版收费
(3)Ms SqlServer--微软的数据库系统 个人版免费,商业版收费
(4)sqllite--嵌入式数据库系统,主要用于手机和数控机床以及各种android设备
(5)DB2--IBM公司数据库系统,主要用于工作站级得服务器系统
4、非关系型数据库系统:
存储的数据都是独立的,无任何关联
(1)Redis(用于缓存数据)
(2)MongoDB(用JSON格式存储数据)
5、DBMS--数据库管理系统(DataBase Manager System)
(1)用于操作管理数据库系统的软件或者应用程序,都称为数据库管理系统
(2)数据库管理系统主要是针对数据库中的数据进行操作
二、MySQL概述
1、开源免费 2、小巧,功能齐全 3、无系统平台的限制(支持win、linux、mac)
三、MySQL的安装
1、准备MySQL的安装软件
2、设置字符编码为utf8
3、MySQL端口号为3306
4、安装完成以后,查看管理工具中的MySQL服务是否启动
四、使用sqly数据库管理工具
1、安装sqlY
2、启动sqlY链接MySQL数据库(连接前一定要启动MySQL服务)
3、图形化的数据库管理工具
五、创建数据库和表
1、创建数据库语法 CREATE DATABASE 数据库名;选中后按F8键执行
2、打开数据库 USE 数据库名;选中后按F8键执行
3、创建表的语法(当想在一个表不存在时创建它,应该在表名后给出IF NOT EXISTS)
CREATE TABLE 表名(
字段1 类型[(长度)] 约束,
字段2 类型[(长度)] 约束,
....
字段n 类型[(长度)] 约束
);
约束主要包含:
(1)主键约束(PRIMARY KEY,主键值必须唯一,即表中必须具有唯一的主键值)
(2)主键自增(AUTO_INCREMENT)
(3)不能为空(NOT NULL)
(4)唯一约束(UNIQUE)
(5)检查约束(CHECK 约束条件)
(6)外键约束(FOREIGN KEY (外键字段)REFERENCES 主表(主键字段))
(7)缺省约束(DEFAULT 指定默认值)
(8)引擎类型(ENGINE=InnoDB / MyISAM)
例如:
CREATE TABLE student(
sid INT PRIMARY KEY AUTO_INCREMENT,##主键自增
sname VARCHAR(50) NOT NULL,
sex VARCHAR(4) DEFAULT '男',
address VARCHAR(50),
birthday DATE
);
4、向表中插入数据:INSERT INTO 表名(字段1,...,字段n) VALUES(值1,...,值n);
5、查询所有的记录SELECT * FROM 表名;
查看表的结构 DESC 表名;
6、 删除表DROP TABLE 表名;
删除数据库 DROP DATABASE 数据库名;
显示所有数据库SHOW DATABASE;
六、MySQL的构成
1、表文件(数据库文件xxx.myd)
2、表结构文件 (xxx.myi)
3、数据文件(数据库文件xxx.frm)
七、修改表的结构
(1)修改表的名称
ALTER TABLE 旧名称 RENAME AS 新名称;
(2)修改表结构,添加新的字段
ALTER TABLE 表名 ADD 字段名 类型[(长度)];
(3) 修改字段
ALTER TABLE 表名 MODIFY 字段名 类型[(长度)] [NOT NULL];--仅用于修改字段的长度和类型,字段名不能改
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型[(长度)] [NOT NULL];--用于修改表的字段名称
(4)删除字段
ALTER TABLE 表名 DROP 字段名;
(5)删除表
DROP TABLE 表名;
注意:在修改表结构时,建议表中不能有数据存在。
八、关联表的建立
1、一张表的数据需要参考另一张表的数据来保证数据的安全性
2、使用外键约束表的数据
(1)外键指参考另一张表的主键字段值FOREIGN KEY
例如:学生表需要参考班级表的主键字段值,所以,此处将班级表称为学生的主表,学生表称为班级表的子表
供应商vendors表中每个供应商具有唯一标识称为主键(primary key),产品products表,除了存储供应商ID(供应商vendors表中的主键)外不存储其他供应商信息,供应商vendors表的主键又叫products表的外键(foreign key)
(2)创建表并加入外键关联
CREATE TABLE 主表(
主键字段 类型 PRIMARY KEY AUTO_INCREMENT,
字段2 类型 );
CREATE TABLE 子表(
主键字段 类型 PRIMARY KEY AUTO_INCREMENT,
字段2 类型...,
....
外键字段 类型 NOT NULL,
CONSTRAINT 外键约束名称 FOREIGN KEY(外键字段) REFERENCES 主表(主表主键字段)
);
(3)修改表的结构添加外键关联
ALTER TABLE 子表名 ADD CONSTRAINT外键约束名称 FOREIGN KEY (外键字段) REFERENCES 主表(主表主键字段);
(4)主子表的关联关系又称为一对多的关联关系,其中主表是1,子表是多
注意:在删除主表数据时,先要删除子表中与主表有关联的子表数据,才能删除主表的记录
九、DML语言(数据管理语言)
1、插入数据
INSERT INTO表(字段列表) VALUES(值列表);
插入检索出的数据
INSERT SELECT INSERT INTO a表(字段列表) SELECT 字段列表 FROM b表
2、修改更新表中的数据 (UPDATE语句要以WHERE子句结束,它告诉MySQL修改哪一行,否则会修改表中所有行)
UPDATE 表名 SET 字段1=值1, ... ,字段n=值n [WHERE 字段=值];
3、删除数据 (DELETE语句是删除表的内容而不是表)
DELETE FROM 表名 [WHERE 字段=值];
MySQL没有撤销(undo)按钮,通过WHERE子句谨慎使用UPDATE、DELETE语句
十、过滤数据(WHERE子句表示检索符合条件的记录)
1、条件运算符
WHERE 字段 >、 =、<、<=、>=、!=、< >、BETWEEN
(1)查询空值
SELECT... FROM 表 WHERE字段 IS NULL;
(2)BETWEEN查询(只适用于数值型数据字段的查询)
SELECT... FROM 表 WHERE 字段 BETWEEN 值1 and 值2
等同于
SELECT... FROM 表 WHERE字段 >=值1 AND 字段<=值2
2、逻辑运算符AND、OR
AND:并且
OR: 或者
SELECT prod_name,prod_price FROM products WHERE (vend_id=1002 OR vend_id=1003) AND prod_price>=10;
使用具有AND和OR操作符的WHERE子句时,由于SQL对AND的计算优先级高于OR,因此应该使用圆括号( )来分组操作符
3、IN、NOT操作符
IN的查询(可适用于字符类型的范围查询)
SELECT... FROM 表 WHERE 字段 IN ('值1','值2',...,'值n');
十一、删除数据
TRUNCATE命令: 用于完全清空表数据,但表结构、索引、约束等不变
TRUNCATE TABLE 表名;
区别于DELETE命令:
都能删除数据、不删除表本身,但TRUNCATE 速度更快
使用TRUNCATE TABLE重新设置AUTO_INCREMENT计数器
使用TRUNCATE TABLE不会对事务有影响
十二、排序数据(ORDER BY子句)
ORDER BY子句:对SELECT语句检索出数据进行排序(默认ASC升序),当使用降序排序时必须指定DESC关键字
ORDER BY子句位置:ORDER BY子句应保证位于FROM子句之后,如果使用LIMIT,则LIMIT必须位于ORDER BY之后
SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1;
十三、数据查询语言(DQL)
1、查询的一般语法
SELECT 字段 FROM表名 [WHERE 条件 ] [ORDER BY 排序字段 [ASC | DESC]]
例如:
SELECT * FROM student ORDER BY sid DESC; (给定通配符*表示返回所有列)
2、查询指定字段的数据
SELECT 字段1,..,字段n FROM 表名 [....]
3、给字段和表设置别名(好处是可以缩短SQL语句、允许单条SELECT语句多次使用相同的表)
SELECT 字段1 [AS] 别名1,...,字段n [AS] 别名n from 表 [AS] 表别名 ...;
或者使用表别名获取字段的值
SELECT表别名.字段1 [AS] 别名1,...,表别名.字段n [AS] 别名n FROM 表 [AS] 表别名 ...;
4、去除重复记录的语句(DISTINCT关键字用于值返回不同的值)
SELECT DISTINCT 字段,...FROM 表
5、模糊查询LIKE
SELECT... FROM 表 WHERE 字段 LIKE '%值%';
例如:查找姓张的学生信息
SELECT * FROM student WHERE sname LIKE '张%';
十四、MySQL的高级查询
1、表联结查询
从多张表中获取需要的字段值进行显示
2、联结查询的类型
(1)内联结查询
1)主子表之间使用外键进行关联的查询
2)语法
语法一:
SELECT 表1.字段,表2.字段,....FROM 表1 JOIN 表2
ON 表1.主键字段=表2.外键字段 JOIN 表3
ON 表2.主键字段=表3.外键字段 .....
3)查询的结果为表1和表2..都有的值才进行呈现
例如:查询学生的信息和班级的名称
SELECT s.*,c.cnameFROM student s JOIN clazz c ON s.classid=c.cid
语法二:(使用WHERE子句建立联结关系)
SELECT表1.字段,表2.字段,....FROM 表1 ,表2,...
WHERE 表1.主键字段=表2.外键字段
AND 表2.主键字段=表3.外键字段 .....
(2)外联结查询
1)以其中一张表的数据为基础,获取联结表的数据,当联结表中无当前表的数据存在时,用空值补齐
2)左外联结
SELECT ... FROM 左表 LEFT JOIN 右表 ON 左表.主键字段=右表.外键字段
3)右外联结
SELECT ...FROM左表 RIGHT JOIN 右表 ON 左表.主键字段=右表.外键字段
以右表数据为基准,获取左表中的数据,如果左表中无对应数据存在,
则以null值补充
注意:只有具有关系的表(主子表外键关联的表),才可以进行联结查询。否则查询会出现笛卡尔积
(3)自联结查询
从自身表中获取数据的方式
3、LIMIT关键字查询(限制结果)
(1)显示从第n条记录开始,每次获取m条记录(第一个数n为开始位置,第二个数m为要检索的行数)
检索出来的第一行为行0而不是行1,因此LIMIT 1,1将检索出第二行不是第一行
例如:
SELECT * FROM student ORDER BY sid ASC LIMIT 5,10;返回6-15条记录,从第n条记录开始,一次取m条记录
(2)语法
SELECT ... FROM 表 WHERE 条件 ORDER BY ... LIMIT n,m;
(3)分页查询使用LIMIT关键字完成
当前页所在的记录数=(当前页数-1)*每页记录数;
SELECT ... FROM 表 [WHERE 条件] [ORDER BY...] LIMIT (当前页数-1)*每页记录数,每页的记录数;
第1页:当前页所在的记录数=(1-1)*每页记录数;
SELECT ... FROM 表 [WHERE 条件] [ORDER BY...] LIMIT 0,5;
第2页:当前页所在的记录数=(2-1)*每页记录数;
SELECT ... FROM 表 [WHERE 条件] [ORDER BY...] LIMIT 5,5;
第3页:当前页所在的记录数=(3-1)*每页记录数;
SELECT ... FROM 表 [WHERE 条件] [ORDER BY...] LIMIT 10,5;