一、概述:
1.数据库(DateBase,DB):数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作。
2.数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中表内的数据。
3.表:数据库中以表为组织单位存储数据,表中的行称为记录,列称为字段。
4.表数据:表类似我们的Java类,每个字段都有对应的数据类型。
5.常见的DBMS:MYSQL、Oracle、DB2、SQLServer、SyBase、SQLite
二、MySQL
1.安装
2.SQL语句
概念:结构化查询语言(Structured Query Language)简称SQL,是关系型数据库管理系统都需要遵循的规范;不同的数据库生产厂商都支持SQL语句,但都有各自的特有内容。
分类
1)DDL(Data Definition Language):用来定义数据库中的对象:数据库、表、列等,关键字:create,alter,drop, show等;
2)DML(Data Manipulation Language):用来对数据库中表的记录进行更新关键字:insert,delete,update等;
3)DCL(Data Control Language):用来定义数据库的访问权限和安全级别,及创建用户;
4)DQL(Data Query Language):用来查询数据库中表的记录,关键字:select,from,where等;
通用语法
1)不区分大小写,关键字建议使用大写;
2)可以单行或多行书写,以分号结尾;
3)可以使用/**/的方式完成注释;
4)数据类型如下图
DDL示例
--------------------------------------------------DDL操作 数据库---------------------------------------------------
#创建数据库:create database 数据库名;
CREATE DATABASE db1216;
#指定字符集创建数据库:create database 数据库名 character set 字符集;
CREATE DATABASE db121601 CHARACTER SET utf8;
#查看MySQL服务器中的所有的数据库:show databases;
SHOW DATABASES;
#查看某个数据库的定义的信息:show create database 数据库名;
SHOW CREATE DATABASE db1216;
#删除数据库:drop database 数据库名称;
DROP DATABASE db121601;
#查看正在使用的数据库:select database();
SELECT DATABASE();
#切换数据库:use 数据库名;
USE db1216;
----------------------------------------------------DDL操作 表----------------------------------------------------
/*创建表
create table 表名(
字段名 类型(长度) [约束],
字段名 类型(长度) [约束],
...
);
*/
CREATE TABLE person(
pid INT PRIMARY KEY,
pname VARCHAR(30),
pgender VARCHAR(30)
);
CREATE TABLE animal(
aname VARCHAR(20),
aage INT,
asex VARCHAR(30)
);
#修改表名:rename table 表名 to 新表名;
RENAME TABLE animal TO animal01;
#删除表:drop table 表名;
DROP TABLE animal01;
#查看数据库中的所有表:show tables;
SHOW TABLES;
#查看表详细信息:desc 表名;
DESC person;
----------------------------------------------------DDL操作 列----------------------------------------------------
#添加列:alter table 表名 add 列名 类型(长度) [约束];
ALTER TABLE person ADD page INT;
ALTER TABLE person ADD psex VARCHAR(30);
#删除列:alter table 表名 drop 列名;
ALTER TABLE person DROP pgender;
#修改列名:alter table 表名 change 旧列名 新列名 类型(长度) 约束;
ALTER TABLE person CHANGE psex pgender VARCHAR(30);
#修改列的类型长度及约束:alter table 表名 modify 列名 类型(长度) 约束;
ALTER TABLE person MODIFY pgender VARCHAR(30);
#修改表的字符集:alter table 表名 character set 字符集;(一般不修改)
ALTER TABLE person CHARACTER SET utf8;
----------------------------------------------------DML操作 表----------------------------------------------------
#向表中插入某些字段:insert into 表 (字段1,字段2,字段3..) values (值1,值2,值3..);
INSERT INTO person (pid,pname) VALUES (02,'小华');
INSERT INTO person (pid,pname,page,psex) VALUES (01,'小明',20,'男');
#向表中插入所有字段:insert into 表 values (值1,值2,值3..);
INSERT INTO person VALUES (03,'小红',21,'女');
#删除所有记录:truncate table 表名;
TRUNCATE TABLE person;
DELETE FROM person;
#删除指定记录:delete from 表名 [where 条件];
DELETE FROM person WHERE pname = '小华';
#修改所有记录的指定字段:update 表名 set 字段名=值,字段名=值,...;
UPDATE person SET page = 18,psex = '男';
#修改符合条件记录的指定字段:update 表名 set 字段名=值,字段名=值,... where 条件;
UPDATE person SET psex = '女' WHERE pname = '小红';
注意:
值与字段必须对应,个数相同,类型相同;
值的数据大小必须在字段的长度范围内;
除了数值类型外,其它的字段类型的值必须使用引号引起(建议单引号) ;
如果要插入空值,可以不写字段,或者插入 null;
delete和truncate删除表的所有记录的区别:
1)delete 一条一条删除,不清空auto_increment记录数;
2)truncate 直接将表删除,重新建表,auto_increment将置为零,从新开始;
DOS下的乱码原因:因为mysql的客户端设置编码是utf8,而系统的cmd窗口编码是gbk;
解决方法:
1)查看MySQL内部设置的编码: show variables like ‘character%’;
2)修改client、connection、results的编码一致(GBK编码):
- 方式1:单独设置 set character_set_client=gbk; set character_set_connection=gbk; set character_set_results=gbk;
- 方式2:快捷设置 set names gbk;
----------------------------------------------------DQL简单查询----------------------------------------------------
格式:select [distinct] | 列名1,列名2 from 表名;
#查询表内所有内容:select * from 表名;
SELECT * FROM product;
#查询表内指定列的内容:select 列名1,列名2 from 表名;
SELECT pname,price FROM product;
#去掉查询一个列中的重复值:select distinct 列名 from 表名;
SELECT DISTINCT price FROM product;
错误:SELECT DISTINCT price,DISTINCT category_id FROM product;
错误:SELECT DISTINCT price,category_id FROM product;
#查询结果是表达式(运算查询):例如将所有商品的价格+10元进行显示.
SELECT pname,price+10 FROM product;
#取别名查询.使用的关键字是as(as可以省略的).
#表别名: select * from product as 表;
#列别名:select pname as 名字 from product;
----------------------------------------------------DQL条件查询----------------------------------------------------
格式:select [distinct] * | 列名1,列名2 from 表名 [where 条件];
符号使用见图;
----------------------------------------------------DQL排序查询----------------------------------------------------
#order by语句
#格式:SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC;
#例1.查询所有商品信息,使用价格排序(降序)
SELECT * FROM product ORDER BY price DESC;
#例2.查询所有商品信息,先对价格排序(降序),再对分类排序(降序)
SELECT * FROM product ORDER BY price DESC,category_id DESC;
#例3.只查询商品的价格(去重复),并排序(降序)
SELECT DISTINCT price FROM product ORDER BY price DESC;
----------------------------------------------------DQL聚合查询----------------------------------------------------
#聚合函数查询是纵向查询(会忽略空值),是对查询后的结果的列进行计算,然后返回一个单一的值;
#count:统计指定列不为NULL的记录行数;
#例1.查询商品的总行数;
SELECT COUNT(*) FROM product;
#例2.查询价格的总行数;
SELECT COUNT(price) FROM product;
#sum:计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
#例1.查询所有商品价格的总和
SELECT SUM(price) FROM product;
#例2.查询分类为'c001'的所有商品价格的总和
SELECT SUM(price) FROM product WHERE category_id = 'c001';
#max:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
#例1.查询商品的最大价格
SELECT MAX(price) FROM product;
#min:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
#例1.查询商品的最小价格
SELECT MIN(price) FROM product;
#avg:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
#例1.查询所有商品的平均价格
SELECT AVG(price) FROM product ;
#例2.查询商品的最大价格、最小价格、均价、总和
SELECT MAX(price),MIN(price),AVG(price),SUM(price) FROM product;
----------------------------------------------------DQL分组查询----------------------------------------------------
#分组查询是指使用group by字句对查询信息进行分组;
#格式:SELECT 字段1,字段2… FROM 表名GROUP BY分组字段 HAVING 分组条件;
#例1.统计各个分类商品的个数
SELECT category_id ,COUNT(*) FROM product GROUP BY category_id ;
#例2.统计各个分类商品的个数,且只显示个数大于1的信息
SELECT category_id ,COUNT(*) FROM product GROUP BY category_id HAVING COUNT(*) > 1;
SELECT category_id AS 分类,COUNT(*) AS 个数 FROM product GROUP BY 分类 HAVING 个数 > 1;
----------------------------------------------------DQL分组查询----------------------------------------------------
#分页查询在项目开发中常见,由于数据量很大,显示屏长度有限,因此对数据需要采取分页显示方式;
#格式:SELECT 字段1,字段2... FROM 表名 LIMIT M,N
#M: 整数,表示从第几条索引开始
#N: 整数,表示查询多少条数据
having与where的区别:
having是在分组后对数据进行过滤,where是在分组前对数据进行过滤;
having后面可以使用聚合函数过滤数据 ,where后面不可以使用聚合函数;
3.SQL的备份和还原
1)图形管理工具 备份
备份:右键点击数据库—》备份
还原:右键—》导入
2)Mysql自带命令行 备份
备份示例:“D:/software/MySQL Server 5.1/bin/mysqldump.exe” -uroot -padmin -hlocalhost -P3306 test -r d:\test.sql
还原示例:“D:/software/MySQL Server 5.1/bin/mysql.exe” -u root -padmin test < d:/test.sql
4.SQL的约束
添加数据完整性=添加表约束
分类:
1)主键约束(primary key)
概念:唯一标识数据库表中的每条记录,每条记录中被主键约束 约束的字段不能相同。
格式:
CREATE TABLE Persons
(
id int PRIMARY KEY,
name varchar(255),
address varchar(255)
)
#格式:[constraint 主键名称] primary key (字段列表)
CREATE TABLE Persons
(
id int,
name varchar(255),
address varchar(255)
CONSTRAINT pid PRIMARY KEY (id,name) #主键被命名为pid,约束的字段为id和name,多个字段用逗号隔开
PRIMARY KEY (id) #不需要命名主键,关键字constraint可以省略
)
#格式:ALTER TABLE 表名 ADD [CONSTRAINT 名称] PRIMARY KEY (字段列表)
CREATE TABLE Persons
(
id int,
name varchar(255),
address varchar(255)
)
ALTER TABLE Persons ADD PRIMARY KEY (FirstName);
格式:ALTER TABLE 表名 DROP PRIMARY KEY
注意:主键必须是唯一的值;主键列不能是 NULL 值;每个表都应该有且只能有一个主键。
2)唯一主键(UNIQUE)
概念: 唯一标识数据库表中的每条记录,PRIMARY KEY 拥有自动定义的 UNIQUE 约束;
格式:
添加唯一约束方式(3种):和主键约束类似;如果添加唯一约束时,没有设置约束名称,默认是当前字段的字段名;
删除唯一约束方式:
#格式:ALTER TABLE 表名 DROP INDEX 约束名称
注意:
唯一约束与主键约束的区别:
1.主键:唯一、不能为空、一个表只能有一个主键,非业务数据
2.唯一:唯一、可以有空值,但只能有一个空值。一个表可以有多个唯一约束。
3)自动增长列(AUTO_INCREMENT)
概念:使用此关键字在插入新记录时,数据库自动生成字段的值;
格式:
CREATE TABLE Persons
(
id int PRIMARY KEY AUTO_INCREMENT,
name varchar(255),
address varchar(255)
)
注意:
- 自动增长列类型必须是整形,自动增长列必须为键(一般是主键);
- 默认地AUTO_INCREMENT 的开始值是 1,修改起始值语法: ALTER TABLE 表名 AUTO_INCREMENT=100;
- 如果自动增长过程中手动修改了值,下一次使用自动增长会从修改的值开始;
4)非空约束(NOT NULL)
概念:强制列不接受 NULL 值,如果不向字段添加值,就无法插入新记录或者更新记录。
格式:
CREATE TABLE Persons
(
id int NOT NULL,
name varchar(255),
address varchar(255)
)
#格式:ALTER TABLE 表名 MODIFY 字段 类型 NOT NULL;
例:ALTER TABLE Persons MODIFY id int NOT NULL;
#格式:ALTER TABLE 表名 MODIFY 字段 类型
5)默认约束(DEFAULT)
概念: 在添加数据中,如果该字段不指定值,采用默认值处理;
格式:
CREATE TABLE Persons
(
id int,
name varchar(255),
address varchar(255) DEFAULT '北京',
)
#格式: ALTER TABLE 表名 MODIFY 字段 类型 DEFAULT 值 ;
例: ALTER TABLE Persons MODIFY address VARCHAR(255) DEFAULT '北京' ;
#格式:ALTER TABLE 表名 MODIFY 字段 类型;
6)外键约束()