数据库回顾
数据库概述
1. 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作。
2. 数据库管理系统
数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建
立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系
统访问数据库中表内的数据。
3. 常见数据库
MYSQL:开源免费的数据库,小型的数据库.已经被Oracle收购了.MySQL6.x版本也开始收费。
Oracle:收费的大型数据库,Oracle公司的产品。Oracle收购SUN公司,收购MYSQL。
DB2 :IBM公司的数据库产品,收费的。常应用在银行系统中.
SQLServer:MicroSoft 公司收费的中型的数据库。C#、.net等语言常使用。
SyBase:已经淡出历史舞台。提供了一个非常专业数据建模的工具PowerDesigner。
SQLite:嵌入式的小型数据库,应用在手机端。
结构化查询语言(Structured Query Language)简称SQL ;
1.数据定义语言:
简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等。关键字:create,alter,drop等
创建数据库
create database 数据库名;
CREATE DATABASE mybase;
查看所有数据库
SHOW DATABASES;
查看某个数据库的定义的信息:
show create database 数据库名;
SHOW CREATE DATABASE mybase;
删除数据库
drop database 数据库名;
DROP DATABASE mybase;
切换数据库 使用数据库
use 数据库名
USE mybase;
USE mysql;
查看正在使用的数据库:
select database();
SELECT DATABASE()
表的操作
创建表
create table 表名(
列名 数据类型 [约束],
列名 数据类型 [约束],
列名 数据类型 [约束]
);
查看数据库中所有的表
SHOW TABLES
查看表结构
desc 表名
DESC category
修改表名
rename table 表名 to 新表名
RENAME TABLE category TO c;
删除表
drop table 表名
drop table category
列的操作
修改表结构
添加列
alter table 表名 add 列名 类型(长度) [约束];
为分类表添加一个新的字段为 分类描述 varchar(20)
ALTER TABLE category ADDdesc
VARCHAR(20);
修改列 修改类型 约束
alter table 表名 modify 列名 类型(长度) 约束
为分类表的描述字段进行修改,类型varchar(50) 添加约束 not null
ALTER TABLE category MODIFYdesc
VARCHAR(50) NOT NULL;
修改列 修改列名 数据类型 约束
alter table 表名 change 旧列名 新列名 类型(长度) 约束;
为分类表的分类名称字段进行更换 更换为 description varchar(30)
ALTER TABLE category CHANGEdesc
description VARCHAR(30);
删除列名
alter table 表名 drop 列名;
ALTER TABLE category DROP description;
2.数据操作语言:
简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新。关键字:insert,delete,update等
INSERT INTO 表名(列名1,列名2…) values(值1,值2…);
INSERT INTO category(cid,cname) VALUES(1,‘家电’);
如果设置了主键自动增长 可以不考虑主键添加
INSERT INTO category(cname) VALUES(‘手机’)
INSERT INTO 表名 values(全列值) 全列名添加
INSERT INTO category VALUES(NULL,‘饮料’)
INSERT INTO 表名(列名1,列名2…) values(值1,值2…),(值1,值2…),(值1,值2…),(值1,值2…)…
批量添加
INSERT INTO category(cname) VALUES
(‘食物’),
(‘服装’),
(‘床上用品’);
注意事项:
值与字段必须对应,个数相同,类型相同
值的数据大小必须在字段的长度范围内
除了数值类型外,其它的字段类型的值必须使用引号引起。(建议单引号)
如果要插入空值,可以不写字段,或者插入null
修改表记录
update 表名 set 列名 = 列值,列名 = 列值 where 条件
UPDATE category SET cname=‘水果’ WHERE cname=‘家电’;
UPDATE category SET cname=‘家电’ WHERE cid = 1;
UPDATE category SET cname=‘黄瓜’ WHERE cid=4 OR cid =5;
删除表数据
delete from 表名 [where] 条件
DELETE FROM category WHERE cid =5;
3.数据控制语言:
简称DCL(Data Control Language),用来定义数据库的访问权限和安全级别,及创建用户。
4.数据查询语言:
简称DQL(Data Query Language),用来查询数据库中表的记录。关键字:select,from,where等
1.简单查询
查询所有的商品
select 列名,列名 from 表名
SELECT pid,pname,price FROM product;
SELECT * FROM product;
查询商品名和商品价格
SELECT pname,price FROM product;
列名 as ‘别名’
SELECT pname AS ‘商品名称’,price AS ‘商品价格’ FROM product;
SELECT pname ‘商品名称’,price ‘商品价格’ FROM product;
SELECT pname 商品名称,price 商品价格 FROM product abc;
去掉重复值
distinct 列名
SELECT DISTINCT price FROM product;
做运算
将所有商品的价格+10元进行显示.
SELECT pname,price+10 price FROM product;
2.条件查询
查询商品名称为“花花公子”的商品所有信息:
SELECT * FROM product WHERE pname=‘花花公子’;
查询价格为800 的商品
SELECT * FROM product WHERE price = 800;
查询价格不为800 的商品
SELECT * FROM product WHERE price <>800;
SELECT * FROM product WHERE NOT (price=800);
查询商品价格大于60元的所有商品信息
SELECT * FROM product WHERE price>60;
查询商品价格在200-1000之间的所有商品信息
SELECT * FROM product WHERE price <=1000 AND price >=200 ;
SELECT * FROM product WHERE price BETWEEN 200 AND 1000;
查询商品价格是200或800的所有商品
SELECT * FROM product WHERE price =200 OR price =800;
SELECT * FROM product WHERE price IN(200,800);
模糊查询
查询含有’霸’字的所有商品
like 必须 和 % 或者_ 结合使用
SELECT * FROM product WHERE pname LIKE ‘%霸%’;
查询以’香’开头的所有商品
SELECT * FROM product WHERE pname LIKE ‘香%’;
查询所有商品名是4个字的商品
SELECT * FROM product WHERE pname LIKE ‘____’;
查询第2个字是想的所有商品
SELECT * FROM product WHERE pname LIKE ‘_想%’;
查询商品价格是null的商品
SELECT * FROM product WHERE price IS NULL;
查询商品价格不是null的商品
SELECT * FROM product WHERE price IS NOT NULL;
SELECT * FROM product WHERE NOT (price IS NULL);
3.排序查询
order by 列名 ASC/DESC
ASC 升序排列 默认就是升序 可以省略不写
desc 降序排序
查询所有商品 按照价格升序排列
SELECT * FROM product ORDER BY price ;
查询 id 为 1 3 5 7 的商品 并按价格降序排列
SELECT * FROM product WHERE pid IN(1,3,5,7) ORDER BY price DESC;
4.聚合查询
count(列名)
查询表中有多少条记录
SELECT COUNT(*) FROM product;
sum(列名) 求和
查询 pid为1 2 3 7商品价格的和
SELECT SUM(price) FROM product WHERE pid IN (1,2,3,7);
avg(列名) 求平均值
查询 pid为1 2 3 7商品价格的平均值
聚合函数 忽略 null值
SELECT AVG(price) FROM product WHERE pid IN (1,2,3,7,14);
max(列名) 最大值
min(列名) 最小值
查询最大的商品价格 好最小的商品价格
SELECT MAX(price) maxPrice,MIN(price) minPrice FROM product;
5.分组查询
查询 商品名称和商品价格
相同商品名价格求和
group by
1.group by 分组 必须和聚合函数结合使用
2.对哪一列分组 就要把哪一列查询出来
SELECT pname,SUM(price) FROM product GROUP BY pname;
查询 商品名称和商品价格
相同商品名价格求和 按照价格升序排列
SELECT pname,SUM(price) FROM product GROUP BY pname ORDER BY SUM(price);
SELECT pname,SUM(price) newPrice FROM product GROUP BY pname ORDER BY newPrice;
查询 商品名称和商品价格
相同商品名价格求和 只显示价格大于等于=2000的所有商品
where 查询之前就过滤 后面不能跟聚合函数的写法
having 分组查询之后 再过滤 可以写聚合函数
SELECT pname,SUM(price) newPrice FROM product GROUP BY pname HAVING newPrice>=2000;
SELECT pname,SUM(price) FROM product GROUP BY pname HAVING SUM(price)>=2000;
SQL通用语法
SQL语句可以单行或多行书写,以分号结尾
可使用空格和缩进
MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
同样可以使用/**/的方式完成注释
MySQL中的我们常使用的数据类型
类型名称
说明
int(integer)
整数类型
double
小数类型
decimal(m,d)
指定整数位与小数位长度的小数类型
date
日期类型,格式为yyyy-MM-dd,包含年月日,不包含时分秒
datetime
日期类型,格式为 YYYY-MM-DD HH:MM:SS,包含年月日时分秒
timestamp
日期类型,时间戳
varchar(M)
文本类型, M为0~65535之间的整数
select 字段 from 表名 where 条件 group by 字段 having 条件(运算) order by 字段 limit
执行顺序:From 表名 Where 伪表条件 Gourp by 字段 Having 运算区条件 Select 字段 Order by 字段 Limit
From 表名 把数据从硬盘读取出来,形成内存中的一张伪表
Where 条件 对伪表进行条件运算
Gourp by 字段 分组,字段值相同的分在一组。
划分了不同的运算区,运算区相互之间没有影响
(原来的伪表就不存在)
Having 运算 是在每个运算区中都分别进行一次运算
Select 字段 把各个运算区进行了合并,新伪表
把每个运算区的第一条数据拿出来拼接
注:如果该运算区第一条没有数据,该运算区没有返回数据
假如:第一条没有,第二条有数据,也叫做没有返回数据
Order by 字段 对某个字段进行值的升序、降序排序
Limit 对新伪表进行限制显示(分页)
SQL约束
主键约束
-
PRIMARY KEY 约束唯一标识数据库表中的每条记录。
-
主键必须包含唯一的值。
-
主键列不能包含 NULL 值。
-
每个表都应该有一个主键,并且每个表只能有一个主键。
-
主键列一般都是和业务逻辑无关的列
1.创建表时,在字段描述处,声明指定字段为主键
2.使用constraint区域添加
constraint 名称 primary key (字段列表)
3.创建表之后,通过修改表结构,声明指定字段为主键:
ALTER TABLE 表名 ADD CONSTRAINT 名称 PRIMARY KEY (字段列表)
ALTER TABLE persons ADD CONSTRAINT pk_id_p PRIMARY KEY(id_p);
删除主键约束
ALTER TABLE Persons DROP PRIMARY KEY
联合主键 将两列作为一个主键 这两列作为一个主键 不能都相同 可以相同一个
ALTER TABLE persons ADD CONSTRAINT pk_name PRIMARY KEY(LastName,FirstName);
非空约束
唯一约束
1.创建表时添加
2.使用constraint区域添加
CREATE TABLE Persons
(
Id_P INT PRIMARY KEY,
LastName VARCHAR(255) NOT NULL,
FirstName VARCHAR(255),
Address VARCHAR(255),
City VARCHAR(255),
[CONSTRAINT u_city] UNIQUE (city)
)
3. 创建表后,修改表结构,声明字段唯一:
ALTER TABLE Persons ADD [CONSTRAINT 名称] UNIQUE (Id_P)
ALTER TABLE persons ADD CONSTRAINT u_city UNIQUE (city)
删除唯一约束
alter table 表名 drop index 给唯一列起的名字 如果没起名就是列名;
ALTER TABLE Persons DROP INDEX u_city;
自动增长列
-
我们可以在表中使用 auto_increment(自动增长列)关键字,自动增长列类型必须是整型,自动增长列必须为键(一般是主键)。
-
扩展:默认AUTO_INCREMENT 的开始值是 1,如果希望修改起始值,请使用下列 SQL 语法:
ALTER TABLE persons AUTO_INCREMENT=100
针对auto_increment ,删除表中所有记录使用 delete from 表名 或使用 truncate table 表名,二者区别:
delete 一条一条删除,不清空auto_increment记录数。
truncate 直接将表删除,重新建表,auto_increment将置为零,从新开始。