sql练习

/*
	总结:
		
	基本查询
	条件查询
	
	排序查询: 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.两个外键

...

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值