题目:超过5名学生的课(难度:简单
sql:
use test;
create table courses(
student varchar(20) not null,
course varchar(50) not null
);
insert into courses values('A','Math');
insert into courses values('B','English');
insert into courses values('C','Math');
insert into courses values('D','Biology');
insert into courses values('E','Math');
insert into courses values('F','Computer');
insert into courses values('G','Math');
insert into courses values('H','Math');
insert into courses values('I','Math');
select course from courses group by course having count(student)>=5;
结果:
题目二:交换性别
代码:
use test;
create table salary(
id INT NOT NULL PRIMARY KEY,
name VARCHAR(20) NOT NULL,
sex VARCHAR(20) NOT NULL,
salary INT NOT NULL
);
insert into salary values(1,'A','f',2500);
insert into salary values(2,'B','m',1500);
insert into salary values(3,'C','f',5500);
insert into salary values(4,'D','m',500);
UPDATE salary SET sex=IF(sex='m','f','m');
表联结
笛卡尔积:由没有联结条件的表关系返回的结果成为笛卡尔积。检索出的行数是第一个表行数与第二个表行数的乘积。
INNER JOIN 、LEFT JOIN、CROSS JOIN、自联结、UNION的区别和联系:
INNER JOIN:内联结,效果同where指定联结条件; select 字段1,字段2,字段3 from 表1 INNER JOIN 表2 ON 联结条件; 多表联结时使用多层IN作为过滤条件;例如:查找订购RGAN01产品的客户列表
SELECT cust_name, cust_contact
FROM Customers WHERE cust_id IN
(SELECT cust_id FROM Orders WHERE order_num IN
(SELECT order_num FROM OrderItems WHERE prod_id = 'RGAN01'));
或者:
SELECT cust_name, cust_contact
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id
AND OrderItems.order_num = Orders.order_num
AND prod_id = 'RGAN01';
Oracle中不支持使用AS别名。
题目二:组合两张表 (难度:简单)
sql:
use test;
create table Person(
PersonId INT NOT NULL PRIMARY KEY,
FirstName VARCHAR(20) NOT NULL,
LastName VARCHAR(20) NOT NULL
);
CREATE TABLE Adress(
AdressId INT NOT NULL PRIMARY KEY,
PersonId INT NOT NULL,
City VARCHAR(50) NOT NULL,
State VARCHAR(50) NOT NULL
);
INSERT INTO Person VALUES(1001,'A','B');
INSERT INTO Person VALUES(1002,'C','D');
INSERT INTO Person VALUES(1003,'E','F');
INSERT INTO Adress VALUES(1,1001,'GZ','tianhe');
INSERT INTO Adress VALUES(2,1002,'SH','haungpu');
INSERT INTO Adress VALUES(3,1003,'BJ','daxing');
INSERT INTO Person VALUES(1004,'G','H');
SELECT FirstName,LastName,City,State FROM Person INNER JOIN Adress ON Person.PersonId=Adress.PersonId;
题目四:删除重复数据并保留重复数据中要求的数据,使用组合查询条件删除即可。
DELETE tb1 FROM TABLE tb1,TABLE tb2 WHERE (tb1.id=tb2.id AND tb1.id>tb2.id);
order by多列排序语句:
select 字段1,字段2,字段3 from table order by 字段2,字段3;
多列排序只在优先排序字段有重复值时才根据次优先排序字段进行排序。
order by按列位置排序:
select 字段1,字段2,字段3 from table order by 2,3;
优点:不用写出字段名,缺点是不知道排序字段是什么。
指定方向排序;DESC降序 ASC升序
select 字段1,字段2,字段3 from table order by 字段2 DESC,字段3 ASC;
按字段2降序排序,再按字段3升序排序。ASC的排序的默认的,因此无需特别指明。
数据的过滤
数据过滤:
where语句过滤,不等于使用:!= or <> 区间 between 检查是否为空:where is null
IN操作符完成的操作和OR类似
NOT操作符 where子句中用来否定所接条件的操作符号 WHERE NOT
LIKE操作符,模糊匹配,通配符只能用于文本字段搜索。
**%**表示任意字段出现任意次数,一般用于检索以什么开头的文本或包含什么信息的文本字段。不会匹配字段内容为NULL的行。
'_'与%类似,但_只匹配一个字符。
'[]'匹配括号内的任意一字符,也是只匹配单个字符
更新数据(UPDATE)
语句包含:需要更新的表+列名和新值+过滤条件
更新多个列时,使用一个SET,SET 列名1=值,列名2=值 用逗号隔开即可
NULL与’‘不同,NULL表示没有值,’'表示有一个值。
组合查询
使用UNION进行组合查询,在各个SELECT语句之间用UNION进行联结即可。