第21天 数据库 Mysql

MySQL

数据库

概述

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库mysql

数据库分类

关系型数据库

关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。在关系 型数据库中,对数据的操做几乎所有创建在一个或多个关系表格上,经过对这些关联的表格 分类、合并、链接或选取等运算来实现数据库的管理。
简单理解:保存的实体与实体之间的关系。(用户、商品、订单)web

菲关系型数据库

NoSQL,泛指非关系型的数据库。随着互联网 web2.0 网站的兴起,传统的关系数据库在应 付 web2.0 网站,特别是超大规模和高并发的 SNS 类型的 web2.0 纯动态网站已经显得力不从 心,暴露了不少难以克服的问题,而非关系型的数据库则因为其自己的特色获得了很是迅速 的发展。NoSql 数据库在特定的场景下能够发挥出不可思议的高效率和高性能,它是做为对 传统关系型数据库的一个有效的补充。
NoSQL(NoSQL=NotOnlySQL),意即“不只仅是 SQL”,是一项全新的数据库革命性运动, 早期就有人提出,发展至 2009 年趋势愈加高涨。NoSQL 的拥护者们提倡运用非关系型的数 据存储,相对于铺天盖地的关系型数据库运用,这一律念无疑是一种全新的思惟的注入。sql

常见数据库

  • Oracle 公司 Oracle(甲骨文)数据产品,收费的大型的数据库。
  • MySQL 开源的,被 Oracle 收购了,小型的数据库。5.x 版本免费,6.x 收费了
  • SQLServer 微软的,收费的中型的数据库。
  • DB2 IBM 公司收费的大型的数据库。
  • SyBASE PowerDigener 软件(很是牛)

数据库常见操做

启动和关闭

  • 启动:net start mysql
  • 关闭:netstopmysql;

注意:在启动 mysql 服务后,打开 windows 任务管理器,会有一个名为 mysqld.exe 的进程运 行,因此 mysqld.exe 才是 MySQL 服务器程序。数据库

登陆和退出

在启动 MySQL 服务器后,咱们须要使用管理员用户登陆 MySQL 服务器,而后来对服务 器进行操做。登陆 MySQL 须要使用 MySQL 的客户端程序:mysql.exe windows

  • 登录

    mysql-u root -p root-h localhost
    安全

  • -u:后面的 root 是用户名,这里使用的是超级管理员 root
  • -p:后面的 123 是密码,这是在安装 MySQL 时就已经指定的密码
  • -h:后面给出的 localhost 是服务器主机名,它是能够省略的,例如:mysql

- 退出

quit 或 exit服务器

SQL 简介

- SQL(StructuredQueryLanguage)是“结构化查询语言”,它是对关系型数据库的操做 语言。它能够应用到全部关系型数据库中,例如:MySQL、Oracle、SQLServer 等。

  • SQL 标准(ANSI/ISO)有本身标准,这些标准就与 JDK 的版本同样,在新的版本中总要 有一些语法的变化。不一样时期的数据库对不一样标准作了实现。
  • 虽然 SQL 能够用在全部关系型数据库中,但不少数据库还都有标准以后的一些语法,我 们能够称之为”方言”。

例如 MySQL 中的 LIMIT 语句就是 MySQL 独有的方言,其它数据库都不支持!固然, Oracle 或 SQLServer 都有本身的”方言”。数据结构

SQL 语言分类

  • DDL(DataDefinitionLanguage):数据定义语言,用来定义数据库对象:库、表、列等;
  • DML(DataManipulationLanguage):数据操做语言,用来定义数据库记录(数据);
  • DCL(DataControlLanguage):数据控制语言,用来定义访问权限和安全级别;
  • DQL(DataQueryLanguage):数据查询语言,用来查询记录(数据)。

数据库和表的关系

  • 一个数据库的服务器中有多个数据库
  • 一个数据库中有多张表,每一个表有多个字段,字段和 Java 中类的属性是一一对应的。
  • 表中每一条记录对应的是一个 Java 实例对象

数据库的基本操做

建立和查看数据库

建立数据库

  • 建立一个数据库语法 并发

    CREATEDATABASE 数据库名称;oracle

  • 建立一个使用 utf8 字符集的 mydb1 数据库

    CREATEDATABASEmydb1CHARACTERSET’UTF8’;

- 案例演示

建立一个名称为employee的数据库
建立一个 建立一个使用 utf-8 编码字符集的employee2 数据库
默认字符集

指定字符集

查看数据库

  • 查询全部数据库

    语法:SHOWDATABASES;

  • 查询数据库的定义

    语法:SHOWCREATEDATABASE 数据库名称;

- 案例演示

查询全部数据库
查看数据库信息

修改数据库

  • 语法:ALTERDATABASE 数据库名称 CHARACTERSET 编码;

  • 案例演示 :修改数据库编码为 GBK,并查看

删除数据库

删除数据库是将数据库系统中已经存在的数据库删除。

语法 DROP DATABASE数据库名称

  • 案例演示:删除数据库

切换数据库

  • use 数据库名

数据类型

使用 MySQL 数据库存储数据时,不一样的数据类型决定了 MySQL 存储数据方式的不一样。为 此, MySQL 数据库提供了多种数据类型,其中包括整数类型、浮点数类型、定点数类型、 日期和时间类型、字符串类型和二进制类型。

数据类型介绍
  • int:整型

  • double:浮点型,例如 double(5,2)表示最多 5 位,其中必须有 2 位小数,即最大值为 999.99

  • decimal:泛型型,在表单钱方面使用该类型,由于不会出现精度缺失问题

  • char:固定长度字符串类型  varchar:可变长度字符串类型

  • text:字符串类型  blob:字节类型

  • date:日期类型,格式为:yyyy-MM-dd

  • time:时间类型,格式为:hh:mm:ss

  • timestamp:时间戳类型

表的基本操做

数据库建立成功后,就须要建立数据表。所谓建立数据表指的是在已存在的数据库中创建新 表,
注意:在操做数据表以前,应该使用“USE 数据库名”指定操做是在哪一个数据库中进行,否 则会抛出“ Nodatabaseselected”错误。

建立表

-语法:
create table 表名(
字段名称 类型(长度) 约束,
字段名称 类型(长度) 约束,
字段名称 类型(长度) 约束,
….
);

- 注意事项

表名小括号,后面有分号结束。
每一行字段后面要有逗号分隔,可是最后一行没有逗号。
数据的类型后面有长度,若是是字符型,长度必须加。若是是其余类型,能够不加。 有默认长度。int 默认长度 11

案例演示
-- 新建Student 表,包含列学号(主键),姓名,学号,语文成绩,数学成绩,英语成绩
CREATE TABLE Student(
    sid VARCHAR(10) PRIMARY KEY,
    sname VARCHAR(20),
    sage INT,
    cscore INT,
    mscore INT,
    escore INT
);
![](https://i.imgur.com/2YU5Bbt.png)

查看表

查看全部表

语法:SHOWTABLES;

查看指定表

使用 SQL 建立好数据表后,能够经过查看数据表结构的定义,以确认数据表的定义是否正确。

  • SHOW CREATE TABLE 表名;
      -

该语句能够查看数据库表的定义信息,还能够查看表的字符集。

  • DESCRIBE 表名
    该语句能够查看表的字段名、字段类型等信息。
    简化写法为:DESC 表名;

修改表

有时候,但愿对表中的某些信息进行修改,这时就须要修改数据表。所谓修改数据表指的是 修改数据库中已经存在的数据表结构。 好比,修改表名、修改字段名、修改字段的数据类型等。在 MySQL 中,修改数据表的操做 都是使用 ALTERTABLE 语句来完成的。

修改表名

  • 语法 RENAME TABLE 旧表名 TO 新表名;

修改字段名

  • 语法:ALTER TABLE 表名 CHANGE 旧字段 新字段 类型(长度) 约束;

修改字段类型

  • 语法:ALTER TABLE 表名 MODIFY 字段名 数据类型;

添加和删除字段

  • 添加字段 ALTER TABLE 表名 ADD 字段 类型(长度) 约束;

  • 删除字段 ALTER TABLE 表名 DROP 字段;

删除表

删除数据表是指删除数据库中已存在的表。在删除数据表的同时,数据表中存储的数据都将 被删除。
注意:建立数据表时,表和表之间可能会存在关联,要删除这些被其余表关联的表比较复杂,将在以后学习
语法 DROP TABLE 表名;

表的约束

为了防止数据表中插入错误的数据,在 MySQL 中,定义了一些维护数据完整性的规则,即 表的约束

  • 注意:
    主键列的值不能为 NULL,也不能重复!
    指定主键约束使用 PRIMARYKEY 关键字

主键约束

在 MySQL 中,为了快速查找表中的某条信息,能够经过设置主键来实现。主键约是经过 PRIMARYKEY 定义的,它能够惟一标识表中的记录,这就比如身份证能够用标识人的身份一 样。 语法:字段名 数据类型 PRIMARY KEY; id INT PRIMARY KEY;

非空约束

指定非空约束的列不能没有值,也就是说在插入记录时,对添加了非空约束的列必定要给值; 在修改记录时,不能把非空列的值设置为 NULL。

- 语法:字段名 数据类型 NOTNULL; name varchar(10) not null

设置为非空后,列必须有值

惟一约束

当为字段指定惟一约束后,那么字段的值必须是惟一的。这一点与主键类似!例如给 stu 表 的 sname 字段指定惟一约束: 语法:字段名 数据类型 UNIQUE name varchar(20) unique
完整代码示例
CREATE TABLE Student( 
    id INT,
        NAME VARCHAR(20), 
    age INT, 
    scode INT, 
    mScore INT
)

设置表字段的值自动增长

在数据库表中,若想为表中插入的新记录自动生成惟一的 ID,可使用 AUTO_INCREMENT 约束来实现,AUTO_INCREMENT 约束的字段能够是任何整数类型,默认状况下,该字段的值 是从 1 开始自增的
  • 语法:字段名 数据类型 AUTO_INCREMENT;

数据库增删改查

想要操做数据表中的数据,首先要保证数据表中存在数据,MySQL 使用 INSERT 语句想数据 表中添加数据,而且根据添加方式的不一样分为三种,分别是为表中的全部字段添加数据,为 表中指定字段添加数据、同时添加多条记录。

INSERT 插入语句

  • 语法 1 :

INSERT INTO 表名(列名 1,列名 2, …)VALUES(值 1, 值 2)
注意:列和值必须匹配
示例 INSERT INTO stu(id,name,age,idcard) VALUES (1,’lisi’,18,1111111111);

  • 语法 2:

INSERT INTO 表名 VALUES(值 1,值 2,…)
注意:由于没有指定要插入的列,表示按建立表时列的顺序插入全部列的值:
示例 INSERT INTO stu VALUES(2,’zhaoliu’,32,2222222222222222222);
注意: 数据与字段类型要相同 字段长度须要控制 全部字符串数据必须使用单引用

SELECT 查询语句

语法:

查询全部数据:SELECT*FROM 表名;
【*】通配符表示表中全部字段

查询指定字段:SELECT 字段名 1,字段名 2,字段名 3FROM 表名;
字段 一、字段 二、字段 3 表示从表中查询的指定字段

去除重复的数据:SELECTDISTINCT 字段名 FROM 表名;
DISTINCT 是可选参数,用于剔除查询结果中重复的数据

附上所有代码
-- 新建Student 表,包含列学号(主键),姓名,年龄,语文成绩,数学成绩,英语成绩
CREATE TABLE Student(
    sid VARCHAR(10) PRIMARY KEY,
    sname VARCHAR(20),
    sage INT,
    cscore INT,
    mscore INT,
    escore INT
);
DROP TABLE Student;
-- 新建Teacher 表,包含列工号(主键),姓名,年龄
CREATE TABLE Teacher(
    tid VARCHAR(10) PRIMARY KEY,
    tname VARCHAR(20),
    tage INT
);
-- 查看全部表
SHOW TABLES;
-- 该语句能够查看数据库表的定义信息,还能够查看表的字符集
SHOW CREATE TABLE Student;
--  该语句能够查看表的字段名、字段类型等信息
DESCRIBE Student;

-- 修改表名 RENAMETABLE 旧表名 TO 新表名;
RENAME TABLE Teacher TO Worker;

-- 修改字段名 语法:ALTER TABLE 表名 MODIFY 字段名 数据类型;
ALTER TABLE worker MODIFY tage INT;

-- 添加字段 ALTER TABLE 表名 ADD 字段 类型(长度) 约束;
ALTER TABLE worker ADD tsalary DOUBLE;

-- 删除字段 ALTER TABLE 表名 DROP 字段;
ALTER TABLE worker DROP tsalary;

-- 删除表 DROP TABLE 表名;
DROP TABLE worker;

-- 给建立 person 表,给表的 id 字段设置主键约束, name 字段非空约束, idcard 字段惟一约束。 
CREATE TABLE person(
    pid INT PRIMARY KEY,
    pname VARCHAR(20) NOT NULL,
    pidcard INT UNIQUE
);
DROP TABLE person;
-- 设置表字段的值自动增长 语法:字段名 数据类型 AUTO_INCREMENT;
CREATE TABLE person(
    pid INT PRIMARY KEY AUTO_INCREMENT,
    pname VARCHAR(20) NOT NULL,
    pidcard INT UNIQUE
);

-- INSERT 插入语句 
-- 语法 1 INSERTINTO 表名(列名 1,列名 2, …)VALUES(值 1, 值 2) 
INSERT INTO person(pid,pname,pidcard) VALUES(1,'zhangsan',1);
INSERT INTO person(pid,pname,pidcard) VALUES(2,'lisi',2);

-- 语法 2: INSERTINTO 表名 VALUES(值 1,值 2,…) 
INSERT INTO person VALUES(3,'wangwu',3);

-- 查询全部数据:SELECT*FROM 表名; 
SELECT * FROM person;

-- 查询指定字段:SELECT 字段名 1,字段名 2,字段名 3FROM 表名; 
SELECT pid FROM person;

-- 去除重复的数据:`SELECT DISTINCT 字段名 FROM 表名;
SELECT DISTINCT pid FROM person;

-- UPDATE 更新语句 UPDATE 表名称 SET 列名称 1= 新值 1, 列名称 2= 新值 2, ... WHERE 列名称 = 某值(旧值,条件值)
UPDATE person SET pname = 'haha' WHERE pid = 1;
UPDATE person SET pname = 'haha' WHERE pid < 3;

-- DELETE 删除语句 DELETE FROM 表名 WHERE 条件; 
DELETE FROM person WHERE pid = 1;

-- 删除所有数据方式一  DELETEFROMperson; 
DELETE FROM person; 

-- 删除全部记录方式二  `TRUNCATE TABLE 表名 `  `TRUNCATE TABLE student;`
TRUNCATE TABLE person;

CREATE TABLE Student( 
    id INT,
        NAME VARCHAR(20), 
    age INT, 
    scode INT, 
    mScore INT
)
INSERT INTO Student VALUES(1,'李四',25,001,59.5); 
INSERT INTO Student VALUES(2,'王五',26,002,75); 
INSERT INTO Student VALUES(3,'赵六',25,003,80); 
INSERT INTO Student VALUES(3,'赵六',25,003,80); 
INSERT INTO Student VALUES(4,'铁铲',50,NULL,50); 
INSERT INTO Student VALUES(5,'weidong',50,NULL,50); 
INSERT INTO Student VALUES(6,'yangguo',50,NULL,50); 
INSERT INTO Student VALUES(9,'zhaoliu',50,NULL,50); 
INSERT INTO Student VALUES(9,'da%niu',50,NULL,50);

-- 查询表中全部数据
SELECT * FROM Student;

-- 指定字段:SELECT 字段名 1,字段名 2FROM student; 
SELECT NAME,age  FROM Student;

-- 条件查询(必会)
-- 语法:SELECT*FROM 表名 WHERE 条件表达式; 
SELECT * FROM Student WHERE age = 25;
SELECT * FROM Student WHERE age > 25;
SELECT * FROM Student WHERE NAME = '赵六';

-- IN 关键字查询 语法 SELECT * FROM 表名 WHERE 字段名 IN(元素 1,元素 2)
SELECT * FROM Student WHERE id IN(1,2,3,4);
SELECT * FROM Student WHERE NAME IN('李四','赵六');

-- BETWEEN...AND...  语法 SELECT 字段名 FROM 表名 WHERE 字段名 BETWEEN 值 1AND 值 2;  
-- 值 1 表示范围的起始值  
-- 值 2 表示范围的结束值
SELECT * FROM Student WHERE id BETWEEN 2 AND 2;
SELECT * FROM Student WHERE id NOT BETWEEN 2 AND 2; -- 使用not表示再也不这个范围内

-- 空值查询 使用 ISNULL 关键字来判断字段的值是否为空值
-- 语法 SELECT*FROM 表名 WHERE 字段名 IS[NOT]NULL;
SELECT * FROM Student WHERE scode IS NULL;
SELECT * FROM Student WHERE scode IS NOT NULL;


-- 带 DISTINCT 关键字的查询 语法: SELECT DISTINCT 列名称 FROM 表名称 //只列出不重复的元素
SELECT DISTINCT * FROM Student;


-- 带 LIKE 关键字查询 语法 SELECT* FROM 表名 WHERE 字段名 [NOT]LIKE'匹配字符串';  
-- NOT 表示查询与指定字符串不匹配的记录 
-- 百分号(%)通配符 匹配任意长度的字符串,包括空字符串,
SELECT * FROM Student WHERE NAME LIKE 'w%';
SELECT * FROM Student WHERE NAME LIKE '%a%';
-- 下划线通配符值匹配单个字符串,若是须要匹配多个,那么须要多个下划线
SELECT* FROM student WHERE NAME LIKE 'we__ong';

-- 查询带百分号的字段`aa%bb`
SELECT * FROM student WHERE NAME LIKE'%\%%';

-- AND 关键字多条件查询 
-- 语法 SELECT* 字段 一、字段 2 FROM 表名 WHERE 条件表达式 1 AND 条件表达式 2...
SELECT age ,NAME FROM Student WHERE id>3 AND age>25;

-- 带 OR 关键字的多条件查询
--  语法 SELECT* 字段名 一、字段 2 FROM 表名 WHERE 条件表达式 1 OR 条件表达式 2;
SELECT NAME FROM Student WHERE id<3 OR age>26;

-- COUNT 用来统计记录的条数  语法 SELECT COUNT(*) FROM 表名;
SELECT COUNT(*) FROM Student;
-- 统计成绩大于 60 的学生有多少个? 
SELECT COUNT(*) AS '人数' FROM student WHERE mScore>60;
--  SUM 求和  语法 SELECT SUM(字段名)FROM 表名;
SELECT SUM(age) FROM Student;
-- 统计一个班的平均年龄
SELECT SUM(age)/COUNT(*) FROM Student;

-- AVG 求出某个字段全部值的平均值  语法 SELECT AVG(字段名) FROM student;
SELECT AVG(age) FROM Student;

--  MAX 最大值 语法 SELECT MAX(字段名) FROM student;
SELECT MAX(age) FROM Student;

--  MIN 最小值 语法 SELECT MIN(字段名) FROM student;
SELECT MIN(age) FROM Student;

-- 排序查询 语法 SELECT 字段名 1 FROM 代表 ORDER BY 字段名 1;  默认的排序是升序的
SELECT NAME FROM Student ORDER BY mScore;
SELECT * FROM Student ORDER BY mScore ASC;-- ASC 升序排列
SELECT * FROM Student ORDER BY mScore DESC;-- DESC 降序排列


-- 分组操做 语法 SELECT 字段名 1,字段名 2 FROM 表名 GROUPBY 字段名 1,字段名 2;  
-- 注意:该字段显示分组的第一条数据
SELECT*FROM student GROUP BY age; -- 只显示某一字段的值不一样的数据

-- 查询班级各个年龄段学生个数
SELECT age,COUNT(*) AS '人数'FROM student GROUP BY age;

-- GROUPBY 和 HAVING 关键字一块儿使用
-- HAVING 关键字和 WHERE 关键字做用相同,区别在于 HAVING 关键字后能够跟聚合函数, WHERE 关键字不能
-- 将 student 表按照 mscore 字段进行分组查询,查询出 mscore 字段值之和小于 150 的分组 
SELECT SUM(mscore),age FROM student GROUP BY mScore HAVING SUM(mscore)<150;

-- LIMIT 限制查询结果的数量 语法 SELECT 字段名 FROM 表名 LIMIT 记录数;
SELECT * FROM Student LIMIT 4;
SELECT * FROM Student LIMIT 4,5;