What is the difference between l() and url()? Why does Drupal provide l() and url(), which seems to have the same purpose?
l() creates a clickable link (an HTML anchor tag), while url() creates just a url. If you scroll down in the l() page you'll see the following source code:

  if ($use_theme) {
    return theme('link', array('text' =&gt; $text, 'path' =&gt; $path, 'options' =&gt; $options));
  }
  // The result of url() is a plain-text URL. Because we are using it here
  // in an HTML argument context, we need to encode it properly.
  return '&lt;a href="' . check_plain(url($path, $options)) . '"' . drupal_attributes($options['attributes']) . '&gt;' . ($options['html'] ? $text : check_plain($text)) . '&lt;/a&gt;';


theme_link() has a similar construction. So l() is using url() to construct the anchor.

So summarizing, the one is for clickable links, the other for plain (unclickable) url's.