This is one of the trickiest comparisons, as 会 (huì), 能 (néng), and 可以 (kěyǐ) are often translated as "can." Sometimes they are explained as: 会 means "know how to," 能 means "to be able to," and 可以 means "to have permission to." Actually, they overlap somewhat.
Basic Meanings
The words 会 (huì), 能 (néng), and 可以 (kěyǐ) actually overlap a little in meaning. The first step is to understand their basic meanings, though:
会 (huì) can mean "know how to" and can express an action that you had to learn or be trained in to do.
能 (néng) means "to be able to" and expresses having a certain ability or having obtained a certain minimum requirement.
可以 (kěyǐ) means "may" or "to be allowed to" and expresses having another person's permission.
As for overlap, this graphic helps explain nicely:
The regions marked by letters are explained in the sections below:
A: ability in the sense of “know how to” (会 (huì) is more common than 能 (néng))
B: permission/request (use 能 (néng) or 可以 (kěyǐ))
C: possibility (use 能 (néng) or 可以 (kěyǐ))
D: permission not granted (use 不可以 (bù kěyǐ))
E: impossibility (use 不能 (bù néng))
Expressing Ability
Both 会 and 能 can be used to express ability in something.
Structure
会/能 + Verb
Examples
我们 都 会 游泳 。Wǒmen dōu huì yóuyǒng.We all can swim.
他 不 会 修 电脑 。Tā bù huì xiū diànnǎo.He doesn't know how to fix computers.
你 真的 能 吃 三 碗 米饭 吗 ?Nǐ zhēnde néng chī sān wǎn mǐfàn ma?Are you really able to eat three bowls of rice?
B: 不 好意思 ,我 只 能 说 一点 。B: Bù hǎoyìsi, wǒ zhǐ néng shuō yīdiǎn.Sorry, I can only speak a little.
Expressing Permission
可以 is used to ask for or give permission. However, 能 can also be used to replace 可以 interchangeably.
Note: When a question is asked using 能/可以 it can be answered with 不能/不可以, meaning no, and only 可以 meaning yes. Chinese don't really answer with just 能。
Structure
可以 / 能 + Verb
Examples
我 可以 走 了 吗 ?Wǒ kěyǐ zǒu le ma?Am I allowed to leave now?
你 能 不 能 帮 我 一下 吗 ?Nǐ néng bu néng bāng wǒ yīxià ma?Could you help me a bit?
动物 不 能 进 。Dòngwù bù néng jìn.Animals are not allowed to come in.
明天 你 能 早点 来 吗 ?Míngtiān nǐ néng zǎodiǎn lái ma?Is it possible for you to come al little earlier tomorrow?
可 不 可以 换 一 个 ?Kě bù kěyǐ huàn yī gè?Is it possible to change it?
能 不 参加 吗 ?Néngbù cānjiā ma?Is it possible to not attend?
Example dialogue:
A: 能 不 能 取消 今天 的 课 ?A: Néng bù néng qǔxiāo jīntiān de kè?Is it possible to cancel today's lesson?
B: 不 能 。B: Bù néng.Impossible.
Talking about the Future
Only 会 can be used to mean something is going to happen. It expresses that something in the future will happen and is often used to express trends or possibilities.
Structure
会 + Verb / Adj.
Examples
他 不 会 跟 你 结婚 。Tā bù huì gēn nǐ jiéhūn.He's not going to marry you.
你 会 生 我 的 气 吗 ?Nǐ huì shēng wǒ de qì ma?Will you be mad at me?
这样 穿 会 好看 吗 ?Zhèyàng chuān huì hǎokàn ma?Will I look good if I dress like this?
Example dialogue:
A: 今天 会 下雨 吗 ?Jīntiān huì xiàyǔ ma?Is it going to rain today?
B: 我看 不 会 。Wǒ kàn bù huì.I don't think it will.
Using Adverbs to Add Emphasis
By placing 很 (hěn) before 会, it adds emphasis to the level of ability and skill on the action presented. 很会 is commonly used to mean 'to be good at" and expresses being very skillful at something, or doing something very well. It can be translated as "really can," as in "you really can speak Chinese!," in other words, "you are good at speaking Chinese."
When 很 is placed in front of 能, the meaning takes on a amazed/surprised tone on the action. Although more rarely used, it emphasis quantity and amount. 很能 is most commonly used with 吃(chī) to eat, and 睡 (shuì) to sleep. It's like the English equivalent of saying you "can really" do something. For example saying that someone "can really sleep" means that they can sleep a lot.
Note: 很可以 is not a phrase and therefore can not be used with 会 to add emphasis. Other adverbs like 真 (zhēn), 太 (tài), 这么 (zhème) etc. can also be used.
Structure
很 + 会/能 + Verb
Examples
这个 女生 很会 打扮 。Zhège nǚshēng hěnhuì dǎban.This girl knows how to dress up really well.
我 妈妈 很会 做饭 。My mom cooks very well.Wǒ māma hěnhuì zuòfàn.My mother really knows how to cook.
他 很会 说话 。The subject has good speaking skills.Tā hěnhuì shuōhuà.He's a smooth talker.
他 很能 说 。Tā hěnnéng shuō.He's quite a talker.
Note that 很可以说 is wrong and it doesn't mean anything.
Examples used with other adverbs:
他 太能 睡 了 。The subject can sleep a lot, for many hours.Tā tàinéng shuì le.He can really sleep.
没想到 你 这么能 吃苦 。Méixiǎngdào nǐ zhème néng chīkǔ.I didn't expect you to be a person who can handle so many burdens.
你 真能 吃 !The subject can eat a lot.Nǐ zhēnnéng chī!Wow, you really can eat!
中国 人 真会 吃 !The subject has great knowledge about food and its culture, a true connoisseur.Zhōngguó rén zhēnhuì chī!Chinese people really can eat.
Note that 很可以吃 is wrong and it doesn't mean anything.
Similar expression with different meanings
我 的 脚 好 了 ,现在 又 能 跳舞 了 。Wǒ de jiǎo hǎo le, xiànzài yòu néng tiàowǔ le.I am able to dance now since my foot is better. (The condition changed)
我 学 了 两 个 月 ,现在 我 会 跳舞 了 。Wǒ xué le liǎng gè yuè, xiànzài wǒ huì tiàowǔ le.I studied for two months. I know how to dance now. (It's a learned skill)
我 爸妈 同意 了 ,现在 我 可以 跳舞 了 。Wǒ fùmǔ tóngyì le, xiànzài wǒ kěyǐ tiàowǔ le.My parents agreed. I'm allowed to dance now. (The dad gave permission)
Note that none of the three can be followed by the aspectual particle 过.