/*
总结:
基本查询
条件查询
排序查询: order by
select * from 表名 order by 字段名 ASC(默认)|DESC;
此处的字段,最好是有大小关系的,比如是数值,单文单词
聚合查询: 纵向查询,查询出的结果就一个
COUNT:统计个数,忽略NULL值
求数值类型
MAX:求最大值
MIN:求最小值
AVG:求平均值
SUM:求总和
分组查询: group by
select count(*)| sum(price) from 表名 group by 字段名 having 条件;
where和having区别:
where用于基本查询后数据过滤
having用于分钟查询后的数据过滤
分页查询: limit 序号,记录数
查询第m页的n条记录
limit (m-1)*n,n
几个约束:
主键约束:primary key
唯一约束:unique
非空约束:not null
默认约束:default 值
自动增长约束:auto_increment
统一的格式:
create table 表名(
字段 数据类型(长度) 约束名字
);
外键约束:foreign key
多表操作:
1.为什么使用多表,因为一张表存储不合适
2.一对多(多对一):
建表原则:有主表,有从表,从表必须有一个外键,引用主表的主键
3.多对多:
建表原则:需要有一个中间表,中间表至少三个字段
1.一个主键 2.两个外键
4.一对一:
一般我们建立一张表
*/
DML:数据库操作语言
/*
DML:数据库操作语言
主要对表中的数据库进行 增删改
****增:插入一条记录
insert into 表名 (列名1,列名2..) values (值1,值2..)
注意: 1.列名可以在表中选择一列或者几列
2.后面的值 必须和前面的列 一一对应
3.在SQL中除了int类型的数据,其他数据必须用''或者""引起来
我们推荐用单引号
4.如果要插入的数据所有字段都有,那么以上的
(列名1,列名2..) 可以省略
****删:删除一条记录
格式: delete from 表名;//删除表中的所有记录
delete from 表名 where条件;
****改:修改表中的记录信息
update 表名 set 字段名 = 值;//把所有记录的该列都改了
update 表名 set 字段名 = 值 where条件;
*/
#向students 表中插入一个学生信息(id:001 name:李四 )
INSERT INTO students (sid,NAME) VALUES ('001','李四');
#向students 表中插入一个学生信息(id:002 name:王五 age:18 )
INSERT INTO students (sid,NAME,sage) VALUES ('002','王五',18);
INSERT INTO students VALUES ('003','赵六',28);
#删除students表中的记录
DELETE FROM students;
#删除某一条记录
DELETE FROM students WHERE sid=3;# 这里条件sid=3不能写成 sid==3,sid.equals(3);
#修改students表,把sage这一列的值 改为20
UPDATE students SET sage=20;
#修改students表,把王五的sage这一列的值 改为 50
UPDATE students SET sage = 50 WHERE NAME='王五';# sid = 2
DQL:查询数据库中的数据
/*
DQL:查询数据库中的数据
基本格式:
select [distinct] *|列名1,列名2 from 表名;# 查询表中的所有列数据
带有条件的查询 用关键字 where
*/
准备工作
#创建商品表:
create table product(
pid int primary key,
pname varchar(20),
price double,
category_id varchar(32)
);
INSERT INTO product(pid,pname,price,category_id) VALUES(1,'联想',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(2,'海尔',3000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(3,'雷神',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(4,'JACK JONES',800,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(5,'真维斯',200,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(6,'花花公子',440,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(7,'劲霸',2000,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(8,'香奈儿',800,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(9,'相宜本草',200,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(10,'面霸',5,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(11,'好想你枣',56,'c004');
INSERT INTO product(pid,pname,price,category_id) VALUES(12,'香飘飘奶茶',1,'c005');
INSERT INTO product(pid,pname,price,category_id) VALUES(13,'果9',1,NULL);
语法:
#基本查询
SELECT * FROM product;
SELECT pname,price FROM product;
SELECT price FROM product;
SELECT DISTINCT price FROM product;
#基本查询练习
# 1.查询所有的商品.
SELECT * FROM product;
# 2.查询商品名和商品价格.
SELECT pname,price FROM product;
# 3.去掉价格重复值.
SELECT DISTINCT price FROM product;
# 4.查询结果是表达式(运算查询):将所有商品的价格+10元进行显示.
SELECT price+10 FROM product;
# 5.别名查询.使用的关键字是as(as可以省略的).
SELECT price+10 AS 打折价格 FROM product;
SELECT price+10 打折价格 FROM product;
#条件查询练习
#查询商品名称为“花花公子”的商品所有信息:
SELECT * FROM product WHERE pname='花花公子';
#查询价格为800商品
SELECT * FROM product WHERE price=800;
#查询价格不是800的所有商品
SELECT * FROM product WHERE price <> 800;
SELECT * FROM product WHERE price > 800 OR price < 800;
SELECT * FROM product WHERE NOT (price=800);
#查询商品价格大于60元的所有商品信息
SELECT * FROM product WHERE price > 60;
SELECT * FROM product WHERE NOT (price <= 60);
#查询商品价格在200到1000之间所有商品
SELECT * FROM product WHERE price >= 200 AND price <=1000;
SELECT * FROM product WHERE price BETWEEN 200 AND 1000;
#查询商品价格是200或800的所有商品
SELECT * FROM product WHERE price IN (200,800);
SELECT * FROM product WHERE price = 200 OR price = 800;
#查询含有'霸'字的所有商品
SELECT * FROM product WHERE pname LIKE '%霸%';
#查询以'香'开头的所有商品
SELECT * FROM product WHERE pname LIKE '香%';
#查询第二个字为'想'的所有商品
SELECT * FROM product WHERE pname LIKE '_想%';
#查询没有分类的商品
SELECT * FROM product WHERE category_id IS NULL;
#SELECT * FROM product where category_id = null;# 错误的 判断空 不能用"="
#查询有分类的商品
SELECT * FROM product WHERE category_id IS NOT NULL;
#SELECT * FROM product WHERE category_id <> NULL;# 错误的 判断不为空 不用"<>"
#查询所有价格大于2000的电脑商品(catetory_id是c001)
#或者价格大于2000的服装商品(catetory_id是c002)**
SELECT * FROM product WHERE (price > 2000 AND category_id = 'c001')
OR (price > 2000 AND category_id = 'c002');
SELECT * FROM product WHERE price > 2000 AND category_id IN ('c001','c002');
排序查询
/*
排序查询:对查询结构进行排序
关键字:order by 字段名 [ASC|DESC]
ASC:升序(从小到大),默认的
DESC:降序(从大到小)
*/
# 查询所有记录的name和price,结构按照价格 从大到小进行排序
SELECT pname,price FROM product ORDER BY price 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;
聚合查询
/*
聚合查询:
以前的查询都是横向记录查询
而聚合查询是 纵向个数查询
聚合查询的特点:查询到的结构 是单一值
聚合函数:
count:求记录数的聚合函数,count函数会自动忽略空值
以下四个,通常用于数值的计算
max:求最大值
min:求最小值
avg:求平均值
sum:求和
*/
#查询统计多有商品的个数
SELECT COUNT(*) FROM product;
#查询统计一共有多少个分类
SELECT COUNT(category_id) FROM product;
#查询所有商品价格的最大值
SELECT MAX(price) FROM product;
#查询所有商品价格的最小值
SELECT MIN(price) FROM product;
#查询所有商品价格的最平均值
SELECT AVG(price) FROM product;
#查询所有商品价格的总值
SELECT SUM(price) FROM product;
#查询所有商品价格的最大值,最小值,平均值,总和
SELECT MAX(price) AS 最大值,MIN(price) 最小值,AVG(price) 平均值,SUM(price) 总和 FROM product;
分组查询
/*
分组查询:
把查询数据分为几个组
关键字: group by 字段
先分组,再查询,具体查询到的结果数,取决于能分多少组
如果分组后 还有需要条件判断 那么请用having关键字
where和having的区别:
where 写在 基本查询后面的
having 写在 分组查询后面的
where后面是不能写 count sum等聚合函数
having后面可以写count和sum等聚合函数
*/
#查询所有以category_id分组后的价格的总和
# 具体有多少个总和 取决于可以分多少组
SELECT SUM(price) FROM product GROUP BY category_id;
#0 统计所有商品的个数
SELECT COUNT(*) FROM product;
#1 统计各个分类商品的个数
SELECT COUNT(*) FROM product GROUP BY category_id;
#2 统计各个分类商品的个数,且只显示个数大于1的信息
SELECT category_id, COUNT(*) 个数 FROM product GROUP BY category_id HAVING 个数 > 1;
分页查询
/*
分页查询:
只查询记录中的一部分
关键字: limit 数值1(下标,从0开始),数值2(需要查出来记录数)
*/
SELECT * FROM product LIMIT 0,5;
SELECT * FROM product LIMIT 5,5;
SELECT * FROM product LIMIT 10,5;
# 查询的公式: 假设每一页我要查询 n条
# 第1页 limit (1-1)*n,n
# 第2页 limit (2-1)n,n
# 第100页 limit (100-1)*n,n
# 第m页 limit (m-1)*n,n
sql备份
sql恢复
主键约束
/*
各种约束的介绍:
主键约束: primary key
作用:保证该字段 唯一并且不为空
语法:
***1.在创建表的时候,直接在字段后面添加主键约束
2.在创建表的时候,不直接在字段后面添加主键(了解)
在表的约束区域添加主键
[constraint 名称] primary key (字段列表)
3.在创建表时,不写主键
表创建后,再通过修改表的结构 给某个字段添加主键
删除主键约束
ALTER TABLE Persons DROP PRIMARY KEY
*/
# 创建一张表 并且直接给字段添加主键约束
CREATE TABLE books(
bid INT PRIMARY KEY,# 主键约束
bname VARCHAR(50),
bprice DOUBLE
);
#插入几条记录
INSERT INTO books VALUES (1,'java菜鸟入门',10.0);
# 因为bid是主键 所以重复数据不能插入
INSERT INTO books VALUES(1,'java高手进阶',20.0);
# 这次可以插入进去,此时bid有默认值,bid=0
INSERT INTO books (bname,bprice) VALUES ('java高级工程师颈椎恢复指南',30.0);
# 再次插入,bid=0已经存在,重复数据不能插入
INSERT INTO books (bname,bprice) VALUES ('java究极工程师颈椎恢复指南',40.0);
INSERT INTO books VALUES (NULL,'java究极工程师颈椎不恢复指南',50.0);
#删除表
DROP TABLE books;
# 在创建表的时候,不直接在字段后面添加主键
# 在表的约束区域添加主键
CREATE TABLE books(
bid INT ,
bname VARCHAR(50),
bprice DOUBLE,
# 在这里叫做约束区域
CONSTRAINT pk_bid PRIMARY KEY(bid)
);
#在创建表时,不写主键
#表创建后,再通过修改表的结构 给某个字段添加主键
CREATE TABLE books(
bid INT ,
bname VARCHAR(50),
bprice DOUBLE
);
ALTER TABLE books ADD CONSTRAINT pk_bid PRIMARY KEY (bid);
# 删除主键约束
ALTER TABLE books DROP PRIMARY KEY;
唯一约束
/*
唯一约束: unique
作用:保证该字段 唯一,可以为null
给字段添加唯一约束
***1.在创建表时,直接在字段后面写上唯一约束
2.创建表时,在约束区域,声明唯一约束:
3. 创建表后,给表的字段添加唯一约束
删除唯一约束:
alter table 表名 drop unique(约束名);
如果添加唯一约束的时候 没有给唯一约束起名字 那么默认是字段名
*/
# 在创建表时,直接在字段后面写上唯一约束
CREATE TABLE books(
bid INT UNIQUE,
bname VARCHAR(50),
bprice DOUBLE
);
#查看表:唯一约束属性
DESC books;
#删除表
DROP TABLE books;
DESC books;
#创建表时,在约束区域,声明唯一约束:
CREATE TABLE books(
bid INT ,
bname VARCHAR(50),
bprice DOUBLE,
# 在约束区域 声明唯一约束
CONSTRAINT unique_bid UNIQUE(bid)
);
#创建表后,给表的字段添加唯一约束
CREATE TABLE books(
bid INT ,
bname VARCHAR(50),
bprice DOUBLE
);
# 通过修改表的结构 添加唯一约束
ALTER TABLE books ADD CONSTRAINT unique_bid UNIQUE(bid);
# 删除唯一约束
ALTER TABLE books DROP INDEX unique_bid;
自动增长约束
/*
自动增长约束: auto_increment
作用: 把该字段的值 交给 数据库去维护
数据库默认每次增加1
给某个字段添加自动增长约束 (该字段必须是一种键,一般来说是主键)
*** 1.在创建表的同时,直接在字段后面添加自动增长约束
2.创建表之后,添加自动增长约束
ALTER TABLE books MODIFY bid INT AUTO_INCREMENT;
删除自动增长约束
ALTER TABLE books MODIFY bid INT ;
*/
#删除books
DROP TABLE books;
#.在创建表的同时,直接在字段后面添加自动增长约束
CREATE TABLE books(
bid INT PRIMARY KEY AUTO_INCREMENT,
bname VARCHAR(50)
);
#添加记录
INSERT INTO books(bname) VALUES ('java入门');
INSERT INTO books VALUES(NULL,'php入门');
INSERT INTO books(bname) VALUES ('android'),('iOS'),('winphone');
#删除表
DROP TABLE books;
#创建表之后,添加自动增长约束
CREATE TABLE books(
bid INT PRIMARY KEY ,
bname VARCHAR(50)
);
#check the manual that corresponds to your MySQL server version for the right syntax to use near 'AUTO_INCREMENT(bid)' at line 1
# 这种方式竟然不行
ALTER TABLE books ADD CONSTRAINT ai_bid AUTO_INCREMENT(bid);
# 使用一下方式
ALTER TABLE books MODIFY bid INT AUTO_INCREMENT;
# 删除自动增长约束
ALTER TABLE books MODIFY bid INT ;
# 添加记录
INSERT INTO books VALUES(NULL,'aaa');
INSERT INTO books(bname) VALUES('aaa');
INSERT INTO books VALUES(100,'bbb');
INSERT INTO books VALUES(NULL,'bbb');
默认约束
/*
默认约束: default
作用: 给该字段添加一个默认值(如果添加记录时,没赋值的话)
语法:
***1.在创建表时 直接在字段后添加默认约束
2.在创建表之后,通过修改表的结构添加
ALTER TABLE 表名 MODIFY 字段名 VARCHAR(255) DEFAULT 默认值
*/
#在创建表时 直接在字段后添加默认约束
CREATE TABLE books(
bid INT PRIMARY KEY AUTO_INCREMENT,
bname VARCHAR(50) DEFAULT 'java入门'
);
SELECT COUNT(*) FROM books;
#添加数据
INSERT INTO books VALUES();
INSERT INTO books VALUES(NULL,'php入门');
#在创建表之后,通过修改表的结构添加
CREATE TABLE books(
bid INT PRIMARY KEY AUTO_INCREMENT,
bname VARCHAR(50)
);
ALTER TABLE books MODIFY bname VARCHAR(50) DEFAULT 'java入门';
非空约束
/*
非空约束: not null
作用:被not null约束的字段 不能为null值
语法:
*** 1. 在创建表时,直接在字段后添加非空约束
2.在创建表之后,通过修改表的结构
ALTER TABLE 表名 MODIFY 字段 varchar(255) NOT NULL
删除非空约束
ALTER TABLE 表名 MODIFY 字段 varchar(255)
*/
#删除
DROP TABLE books;
# 在创建表时,直接在字段后添加非空约束
CREATE TABLE books(
bid INT PRIMARY KEY ,
bname VARCHAR(50) NOT NULL
);
INSERT INTO books VALUES(1,NULL);
INSERT INTO books VALUES(1,'null')
INSERT INTO books VALUES(2,'')
#.在创建表之后,通过修改表的结构
CREATE TABLE books(
bid INT PRIMARY KEY ,
bname VARCHAR(50)
);
ALTER TABLE books MODIFY bname VARCHAR(50) NOT NULL;
#删除非空
ALTER TABLE books MODIFY bname VARCHAR(50);
多表操作
1.为什么使用多表,因为一张表存储不合适
2.一对多(多对一):
建表原则:有主表,有从表,从表必须有一个外键,引用主表的主键
3.多对多:
建表原则:需要有一个中间表,中间表至少三个字段
1.一个主键 2.两个外键
...