postgres前言(常用语句熟悉 系列一)
在这里,我直接把写的代码贴出来,sql语句基本差不多,稍微熟悉即可,直接看代码:
----简单查询
create table fruits(
f_id char(10) NOT NULL,
s_id INT NOT NULL,
f_name char(255) NOT NULL,
f_price decimal(8,2) NOT NULL,
PRIMARY KEY(f_id)
);----创建表格
------填充数据‘
insert into fruits
values('a1',101,'apple',5.2),
('b1',102,'blackberry',10.2),
('bs1',103,'orange',11.2),
('bs2',105,'melon',8.2),
('t1',102,'banana',10.3),
('t2',102,'grape',5.3),
('o1',103,'coconut',9.2),
('c0',101,'cherry',3.2),
('a2',103,'apricot',2.2),
('l2',104,'lemon',6.4),
('b2',104,'berry',7.6);
---查询所有数据
select * from fruits;
---查询单价大于5的水果
select * from fruits where f_price>5;
---查询单价位于(2,10)
select * from fruits where f_price between 2 and 10;
---order by排序(降序)
select * from fruits order by f_price desc;
----group by分组
select s_id,count(*) as total from fruits group by s_id;
---having 过滤分组------HAVING子句与GROUP BY子句组合使用,用于选择函数结果满足某些条件的特定行
select s_id ,COUNT(f_name) from fruits group by S_id having count(f_name)>1;
-----having关键字与where关键字都是用来过滤数据,那么两者有什么区别呢?
----其中重要的一点就是having是用在数据分组之后进行过滤选择分组,而where在分组前进行
---用来选择数据,另外where 排除记录不在包括在分组中。
---limit限制查询结果的数量,select所有行,可能是表中的所有行,如果仅仅需要发返回第行或者
-----前几行,使用limit关键字,
select * from fruits limit 4;----返回前四行
select * from fruits limit 3 offset 4;---offset表示从哪一行之后开始显示,这里表示从第五行开始
---显示,显示3行
----count函数(返回某列的总数)
select count(s_id) as total from fruits;
----sum求和函数,制定某列进行求和
select sum(f_price) as totalPrice from fruits;
----avg平均值函数,求某一列的平均值
select avg(f_price) as totalPrice from fruits;
----连接查询
----创建suppliers表格
create table supplies(
s_id INT PRIMARY KEY,
s_name varchar(50) NOT NULL,
s_city varchar(50) NOT NULL
);
--插入数据
insert into supplies
values(101,'京东','江苏'),
(102,'天猫','北京'),
(103,'苏宁','北京'),
(104,'饿了么','郑州'),
(105,'美团','杭州'),
(106,'支付宝','上海');
----内链接查询(inner join )比较表之间的数据
select supplies.s_id,s_name ,f_name,f_price from fruits,supplies where fruits.s_id=supplies.s_id;
----supplies和ruits通过s_id联系到一块去
----inner join ....on
select supplies.s_id,s_name ,f_name,f_price from fruits inner join supplies on fruits.s_id=supplies.s_id;
---这里的连接查询,两个表的关系通过inner join 指定,在使用这种语法时候连接条件
---要使用on子句给出不是where,on和where后面的限定条件一样
----创建订单表
create table orders(
o_num INT NULL,
o_date DATE NOT NULL,
c_id varchar(50) NOT NULL
);
----插入数据
insert into orders
values(30001,'2018-9-27 12:12:45','10001'),
(30002,'2018-9-28 08:12:45','10002'),
(30003,'2018-9-29 12:20:45','10003'),
(null,'2018-9-30 11:12:23','10004'),
(30004,'2018-9-30 10:11:45','10005'),
(30005,'2018-10-01 14:12:45','10006');
----创建客户表
create table customers(
c_id char(10) PRIMARY KEY,
c_name varchar(255) NOT NULL,
c_email varchar(50) NULL
);
----插入数据
insert into customers
values('10001','狗子','gouzi@163.com'),
('10002','蘑菇','mogu@163.com'),
('10003','领导','lingdao@163.com'),
('10004','stars','stars@163.com');
----外连接查询(左连接和右连接)
----连接查询将查询多个表中相关联的行,内链接时,返回查询的结果集合中的仅仅是满足符合查询条件和连接条件的行
----但有时需要包括没有关联的行中数据,即返回的查询结果结合中不仅仅要包括满足条件的行而且还要包括左表(左外连接和左连接)
----右表(右外连接和右连接)或两个边接表(全外连接)中的所行数据
----left join:返回左表中的所有记录和右表中连接字段相等的记录
----right join:返回右表中的所有记录和左表中的连接字段相等的记录
----查询所有的客户包括没有订单的(左外连接)
select customers.c_id,orders.o_num from customers left outer join orders on orders.c_id=customers.c_id;
----右连接查询查询所有订单包括没有客户的
select customers.c_id,orders.o_num from customers right outer join orders on orders.c_id=customers.c_id;
----查询ID为10001的客户订单信息
select customers.c_id,orders.o_num from customers inner join orders on customers.c_id=orders.c_id and customers.c_id='10001';