文章目录
- 前言
- 一、MySQL是什么?
- 二、数据库的常见概念
- 三、数据库存储数据的特点
- 四、SQL语言的分类
-
- 1.)DML
- 2.)DDL
- 3.)DCL
- 五、数据库的基本操作
-
- 5.1.)创建数据库
- 5.2)创建表
- 5.3)描述各种数据类型
- 5.4)修改表的定义
- 5.5)向表中插入、更新、删除数据
- 六、数据库查询
-
- 6.1)基本的SELECt语句
- 6.2)过滤和排序数据
- 6.3)分组函数
-
- AVG(平均值)和SUM (合计)函数
- MIN(最小值)和 MAX(最大值)函数
- COUNT(计数)函数
- 合计函数-upper/lower
- 字符串相关函数
- 数学相关函数
- 时间和日期相关函数
- 6.4)分组查询
- 6.5)多表查询
- 七、约束
-
- 7.1.什么是约束?
- 7.2六种约束:
- 7.3.PRIMARY KEY 约束
- 7.4.FOREIGN KEY 约束
- 7.5.CHECK 约束
- 7.6.触发器
- 总结
前言
讲完Java基础后,后台老师就直接开奔数据库,花了两天的时间滔滔不绝的带过MySQL数据库基础,鄙人也按照惯例写一下小小的笔记来巩固加深一下自己的印象。
不知不觉已经热爱上写博客文章了,对于现在的自己相对于从前来说也是一种突破吧,废话不多说了,开工。
一、MySQL是什么?
- 简单地说:数据库(Database或DB)是存储、管理数据的容器。
- 严格地说:数据库是“按照某种数据结构对数据进行组织、存储和管理的容器”。
- 总结:数据永远是数据库的核心.
二、数据库的常见概念
- DB:数据库,存储数据的容器.
- DBMS:数据库管理系统,又称位数据库软件或数据库产品,用于创建或管理DB.
- SQL:结构化结构查询语言,用于和数据库通信的,是几乎所有的主流数据库软件通用户的语言,不是某个数据库软件特有的。
- 所谓安装数据库服务器,知识在机器上装了一个数据库管理程序,这个管理程序可以管理多个数据库,一般开发人员针对每一个应用创建一个数据库;
- 为保存应用中实体的数据,一般会在数据库创建多个表,以保存程序中的实体的数据;
- 数据库服务器、数据库和表的关系如图所示:
三、数据库存储数据的特点
- 数据存放到表中,然后表再放到库中。
- 一个库中可以又多张表,每张表具有唯一的表名来标识自己。
- 表中有一个或多个列,列又称为字段,相当于Java中的属性。
- 表中,每一行数据,相当于java中的对象。
你比如说下面这张图描绘的很清晰:
需要注意的是:
- 表的一行称之为一条记录;
- 表中一条记录对应一个java对象的数据。
四、SQL语言的分类
- DML(Data Manipulation Language):数据操纵语句,用于添加、删除、修改、查询数据库记录,并检查数据完整性。
- DDL(Data Definition Language):数据定义语句,用于库和表的创建、修改、删除。
- DCL(Data Control Language):数据库控制语句,用于定义用户的访问权限和安全级别。
1.)DML
用途:DML用于查询于修改数据记录,包括如下SQL语句:
- INSERT:添加数据到数据库中。
- UPDATE :修改数据库中的数据。
- DELETE:删除数据库中的数据。
- SELECT:选择(查询)数据.
2.)DDL
用途:DDL用于定义数据库的结构,比如创建、修改或删除 数据库对象,包括如下SQL语句:
- CREATE TABLE:创建数据库表.
- ALTER TABLE:更改表结构、添加、删除、修改列长度.
- DROP TABLE:删除表.
- CREATE INDEX:在表上建立索引.
- DROP INDEX:删除索引.
3.)DCL
用途:DCL用来控制数据库的访问,包括如下SQL语句:
- GRANT:授予访问权限.
- REVOKE:撤销访问权限.
- COMMIT :提交事务处理.
- ROLLBACK: 事务处理回退.
- SAVEPOINT:设置保存点.
- LOCK:对数据库的特定部分进行锁定.
五、数据库的基本操作
5.1.)创建数据库
基本语句
CREATE DATABASE [IF NOT EXISTS] <数据库名>
[[DEFAULT] CHARACTER SET <字符集名>]
[[DEFAULT] COLLATE <校对规则名>];
也可以直接简便的创建数据库:
CREATE DATABASE [IF NOT EXISTS] <数据库名>
或者你还可以更简单的创建数据库:
OK 完成。
但是需要注意的是:
- IF NOT EXISTS:在创建数据库之前进行判断,只有该数据库目前尚不存在时才能执行操作。此选项可以用来避免数据库已经存在而重复创建的错误。
- [DEFAULT] CHARACTER SET:指定数据库的默认字符集。
- [DEFAULT] COLLATE:指定字符集的默认校对规则。
5.2)创建表
语句:
CREATE TABLE table_name
(
field1 datatype DEFAULT NULL,
field2 datatype COMMENT NULL,
field3 datatype,
)
- 注意:创建表之前,要先使用use db 语句使用库。
那么各参数意思分别表示啥意思?之间又有啥关系呢?
character set 代表字符集
collate 代表校对规则
field:指定列名。 datatype:指定列类型。
注意:创建表时,要根据需保存的数据创建相应的列,并根据数据的类型定义相应的列类型,实现添加自增长语句,主键字段后加auto increment(只适用MySQL)。
例如user对象
id int
name string
password string
birthday date
5.3)描述各种数据类型
先上一张图:
char 和varchar类型;说明:用来保存mysql中较短的字符串。
- char : 固定长度的字符 ;它的特点是比较耗费空间但是效率高,M可以省略,默认为1
- varchar :可变长度的字符,它的特点与char相反,比较节省空间,但是效率低。
紧接着是timestamp 和datatime类型;说明:用来保存日期类型。
- 创建表: 两个字段类型分别为timestamp,datetime。
- 入库是now()
- 查看表数据内容
- 查看时区:
show variables like 'time_zone'
- 修改时区:
set time_zone='+9:00'
5.4)修改表的定义
使用ALTER TABLE 语句追加、修改、或者删除列的语法。
添加语句:
ALTER TABLE table
ADD (column datatype [DEFAULT expr]
[, column datatype]...);
修改表语句:
ALTER TABLE table
MODIFY (column datatype [DEFAULT expr]
[, column datatype]...);
删除表的语句:
ALTER TABLE table
DROP column;
- 修改表的名称:Rename table 表名 to 新表名
- 修改表的字符集:
alter table student character set utf8;
5.5)向表中插入、更新、删除数据
- 使用INSERT 语句向表中插入数据。
- 使用这种语法一次只能向表中插入一条数据
插入数据
- 为每一列添加一个新值。
- 按列的默认顺序列出各个列的值。
- 再INSERT 子句中随意列出列名和他们的值。
- 字符和日期数据应包含在单引号中。
比如说:
INSERT INTO
departments(department_id, department_name,
manager_id, location_id)
VALUES (70, 'Public Relations', 100, 1700);
1 row created.
INSERT INTO
employees(employee_id,last_name,email,hire_date,job_id) VALUES
(300,’Tom’,’tom@126.com’,to_date
(‘2012-3- 21’,’yyyy-mm-dd’),’SA_RAP’);
1 row created.
UPDATE 语句语法
- 使用UPDATE 语句更新数据
比如说:
- 可以一次更新多条数据。
- 如果需要回滚护具,需要保证在DML前,进行设置: SET AUTOCOMMIT = FALSE;
更新数据
- 使用 WHERe字句指定需要更新的数据。
UPDATE employees
SET department_id = 70
WHERe employee_id = 113;
- 如果省略WHERe字句,则表中的所有数据都将被更新。
UPDATE employees
SET department_id = 110;
比如说我在表里新增加三条数据
然后新建查询-输入
update user
set salary ='5000';
那么所有salary列的数据全部变成了5000
DELETE语句
使用DELETE 语句从表中删除数据。
table 是表名 WHERe 是约束-操作限制条件。
删除数据:举个栗子。
- 使用WHERe字句删除指定的记录。
DELETE FROM departments
WHERe department_name = 'Finance';
- 同理如果省略WHERe字句,则表中的全部数据都将被删除。
DELETe FROM copy_emp;
六、数据库查询
6.1)基本的SELECt语句
- SELECT ——标识选择哪些列。
- FROM ——标识从哪歌表中选择。
选择全部列
select * from departments;
选择特定的列
select department_id,location_id from departments;
注意:
- SQL语言 大小写不敏感。
- SQL可以写在一行或者多行。
- 关键字不能被缩写也不能分行。
- 各字句一般要分行写。
- 使用缩进提高语句的可读性。
6.2)过滤和排序数据
概述:
- 使用WHERe字句,将不能满足条件的进行过滤掉。
- WHERe字句紧随FROM字句。
BETWEEN用法:
SELECt last_name, salary FROM employees
WHERe salary BETWEEN 2500 AND 3500;
标识查询 员工表-数据为薪资在2500到3500之间的员工姓名。
IN 用法:使用 IN运算显示列表中的值。
SELECt employee_id, last_name,
salary, manager_id FROM employees
WHERe manager_id IN (100, 101, 201);
标识查询 id 为100,101,201 的员工id。
LIKE 查询约束
-
使用LIKE运算选择类似的值。
-
选择条件可以包含字符或数字:
–%代表零各或多个字符(任意个字符)。
–_ 代表一个字符。
ORDER BY 字句 -
使用ORDER BY 子句排序。
----ASC(ascend):升序。
----DESC(descend):降序。 -
ORDER BY 子句在SELECt语句的 结尾。
6.3)分组函数
组函数类型
- AVG()
- COUNT()
- MAX()
- MIN()
- SUM()
AVG(平均值)和SUM (合计)函数
可以对数据型数据使用AVG和SUM函数。
SELECT AVG(salary), MAX(salary),
MIN(salary), SUM(salary)
FROM employees
WHERe job_id LIKE '%REP%';
MIN(最小值)和 MAX(最大值)函数
可以对数据型数据使用MIN和MAX函数。
SELECt MIN(hire_date),MAX(hire_date)
FROM employee;
COUNT(计数)函数
COUNT(*) 返回表中记录总数,适用于任意数据类型。
合计函数-upper/lower
- upper/lower函数将文本转换为大写/小写形式。
例如:
Select upper/lower(列名) from tablename
[WHERe where_definition]
字符串相关函数
数学相关函数
时间和日期相关函数
这些函数老师演示过各种例子,比如说拿其中的数学和字符串来说:
--CHARSET返回字串字符集
select CHARSET('xywang');
输出结果utf-8。
--CONCAT拼接字符串
select CONCAT('%','xwyang','%')
输出结果:%xwyang%。
--mysql的下标从1,没有找到返回0,返回substring在string中出现的位置
select INSTR('123456789','23')
select INSTR('23','12345678')
输出结果:2 0
--转换成大写
select UCASE('Apppp');
select UPPER('Apppp');
--转换成小写
select LOWER('AAAAp');
--左边起取length个字符
SELECT LEFT('12345678',4);
--uft8一个汉字3位
--Gbk 一个汉字两位
--LENGTH 返回占的位数
SELECT LENGTH('aaaa张');
6.4)分组查询
GROUP BY 子句
6.5)多表查询
6.5.1 Mysql连接
SELECT table1.column, table2.column
FROM table1, table2
WHERe table1.column1 = table2.column2;
- 在WHERe子句中写入连接条件。
- 在列表中有相同列时,在列名之间加上表名前缀。
6.5.2.区分重复的列名
- 使用表名前缀在多个表中区分相同的列。
- 在不同表中具有相同列名的列可以用表的别名 加以区分。
- 如果使用了表别名,则在select语句中需要使 用表别名代替表名。
- 表别名最多支持32个字符长度,但建议越少越好。
6.5.3表的别名
- 使用别名可以简化查询。
- 使用表名前缀可以提高执行效率。
比如说:
SELECT bt.id,NAME,boyname FROM beauty bt,boys b;
WHERe bt.`boyfriend_id`=b.id ;
这里的查询bt 就是一个表的别名,查询bt.id 和名字, 从bt 和 b 表中, where条件加主外键连接, id。
使用ON 子句创建连接
- 自然连接中是以具有相同名字的列为连接条件的。
- 可以使用 ON 子句指定额外的连接条件。
- 这个连接条件是与其它条件分开的。
- ON 子句使语句具有更高的易读性。
七、约束
7.1.什么是约束?
- 为了保证数据的一致性和完整性,SQL规范以约 束的方式对表数据进行额外的条件限制。
- 约束是表级的强制规定。
- 可以在创建表时规定约束(通过 CREATE TABLE 语句,或者在表创建之后也可以(通 过 ALTER TABLE 语句).
约束
7.2六种约束:
- 根据约束数据列的限制,约束可分为:
—单列约束:每个约束只约束一列。
— 多列约束:每个约束可约束多列数据。 - 根据约束作用范围,约束可分为:
—列级约束只能作用在一个列上,跟在列的定义后面。
—表级约束可以作用在多个列上,不与列一起,而是 单独定义。
NOT NULL约束
- 非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。
- Null类型特征:
-----所有的类型的值都可以是null,包括int、
float等数据类型。
------空字符串””不等于null,0也不等于null。
UNIQUE约束
- 同一个表可以有多个唯一约束,多个列组合的约束。 在创建唯一约束的时候,如果不给唯一约束名称,就 默认和列名相同。
- MySQL会给唯一约束的列上默认创建一个唯一索引。
示例代码:
CREATE TABLE USER( id INT NOT NULL, NAME VARCHAR(25),
PASSWORD VARCHAR(16),
#使用表级约束语法
CONSTRAINT uk_name_pwd UNIQUE(NAME,PASSWORD)
);
- 添加唯一约束:示例
ALTER TABLE USER
ADD UNIQUE(NAME,PASSWORD);
ALTER TABLE USER
ADD CONSTRAINT uk_name_pwd UNIQUE(NAME,PASSWORD);
ALTER TABLE USER
MODIFY NAME VARCHAR(20) UNIQUE;
- 删除约束:
ALTER TABLE USER
DROP INDEX uk_name_pwd;
7.3.PRIMARY KEY 约束
- 主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值。
- 如果是多列组合的主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
- 每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别上创建。
- MySQL的主键名总是PRIMARY,当创建主键约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。
示例代码:
CREATE TABLE emp4(
id INT AUTO_INCREMENT
PRIMARY KEY, NAME VARCHAR(20)
);
这是列级模式。↑
CREATE TABLE emp5(
id INT NOT NULL AUTO_INCREMENT,
NAME VARCHAR(20),
pwd VARCHAR(15),
CONSTRAINT emp5_id_pk PRIMARY KEY(id)
);
这是表级模式。↑
7.4.FOREIGN KEY 约束
- 外键约束是保证一个或两个表之间的参照完整性, 外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。
- 从表的外键值必须在主表中能找到或者为空。当主 表的记录被从表参照时,主表的记录将不允许删除, 如果要删除数据,需要先删除从表中依赖该记录的数 据,然后才可以删除主表的数据。
- 还有一种就是级联删除子表数据。
- 注意:外键约束的参照列,在主表中引用的只能是主键或唯一键约束的列。
7.5.CHECK 约束
- MySQL可以使用check约束,但check约束对数据 验证没有任何作用,添加数据时,没有任何错误或 警告
示例代码:
CREATE TABLE temp(
id INT AUTO_INCREMENT,
NAME VARCHAR(20),
age INT CHECK(age > 20), PRIMARY KEY(id)
);
7.6.触发器
示例代码:
CREATE TRIGGER 触发器名称 BEFORE/AFTER INSERT/UPDATE ON 表名
FOR EACH ROW
BEGIN
DECLARE msg varchar(100);
IF NEW.列名 (过滤条件 )
THEN
SET msg = CONCAT(‘您输入的:’,NEW.列名,' 为无效的。');
SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = msg;
END IF;
END;
总结
以上就是今天MySQL复习,老师要讲的内容,简单的整理了一下。
本文仅仅简单介绍了MySQL的基础知识,对于专业以及身处的知识并未涉及到,而这些基础知识确实可以为之后的实战打下基础,提供了大量能使我们快速便捷地处理数据的函数和方法。好了,打字不容易,如果本文对你有帮助的话别忘了一键三连噢,我是海海不掉头发。
要成功不需要什么特别的才能,只要把你能做的小事做得好就行了。——维龙