单表查询
1、排序格式
通过order by语句,可以将查询出的结果进行排序。防止在select语句的最后
语法 select * from 表名 where 条件 order by 排查字段 ASC|DESC; ASC 升序(默认) DESC 降序
例1:使用价格排序(降序)
select * from d_product order by price desc
例2:显示商品的价格(去重复),并排序(降序)
select distinct price from d_product order by price desc
例3:模糊查询之后,降序
select pname,price from d_product where panem like "%o%" order by price desc
2、聚合
使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空值。
5个常用的聚合函数:
- count:统计指定列不为NULL的记录行数
- sum:计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果都为0
- max:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算(即按字典排序)
- min:计算指定列的最小值,如法国指定列是字符串类型,那么使用字符串排序运行(即按字典排序)
- avg:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0
/*聚合函数*/#1、count(列名)统计个数#统计价格在800以上一共有多少商品SELECT COUNT(*) AS total FROM d_product WHERE price>=800#统计一共有几种价格SELECT COUNT(DISTINCT price)FROM d_product#统计价格的何止SELECT SUM(price) FROM d_product#获取价格最大的商品的价格SELECT MAX(price) FROM d_product#获取价格最小的商品的价格SELECT MIN(price) FROM d_product#获取所有商品的平均价格(返回的是double类型)SELECT AVG(price) FROM d_product
3、分组
分组是指视同group by 子句对查询信息进行分组
语法格式
select 字段1,字段2.... from 表名 group by 分组字段 having 分组条件
分组操作中的having子语句,是用于在分组后,对数据进行过滤,作用类似于where条件
having与where的区别
- having是在分组后对数据进行过滤
- where是在分组前对数据进行过滤
- having后面可以使用分组函数(统计函数)
- where后面不可以使用分组函数
/*分组 最好和聚合函数结合使用*/#按照价格分组SELECT price FROM d_product GROUP BY price#与下面结果相同SELECT DISTINCT price FROM d_product ORDER BY price ASC#按照类别id分组 该类名的商品个数 平均价格 类别SELECT COUNT(*),AVG(price),category_id FROM d_product GROUP BY category_id#先筛选后分组 对非空的category_id进行分组域 注意where的位置SELECT COUNT(*),AVG(price),category_id FROM d_product WHERE category_id IS NOT NULL GROUP BY category_id#先分组后筛选 筛选出平均价格在500以上的商品分组SELECT COUNT(*),AVG(price),category_id FROM d_product GROUP BY category_id HAVING AVG(price)>500
约束
1、添加主键约束
primary key 约束唯一标识数据库表中的每条记录
主键列不能包含NULL值
每个表都应该有一个主键,并且每个表只能有一个主键
添加主键方法一:创建表时,在此字段描述出,声明指定字段为主键
create table Persion(id int primary key,name varchar(30))
添加主键方法二:创建表时,在constraint约束区域,声明指定字段为主键
- 语法格式
格式:【constraint 主键别名】 primary key(字段名)注意:1、关键字constraint 可以省略 ,如果需要为主键命名,constraint不能省略,主键名一般没用2、字段列表需要使用小括号括住,如果有多字段需要使用逗号分隔。声明两个以上字段为主键,我们成为联合主键
create table Persion(id int,name varchar(30),constraint pk_PersionID primary key(id))
CREATE TABLE Persons(FirstName varchar(255),LastName varchar(255),Address varchar(255),City varchar(255),PRIMARY KEY (FirstName,LastName))
- 添加主键方法三:创建表之后,通过修改表结构,声明指定字段为主键
```sql CREATE TABLE Persons ( FirstName varchar(255), LastName varchar(255), Address varchar(255), City varchar(255) ) ALTER TABLE Persons ADD PRIMARY KEY (FirstName,LastName)alter table Persion add [constaint 名称] primary key (字段列表)
<a name="8nwm9"></a>## 2、删除主键```sqlalter table Persions drop primary key
3、自动增长
使用auto_increment(自动增长列)关键字,自动增长列类型必须是整形,自动增长列必须为键(一般为主键)
create table Persion1(id int primary key AUTO_INCREMENT,name varchar(30))
面试:delete和truncate的区别
- delete删除表中得的数据,但不充值auto_increment记录数
- truncate删除表中的数据,auto_increment记录数将重置。是因为truncate先删除表,然后重新创建一个一模一样的新表
扩展:磨人的,auto_increment的开始值是1,如果希望修改起始值,可以使用:
alter table Persion auto_increment=100
4、外键约束
通过主表的主键和从表的外键来描述主外键关系,呈现就是一对多的关系。即一对多,是相对于主表而言的,而多对一是相对于从表而言的。
外键特点
- 从表外键的值是对主表主键的引用
- 从表外键类型,必须与主表主键类型一致
外键约束语法
添加外键:alter table 从表 add constraint【外键名称】foreign key (从表外键字段名)references 主表(主表的主键)
删除外键:alter table 从表 drop foreign key 外键名称
使用外键的目的:保证数据的完整性
代码
#创建商品表:CREATE TABLE d_product(pid INT PRIMARY KEY,pname VARCHAR(20),price DOUBLE,category_id VARCHAR(32));INSERT INTO `d_product` VALUES ('1', '苹果', '5000', 'c001');INSERT INTO `d_product` VALUES ('2', 'vivo', '3000', 'c001');INSERT INTO `d_product` VALUES ('3', '华为', '5000', 'c001');INSERT INTO `d_product` VALUES ('4', 'oppo', '1000', 'c001');INSERT INTO `d_product` VALUES ('5', '真维斯', '200', 'c002');INSERT INTO `d_product` VALUES ('6', 'only', '440', 'c002');INSERT INTO `d_product` VALUES ('7', '圣迪奥', '800', 'c002');INSERT INTO `d_product` VALUES ('8', 'vero moda', '800', 'c003');INSERT INTO `d_product` VALUES ('9', '相宜本草', '200', 'c003');INSERT INTO `d_product` VALUES ('10', '卫龙辣条', '5', NULL);INSERT INTO `d_product` VALUES ('11', '好想你枣', '56', NULL);INSERT INTO `d_product` VALUES ('12', '香飘飘奶茶', '3', NULL);INSERT INTO `d_product` VALUES ('13', '小浣熊干脆面', '1', NULL);SELECT*FROM d_productSELECT pname, price FROM d_product WHERE price>=56 ORDER BY price DESCSELECT COUNT(*) total FROM d_product WHERE price>=800SELECT COUNT(DISTINCT price) price FROM d_productSELECT SUM(price) FROM d_productSELECT MAX(price) FROM d_productSELECT AVG(price) FROM d_productSELECT* FROM d_product GROUP BY priceSELECT COUNT(*),AVG(price),category_id FROM d_product GROUP BY category_idCREATE TABLE Persion(pid VARCHAR(30),pname VARCHAR(30),paddress VARCHAR(30))#添加主键ALTER TABLE Persion ADD PRIMARY KEY(pid)DROP TABLE PersionDESC Persion#删除主键ALTER TABLE persion DROP PRIMARY KEY#自动增长CREATE TABLE Persion(pid INT(8) PRIMARY KEY AUTO_INCREMENT,pname VARCHAR(30),paddress VARCHAR(30))#修改自增长的开始值ALTER TABLE Persion AUTO_INCREMENT=100SELECT * FROM d_productCREATE TABLE category(cid VARCHAR(32) PRIMARY KEY,NAME VARCHAR(50))DROP TABLE categoryDESC categoryCREATE TABLE products(pid VARCHAR(32) PRIMARY KEY,pname VARCHAR(50),price DOUBLE,category_id VARCHAR(32))DROP TABLE productsDESC products#添加外键ALTER TABLE products ADD CONSTRAINT product_fk FOREIGN KEY (category_id) REFERENCES category (cid)INSERT INTO category(cid,NAME) VALUES('c001','电脑')SELECT*FROM category#插入主表数据INSERT INTO products(pid,pname,price) VALUES('p001','iphone X',888)#插入从表数据INSERT INTO products(pid,pname,price,category_id) VALUES('p002','iphone X',666,'c001')#插入如主表不存在的category_id的从表数据(失败)INSERT INTO products(pid,pname,price,category_id) VALUES('p003','iphone X',666,'c002')#如果主表数据 已经关联了从表数据,删除主表数据就失败DELETE FROM category WHERE cid='c001'SELECT * FROM productsCREATE TABLE orders(oid VARCHAR(32) PRIMARY KEY,totalprice DOUBLE);#中间表CREATE TABLE orderitem(pid VARCHAR(32),oid VARCHAR(32))ALTER TABLE orderitem ADD CONSTRAINT orderitem_products_fk FOREIGN KEY(pid) REFERENCES products(pid);ALTER TABLE orderitem ADD CONSTRAINT orderitem_orders_fk FOREIGN KEY(oid) REFERENCES orders(oid);#5、扩展:中间表两个外键,一般会形成联合主键(2个组合在一起唯一)[可选]ALTER TABLE orderitem ADD CONSTRAINT PRIMARY KEY(pid,oid);INSERT INTO products(pid,pname,price) VALUES('p003','IBM台式机',10000);INSERT INTO orders(oid,totalprice) VALUES('x001',10000);INSERT INTO orderitem(pid,oid) VALUES('p003','x001');INSERT INTO orderitem(pid,oid) VALUES('p001','x001');#插入失败INSERT INTO orderitem(pid,oid) VALUES('p004','x001');#删除中间表的数据DELETE FROM orderitem WHERE pid='p001' AND oid='x001'SELECT*FROM categorySELECT * FROM productsSELECT*FROM ordersSELECT*FROM orderitem
