182. 查找重复的电子邮箱
select `Email` from
(
select `Email`, count(`Email`) as a
from `Person`
group by `Email`
) as temp
where a > 1;
一些不熟悉的语句
like 模糊查询
select * from employees where last_name like '%a%';
group by(常常和聚合函数一起使用) 聚合函数:count() , sum() , avg() , max() , min() 根据by对数据按照哪个字段进行分组,或者是哪几个字段进行分组。
select 字段 from 表名 where 条件 group by 字段;
# 单字段
select grade from student group by grade;
# 多字段
select name , sum(salary) from student group by name , grade;
name和grade看成一个整体,name和grade相同的才可以分成一组,一个不一样就不能分成一组。
having 对group by分组和聚合之后的数据进行过滤 (与where正好相反)
select 字段 from 表名 group by 字段 having 过滤条件;
-- 查找人数大于 5 的部门
select dept_id, count(*)
from employee
group by dept_id
having count(*) > 5;
dept_id|count(*)|
-------|--------|
4| 9|
5| 8|
union 联合查询
select * from employees where eamil like '%a%' or department_id>90;
相当于
select * from employees where eamil like '%a%'
union
select * from employees where department_id>90;
CONCAT() 函数
CONCAT(str1,str2,…)
将多个字符串连接成一个字符串。
GROUP_CONCAT()函数
返回一个字符串结果,该结果由分组中的值连接组合而成。
175. 组合两个表
select FirstName, LastName, City, State
from Person left join Address on Person.PersonId = Address.PersonId;
left join
也叫left outer join,外连接
- 1、 on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
- 2、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
P1255 数楼梯
a = int(input())
def gogogo(index):
if index > 2:
print(index)
return gogogo(index-1) + gogogo(index-2)
elif index == 2:
return 2
elif index == 1 or index == 0:
return 1
print(gogogo(a))
思路是对的,但是层数一多就g了
于是想用循环取代递归
n = int(input())
l = [0 for i in range(0,n+2)]
l[0], l[1] = 1,1
if n == 0:
print(0)
else:
for i in range(2,n+1):
l[i] = l[i-1] + l[i-2]
print(l[n])
这样是可以通过的
但是上网又搜了一个更恐怖的
a, b = 0, 1
for i in range(int(input())):
a, b = b, a + b
print(b if a else 0)
P1143 进制转换
def trans_map(cint):
if cint < 0:
print("不合法")
return
elif cint < 10:
return cint
elif cint >= 10:
return chr(cint - 10 + 65)
def anyToTen(m, origin):
# 任意进制的数转换为10机制
# 先将m转换为10进制
# 公式 num = an * m**(n-1) + an-1 * m**(n-2).....+ a0 * m**0
# 直接利用int的自带功能
return int(str(origin), base=m)
def tenToAny(n, origin):
# 10进制转换为任意进制的数
list = []
while True:
# 取商
s = origin // n
# 取余数
tmp = origin % n
list.append(trans_map(tmp))
if s == 0:
break
origin = s
list.reverse()
list = [str(each) for each in list]
print(''.join(list))
# 将一个m进制的数转换为一个n进制的数
def transfer(m, n, origin):
num = anyToTen(m, origin)
target = tenToAny(n, num)
if __name__ == '__main__':
a = int(input())
b = input()
c = int(input())
transfer(a,c,b)