One place for hosting & domains

      Select

      How To SELECT Rows FROM Tables in SQL


      Introduction

      One of the most fundamental parts of working with databases is the practice of retrieving information about the data held within them. In relational database management systems, any operation used to retrieve information from a table is referred to as a query.

      In this guide, we will discuss the syntax of queries in Structured Query Language (SQL) as well as some of their more commonly used functions and operators.

      Prerequisites

      In order to follow this guide, you will need a computer running some type of relational database management system (RDBMS) that uses SQL. The instructions and examples in this guide were validated using the following environment:

      Note: Please note that many RDBMSs use their own unique implementations of SQL. Although the commands outlined in this tutorial will work on most RDBMSs, the exact syntax or output may differ if you test them on a system other than MySQL.

      • You’ll also need a database with some tables loaded with sample data which you can use to practice writing queries. We encourage you to go through the following Connecting to MySQL and Setting up a Sample Database section for details on how to connect to a MySQL server and create the testing database used in examples throughout this guide.

      Connecting to MySQL and Setting up a Sample Database

      If your SQL database system runs on a remote server, SSH into your server from your local machine:

      Then open up the database server prompt. If you’re using MySQL, do so by running the following command, making sure to replace sammy with the name of your MySQL user account:

      From the prompt, create a database named queries_db:

      • CREATE DATABASE queries_db;

      If the database was created successfully, you’ll receive output like this:

      Output

      Query OK, 1 row affected (0.01 sec)

      To select the queries_db database, run the following USE statement:

      Output

      Database changed

      After selecting queries_db, create a few tables within it.

      To follow along with the examples used in this guide, imagine that you run a public parks cleanup initiative in New York City. The program is made up of volunteers who commit to cleaning up a city park near their homes by regularly picking up litter. Upon joining the initiative, these volunteers each set a goal of how many trash bags of litter they’d like to pick up each week. You decide to store information about the volunteers’ goals in an SQL database with a table that has five columns:

      • vol_id: each volunteer’s identification number, expressed with the int data type. This column will serve as the table’s primary key, meaning that each value will function as a unique identifier for its respective row. Because every value in a primary key must be unique, this column will also have a UNIQUE constraint applied to it
      • name: each volunteer’s name, expressed using the varchar data type with a maximum of 20 characters
      • park: the name of the park where each volunteer will pick up litter, expressed using the varchar data type with a maximum of 20 characters. Note that multiple volunteers can clean up litter in the same park
      • weekly_goal: each volunteer’s goal for how many bags of litter they’d like to pick up in a week, expressed with the int type
      • max_bags: each volunteer’s personal record for the most bags of litter they picked up in a single week, expressed as an int

      Run the following CREATE TABLE statement to create a table named volunteers that has these five columns:

      • CREATE TABLE volunteers (
      • vol_id int UNIQUE,
      • name varchar(20),
      • park varchar(30),
      • weekly_goal int,
      • max_bags int,
      • PRIMARY KEY (vol_id)
      • );

      Then load the volunteers table with some sample data. Run the following INSERT INTO operation to add seven rows of data representing seven of the program’s volunteers:

      • INSERT INTO volunteers
      • VALUES
      • (1, 'Gladys', 'Prospect Park', 3, 5),
      • (2, 'Catherine', 'Central Park', 2, 2),
      • (3, 'Georgeanna', 'Central Park', 2, 1),
      • (4, 'Wanda', 'Van Cortland Park', 1, 1),
      • (5, 'Ann', 'Prospect Park', 2, 7),
      • (6, 'Juanita', 'Riverside Park', 1, 4),
      • (7, 'Georgia', 'Prospect Park', 1, 3);

      With that, you’re ready to follow the rest of the guide and begin learning how to create queries in SQL.

      Required Query Components: the SELECT and FROM Clauses

      In SQL, a statement is any operation sent to the database system that will perform some sort of task, like creating a table, inserting or deleting data, or changing the structure of a column or table. A query is an SQL statement that retrieves information about data held in a database.

      On its own, a query will not change any existing data held in a table. It will only return the information about the data which the author of the query explicitly requests. The information returned by a given query is referred to as its result set. Result sets typically consist of one or more columns from a specified table, and each column returned in a result set can hold one or more rows of information.

      Here’s the general syntax of an SQL query:

      • SELECT columns_to_return
      • FROM table_to_query;

      SQL statements are made up of various clauses, which consist of certain keywords and the information that these keywords require. At a minimum, SQL queries only require you to include two clauses: the SELECT and FROM clauses.

      Note: In this example syntax, both clauses are written on their own line. However, any SQL statement can alternatively be written on a single line, like this:

      • SELECT columns_to_return FROM table_to_query;

      This guide will follow the common SQL style convention of separating statements onto multiple lines so each line contains only one clause. This aimed to make each example more readable and understandable, but be aware that as long as you don’t include any syntax errors you can write any query on a single line or on as many lines as you’d like.

      Every SQL query begins with a SELECT clause, leading some to refer to queries generally as SELECT statements. After the SELECT keyword comes a list of whatever columns you want returned in the result set. These columns are drawn from the table specified in the FROM clause.

      In SQL queries, the order of execution begins with the FROM clause. This can be confusing since the SELECT clause is written before the FROM clause, but keep in mind that the RDBMS must first know the full working data set to be queried before it starts retrieving information from it. It can be helpful to think of queries as SELECT-ing the specified columns FROM the specified table. Lastly, it’s important to note that every SQL statement must end with a semicolon (;).

      As an example, run the following query. This will retrieve the name column from the volunteers table:

      • SELECT name
      • FROM volunteers;

      Here’s this query’s result set:

      Output

      +------------+ | name | +------------+ | Gladys | | Catherine | | Georgeanna | | Wanda | | Ann | | Juanita | | Georgia | +------------+ 7 rows in set (0.00 sec)

      Even though this operation looked at the entire volunteers table, it only returns the specified column, name.

      You can retrieve information from multiple columns by separating each one’s name with a comma, as in the following query. This will return the vol_id, name, and park columns from the volunteers table:

      • SELECT park, name, vol_id
      • FROM volunteers;

      Output

      +-------------------+------------+--------+ | park | name | vol_id | +-------------------+------------+--------+ | Prospect Park | Gladys | 1 | | Central Park | Catherine | 2 | | Central Park | Georgeanna | 3 | | Van Cortland Park | Wanda | 4 | | Prospect Park | Ann | 5 | | Riverside Park | Juanita | 6 | | Prospect Park | Georgia | 7 | +-------------------+------------+--------+ 7 rows in set (0.00 sec)

      Notice that this result set returns the park column first, followed by the name column and then vol_id. SQL databases will generally return columns in whatever order they’re listed in the SELECT clause.

      There may be times when you want to retrieve every column from a table. Rather than writing out the name of every column in your query, you can instead enter an asterisk (*). In SQL, this is shorthand for “every column.”

      The following query will return every column from the volunteers table:

      • SELECT *
      • FROM volunteers;

      Output

      +--------+------------+-------------------+-------------+----------+ | vol_id | name | park | weekly_goal | max_bags | +--------+------------+-------------------+-------------+----------+ | 1 | Gladys | Prospect Park | 3 | 5 | | 2 | Catherine | Central Park | 2 | 2 | | 3 | Georgeanna | Central Park | 2 | 1 | | 4 | Wanda | Van Cortland Park | 1 | 1 | | 5 | Ann | Prospect Park | 2 | 7 | | 6 | Juanita | Riverside Park | 1 | 4 | | 7 | Georgia | Prospect Park | 1 | 3 | +--------+------------+-------------------+-------------+----------+ 7 rows in set (0.00 sec)

      Notice how this result set’s columns are listed in the same order in which they were defined in the CREATE TABLE statement from the previous Connecting to MySQL and Setting up a Sample Database section. This is how most relational database systems will order columns in the result set when running a query that uses an asterisk in place of individual column names.

      Be aware that you can retrieve information from multiple tables in the same query with the JOIN keyword. We encourage you to follow our guide on How To Use Joins in SQL for details on how to do this.

      Removing Duplicate Values with DISTINCT

      By default, RDBMSs will return every value from a column returned by a query, including duplicate values.

      As an example, run the following query. This will return the values from the volunteers table’s park column:

      • SELECT park
      • FROM volunteers;

      Output

      +-------------------+ | park | +-------------------+ | Prospect Park | | Central Park | | Central Park | | Van Cortland Park | | Prospect Park | | Riverside Park | | Prospect Park | +-------------------+ 7 rows in set (0.00 sec)

      Notice how this result set includes two duplicated values: Prospect Park and Central Park. This makes sense, since multiple volunteers can clean up litter in the same park. There may be times, though, when you only want to know what unique values are held in a column. You can issue queries that remove duplicate values by following SELECT with the DISTINCT keyword.

      The following query will return every unique value in the parks column, removing any duplicates. It’s identical to the previous query except that it includes the DISTINCT keyword:

      • SELECT DISTINCT park
      • FROM volunteers;

      Output

      +-------------------+ | park | +-------------------+ | Prospect Park | | Central Park | | Van Cortland Park | | Riverside Park | +-------------------+ 4 rows in set (0.00 sec)

      This query’s result set has three fewer rows than that of the previous one, since it removed one of the Central Park values and two of the Prospect Park values.

      Note that SQL treats every row of a result set as an individual record, and DISTINCT will only eliminate duplicates if multiple rows share identical values in each column

      To illustrate this, issue the following query that includes the DISTINCT keyword but returns both the name and park columns:

      • SELECT DISTINCT name, park
      • FROM volunteers;

      Output

      +------------+-------------------+ | name | park | +------------+-------------------+ | Gladys | Prospect Park | | Catherine | Central Park | | Georgeanna | Central Park | | Wanda | Van Cortland Park | | Ann | Prospect Park | | Juanita | Riverside Park | | Georgia | Prospect Park | +------------+-------------------+ 7 rows in set (0.00 sec)

      The duplicate values in the park column — three occurrences of Prospect Park and two of Central Park — appear in this result set, even though the query included the DISTINCT keyword. Although individual columns in a result set may contain duplicate values, an entire row must be an exact duplicate of another for it to be removed by DISTINCT. In this case, every value in the name column is unique so DISTINCT doesn’t remove any rows when that column is specified in the SELECT clause.

      Filtering Data with WHERE clauses

      There may be times when you want to retrieve more granular information from tables in your database. You can filter out certain rows by including a WHERE clause in your query after the FROM clause, as in:

      • SELECT columns_to_return
      • FROM table_to_query
      • WHERE search_condition;

      Following the WHERE keyword in this example syntax is a search condition, which is what actually determines which rows get filtered out from the result set. A search condition is a set of one or more predicates, or expressions that can evaluate one or more value expressions. In SQL, a value expression — also sometimes referred to as a scalar expression — is any expression that will return a single value. A value expression can be a literal value (like a string or numeric value), a mathematical expression, or a column name.

      Predicates in a WHERE clause search condition can take many forms, but they typically follow this syntax:

      . . .
      WHERE value expression OPERATOR value_expression
      . . .
      

      After the WHERE keyword, you provide a value expression followed by one of several special SQL operators used to evaluate the column’s values against the value expression (or value expressions) that comes after the operator. There are several such operators available in SQL and this guide will briefly highlight a few of them later in this section, but for illustration purposes it will focus only on one of the most commonly used operators: the equals sign (=). This operator tests whether two value expressions are equivalent.

      Predicates always return a result of either “true,” “false,” or “unknown.” When running SQL queries that contain a WHERE clause, the DBMS will apply the search condition sequentially to every row in the table defined in the FROM clause. It will only return the rows for which every predicate in the search condition evaluates to “true.”

      To illustrate this idea, run the following SELECT statement. This query returns values from the volunteers table’s name column. Instead of evaluating values from one of the table’s columns, however, this WHERE clause tests whether two value expressions — (2 + 2) and 4 — are equivalent:

      • SELECT name
      • FROM volunteers
      • WHERE (2 + 2) = 4;

      Because (2 + 2) is always equal to 4, this search condition evaluates to “true” for every row in the table. Consequently, every row’s name value gets returned in the result set:

      Output

      +------------+ | name | +------------+ | Gladys | | Catherine | | Georgeanna | | Wanda | | Ann | | Juanita | | Georgia | +------------+ 7 rows in set (0.00 sec)

      Because this search condition always returns a result of “true,” it isn’t very useful. You may as well not include a WHERE clause at all, since SELECT name FROM volunteers; will produce the same result set.

      Rather than comparing two literal values like this, you’ll typically use a column name as one of the value expressions in a WHERE clause’s search condition. By doing so, you’re telling the database management system to use each row’s value from that column as a value expression for that row’s iteration of the search condition.

      The following query’s WHERE clause applies a more exclusive search condition to each row. It will return the name and max_bags values from any row whose max_bags value is equal to 4:

      • SELECT name, max_bags
      • FROM volunteers
      • WHERE max_bags = 4;

      Only one volunteer’s max_bags value is exactly equal to 4, so the query only returns that volunteer’s record:

      Output

      +---------+----------+ | name | max_bags | +---------+----------+ | Juanita | 4 | +---------+----------+ 1 row in set (0.00 sec)

      You can also evaluate character string values in search condition predicates. The following query returns the vol_id and name values of every row whose name value is equal to 'Wanda':

      • SELECT vol_id, name
      • FROM volunteers
      • WHERE name="Wanda";

      Because there’s only one volunteer named Wanda, the query only returns the information from that row:

      Output

      +--------+-------+ | vol_id | name | +--------+-------+ | 4 | Wanda | +--------+-------+ 1 row in set (0.00 sec)

      To reiterate, this section’s examples all use the same search condition operator — the equals sign — to filter data. However, there are a number of other types of operators that allow you to write a variety of predicates, offering a high level of control over what information your queries return.

      The SQL standard defines 18 different types of predicates, though not all of them are supported on every RDBMS. Here are five of the most commonly used search condition predicate types and the operators they use:

      Comparison: Comparison predicates compare one value expression with another; in queries, it’s almost always the case that at least one of these value expressions is the name of a column. The six comparison operators are:

      • =: tests whether the two values are equivalent
      • <>: tests whether two values are not equivalent
      • <: tests whether the first value is less than the second
      • >: tests whether the first value is greater than the second
      • <=: tests whether the first value is less than or equal to the second
      • >=: tests whether the first value is greater than or equal to the second

      Null: Predicates that use the IS NULL operator test whether values in a given column are Null
      Range: Range predicates use the BETWEEN operator to test whether one value expression falls between two others
      Membership: This type of predicate uses the IN operator to test whether a value is a member of a given set
      Pattern Match: Pattern matching predicates use the LIKE operator to test whether a value matches a string pattern containing wildcard values

      It’s beyond the scope of this tutorial to go into each of these predicate types in greater detail. If you’d like to learn more about them, though, we encourage you to check out the following guides:

      To learn more about WHERE clauses generally, please see our guide on How To Use WHERE Clauses in SQL.

      Sorting Query Results with ORDER BY

      Sometimes queries will return information in ways that may not be intuitive, or may not suit your particular needs. You can sort query results by appending an ORDER BY clause to the end of your query statement.

      Here’s the general syntax of a query with an ORDER BY clause:

      • SELECT columns_to_return
      • FROM table_to_query
      • ORDER BY column_name;

      To illustrate how this works, say you wanted to know which of your volunteers has the highest max_bags value. You could run the following query which returns the name and max_bags values from the volunteers table:

      • SELECT name, max_bags
      • FROM volunteers;

      However, this query sorts the result set in the order in which each row was added:

      Output

      +------------+----------+ | name | max_bags | +------------+----------+ | Gladys | 5 | | Catherine | 2 | | Georgeanna | 1 | | Wanda | 1 | | Ann | 7 | | Juanita | 4 | | Georgia | 3 | +------------+----------+ 7 rows in set (0.00 sec)

      For a relatively small data set like this, the order of a result set isn’t that important and you could just scan this result set’s max_bags values to find the highest one. However, this can quickly become tedious when working with larger amounts of data.

      Instead, you could run the same query but add an ORDER BY clause that sorts the result set based each row’s max_bags value:

      • SELECT name, max_bags
      • FROM volunteers
      • ORDER BY max_bags;

      Output

      +------------+----------+ | name | max_bags | +------------+----------+ | Georgeanna | 1 | | Wanda | 1 | | Catherine | 2 | | Georgia | 3 | | Juanita | 4 | | Gladys | 5 | | Ann | 7 | +------------+----------+ 7 rows in set (0.00 sec)

      As this output indicates, the default behavior of SQL queries that include an ORDER BY clause is to sort the specified column’s values in ascending (increasing) order. You can change this behavior and sort them in descending order by appending the DESC keyword to the ORDER BY clause:

      • SELECT name, max_bags
      • FROM volunteers
      • ORDER BY max_bags DESC;

      Output

      +------------+----------+ | name | max_bags | +------------+----------+ | Ann | 7 | | Gladys | 5 | | Juanita | 4 | | Georgia | 3 | | Catherine | 2 | | Georgeanna | 1 | | Wanda | 1 | +------------+----------+ 7 rows in set (0.00 sec)

      Conclusion

      By reading this guide, you learned how to write basic queries, as well as filter and sort query result sets. While the commands shown here should work on most relational databases, be aware that every SQL database uses its own unique implementation of the language. You should consult your DBMS’s official documentation for a more complete description of each command and their full sets of options.

      If you’d like to learn more about working with SQL, we encourage you to check out the other tutorials in this series on How To Use SQL.



      Source link

      How To Select HTML Elements to Style with CSS


      The author selected the Diversity in Tech Fund to receive a donation as part of the Write for DOnations program.

      Introduction

      The core functionality of CSS is performed by two features: cascade and specificity. Cascade deals with how CSS properties are read and applied to elements. Specificity directs a browser to find the correct element and apply the styles. The starting point of specificity is a selector, which tells the browser what element to find. When it comes to styling, the larger a web page or website, the greater the need for more specific, or higher specificity, selectors.

      Selecting the right element and providing the right visual styles is the basis of writing CSS code. Whenever you need to adjust how an element on a webpage looks, using selectors is key.

      This tutorial will build your skill set and help you develop visually rich websites by showing you how to select the right element in a given scenario. You will begin by using the type selector to select HTML elements to style. Then, you will combine selectors to identify and apply styles more precisely. Lastly, you will group several selectors to apply the same styles to different elements.

      Prerequisites

      Setting Up the HTML

      In this first step, you will set up the HTML that you will style throughout the rest of the tutorial. The purpose of the HTML in this tutorial is to provide various elements and situations to style.

      Open up the index.html file in your editor and add the following boilerplate HTML to give the file necessary baseline code:

      index.html

      <!doctype html>
      <html>
        <head>
          <link href="https://www.digitalocean.com/community/tutorials/styles.css" rel="stylesheet" />
        </head>
        <body>
        </body>
      </html>
      

      The <link /> element already loads in the styles.css file, so be sure to have that file ready as well.

      Now, you need some content. Start by adding in <header> and <article> elements inside the <body> element. In the following code block, highlighted sections will help you identify what is new or has changed:

      index.html

      <!doctype html>
      <html>
        ...
        <body>
          <header></header>
          <article></article>
        </body>
      </html>
      

      The relationship between the <body> and the <header> elements is referred to as parent and child, since the <header> element is nested inside the <body> tags. This also means the <header> and <article> tag have a sibling relationship, since they are at the same nesting level within the parent <body> tags.

      Next, you will add a child element within the <header> to give the page a title:

      index.html

      ...
      <header>
        <h1>About Coral Reefs</h1>
      </header>
      ...
      

      Inside <article>, add four children: one <header> element and three <section> elements. The <article> element provides what is called a landmark, a designation for a browser to aid those using assistive technologies. There should only be one <header> within a landmark. In this case the <header> will contain the title for this article of the page. The <section> elements will contain different information blocks:

      index.html

      ...
      <article>
        <header></header>
        <section></section>
        <section></section>
        <section></section>
      </article>
      ...
      

      Now, provide a title in the <header> for the <article>. Use an <h2> here since it logically works as a second-level heading beneath the <body>’s <header> with a top-level heading. Add in <strong> tags around the word “Biodiversity” to strongly emphasize the text. When you load index.html in your browser, this text won’t look any different due to the browser defaults. You will style this later to distinguish between the heading and the <strong> text.

      index.html

      ...
      <article>
        <header>
          <h2>Coral Reef <strong>Biodiversity</strong></h2>
        </header>
        ...
      </article>
      ...
      

      Next, add in the first section content. This will be two paragraphs, contained in <p> tags giving some details about coral reefs. In the first paragraph, add an <em> tag and a <strong> tag around some phrases to emphasize that content:

      index.html

      ...
      <article>
        <header>
          ...
        </header>
        <section>
          <p>Coral reefs are teeming with life. They are known as the <em>rainforests of the sea</em> with how many various speieces live within their waters. The defining feature of these ecosystems are the plant-like coral, which are really colonies of tiny invertabrates called <strong>polyps</strong>.</p>
          <p>Sadly, many reefs around the world are in danger due to rising ocean temperatures, pollution, and overfishing.</p>
        </section>
        ...
      </article>
      ...
      

      In the second section, add an <h3> tag for a heading for this section of the article. Like the <h2> before, this is set as an <h3> since it is a subset of content. In the <h3>, add a <strong> tag around a phrase in the heading like in the <h2>. Then write out an unordered list using the <ul> tag to define the list and <li> to define each item in the list. In one of the list items, wrap the content in a <strong> tag:

      index.html

      ...
      <article>
        <header>
          ...
        </header>
        <section>
          ...
        </section>
        <section>
          <h3><strong>Animal Life</strong> in a Coral Reef</h3>
          <ul>
            <li>Angelfish</li>
            <li>Clownfish</li>
            <li>Octopus</li>
            <li><strong>Sharks</strong></li>
            <li>Barracuda</li>
          </ul>
        </section>
        ...
      </article>
      ...
      

      With the last section, set up content similar to the second section with an <h3> section title and a <strong> element around a word in the title. Instead of an unordered list, make an ordered list with an <ol> tag to define the list, but still define each item with the <li> tag. Once again, in one of the list items, add a <strong> element around the content:

      index.html

      ...
      <article>
        <header>
          ...
        </header>
        <section>
          ...
        </section>
        <section>
          ...
        </section>
        <section>
          <h3>Sammy's <strong>Favorite</strong> Reef Food</h3>
          <ol>
            <li>Sea Grass</li>
            <li><strong>Kelp</strong></li>
            <li>Sea Grapes</li>
            <li>Sea Lettuce</li>
          </ol>
        </section>
      </article>
      ...
      

      Save your file.

      That covers the HTML for this tutorial and provides elements for which you can begin to write styles. Now that you have finished with index.html, leave it open in your editor for reference as needed. Then open index.html in your browser to see the default styles of your browser, which will appear similar to the following image:

      The content of the website in the browser default rendering with black serif font on a white background.

      Next, you’ll apply styles to the HTML page you created.

      Selecting Elements With the Type Selector

      In this section, you will work with the type selector, more commonly referred to as the element selector. The type selector finds elements on the page by tag name, making it broadest in terms of specificity. You will write several selectors to learn the breadth of this selector throughout the index.html page.

      First, take a look at index.html in the browser. This what the page looks like using browser defaults. These are predefined styles provided by the browser to give visual information to the content of the page. This is a helpful starting place for the styles; in the examples ahead you will only modify a couple of properties to customize the look of the page.

      Next, open the styles.css file in your editor. The default browser font is typically a serif font, a typography term referring to the decorative ends on the characters, like those found in Times New Roman. To change the font across the whole page, you can make a change in one place.

      Create a type selector for the HTML <body> element by typing out the word in the tag, body, followed by an opening and closing curly brace. Inside the curly braces, add a new line and then add the CSS property font-family with a value of sans-serif. This addition of the font-family will change the font for the whole document to a sans serif font. Unlike a serif font, a sans serif font lacks decorative ends on the characters, such as in Helvetica or Arial:

      styles.css

      body {
        font-family: sans-serif;
      }
      

      Once you have made these changes, save styles.css and refresh your browser to verify the text has all changed to the browser’s default sans-serif font. The reason the font changed throughout the whole page is due to a feature of CSS called inheritance. Inheritance is when a child element inherits property values from the parent element, unless otherwise specified. This feature does not affect all CSS properties or elements, but it is most notable among properties that affect text.

      Next, adjust the font-weight of the <h2> and <h3> elements on the page. By default, the browser applies styles to make these elements a bold font. Create an h2 and an h3 type selector and in each add the font-weight property with a value of normal. This will change the default from bold to a normal weight:

      styles.css

      body {
        font-family: sans-serif;
      }
      
      h2 {
        font-weight: normal;
      }
      
      h3 {
        font-weight: normal;
      }
      

      Save and return to your browser and refresh the index.html page. The content of the <h2> and <h3> elements have changed from a bold to a normal font weight, except for the text in the <strong> elements. This is a case where an explicit value is set for the font-weight in the browser defaults, so the <strong> element does not inherit the change to its parent element.

      The primary purpose with any design is to aid in communication. In this case, the design is working to emphasize a particular part of the content through contrasts in font weight. Next, you will apply color to help encourage this contrast. Start with an em type selector and apply a background-color of yellow to give it a highlighter effect. Next, to help draw further attention to the <strong> content, create a strong type selector with a color property set to red:

      styles.css

      ...
      h3 {
        font-weight: normal;
      }
      
      em {
        background-color: yellow;
      }
      
      strong {
        color: red;
      }
      

      Save styles.css and refresh index.html in your browser to find the changes you have made to the design of the website. As shown in the following image, the whole of the text on the page has changed to a sans-serif font, the <h2> and <h3> content headings are no longer bold, all the <strong> element content is now red, and the <em> element content has a yellow highlighter background:

      Content of website in a black sans-serif font, with bold content in red and italic content with a yellow background.

      In this step you worked with multiple type selectors to create specific styles for each selector. The type selector tells the browser to find an element by the element’s name and is the broadest in specificity. Next, you will learn about simplifying your CSS through the use of selector groups.

      Selecting Elements With the Combinator Selector

      In this section, you will work with the combinator selector to make more specific element selection. This selector uses the nested relationship of HTML elements to select the appropriate element. You will use this selector to make the same element type look different when contained in other element types.

      Open up index.html in the browser. As you look over the styles, there are pops of red every so often due to the strong selector that is applying color: red; to all instances of <strong> on the page. In this step you will work through to change the color value on <strong> elements when they meet certain criteria, based on their ancestry, a series of parent and child element relationships.

      A combinator selector is defined by a space character between selectors, with the HTML ancestry reading left to right. The right-most selector is the intended target. This can be as complex or as simple as necessary to scope, or provide sufficient specificity, to the intended element. To understand how combinator selectors work, open styles.css and add at the bottom of the file a p type selector followed by a space, then a strong type selector followed by an open and close curly bracket:

      styles.css

      ...
      p strong {
      }
      

      This is a combinator selector that is targeting <strong> elements that are ancestrally descendent of a <p> element. This means the <p> element does not have to be the direct parent of the <strong> element in order for this combinator selector to be true. Now change the color of <strong> elements that meet this criteria by placing a color property within the combinator selector:

      styles.css

      ...
      p strong {
        color: coral;
      }
      

      Save the changes and return to the browser to refresh index.html.

      Content of website in a black sans-serif font, with bold content in red and italic content with a yellow background, except the bold content in a paragraph, which is light orange.

      Next, add more variety of color to the <strong> elements throughout the file. Start with the <strong> element that is a descendant of an <h3> and turn those blue:

      styles.css

      ...
      p strong {
        color: coral;
      }
      
      h3 strong {
        color: blue;
      }
      

      Finally, to add some more color, change the color for <strong> elements in an unordered list to dodgerblue, which is a rich light blue, and the color for <strong> elements in an ordered list to green. Here is where it is helpful to understand ancestry requirements of a combinator selector. You may think you would need to write out ul li strong and ol li strong to target these elements correctly. But this can be simplified to ul strong and ol strong since the ul and ol are specific enough:

      styles.css

      ...
      h3 strong {
        color: blue;
      }
      
      ul strong {
        color: dodgerblue;
      }
      
      ol strong {
        color: green;
      }
      

      Return to your browser and hit refresh. The <strong> element in the unordered list is now a rich light blue color and the <strong> element in the ordered list is now a green, as seen in the following image:

      Content of website in a black sans-serif font, with bold content in the secondary heading red, bold content in paragraph content light orange, content in the third-level heading blue, bold content in an unordered list a light blue, and bold content in an ordered list green.

      In this section, you learned about the combinator selector. You used the selector with two type selectors multiple times to create custom colors for various instances of <strong> elements. The next section will look at how to simplify your CSS by applying similar styles to multiple element types with the selector group.

      Selecting Multiple Elements With the Selector Group

      In this section, you will select HTML elements using a selector group. There is a principle of programming called Don’t Repeat Yourself, or DRY. The purpose of DRY code is to write code that is more maintainable. Using the selector group is one of the quickest ways to put the DRY principle in practice when writing CSS.

      Open up styles.css in your editor. Earlier in the tutorial you wrote out two styles to change a browser default weight from bold to normal:

      styles.css

      ...
      h2 {
        font-weight: normal;
      }
      
      h3 {
        font-weight: normal;
      }
      ...
      
      

      Since the h2 and h3 type selectors have the same property and value in the selector block, this can be consolidated with a selector group. A selector group is done by putting a comma between selectors. In this case, you can remove the h3 selector block, then add a comma then the h3 type selector after the h2 type selector. It can be helpful to put each selector on a new line to help legibility of the list.

      styles.css

      ...
      h2,
      h3 {
        font-weight: normal;
      }
      ...
      

      Open up the browser and reload index.html to verify nothing has changed. Both the h2 and the h3 now share the same styles thanks to the selector block. However, you are not limited to keeping the styles looking the same. You can still have individual h2 and h3 type selectors to provide specific styles to each element. Create each of these type selectors, then add a different color to each selector block:

      styles.css

      ...
      h2,
      h3 {
        font-weight: normal;
      }
      
      h2 {
        color: maroon;
      }
      
      h3 {
        color: navy
      }
      ...
      

      Refresh index.html in your browser to find that the h2 and h3 still have the same shared style of a normal font-weight, yet have their individual color properties.

      Selector groups are not limited to a particular kind of selector and can bring together various kinds of selectors to have the same style. This feature of grouping could be used in any number of ways. To bring in the selectors discussed already, add one of the combinator selectors to the h2, h3 selector group.

      styles.css

      ...
      h2,
      h3,
      ol strong {
        font-weight: normal;
      }
      ...
      

      After refreshing index.html in your browser, the <strong> element in the ordered list will no longer be bold and instead will have a normal font-weight, as in the following image:

      The <strong> text in the ordered list is still green, but now is no longer bold like the base <h2> and <h3> elements.

      Note With the selector group, you can bring different styles together into one selector block. But there is a balance to be struck between DRY CSS and human-readable CSS, with a best practice that errs on the side of human-readable. As an extreme example, it is possible to write several large group selectors so no single property is repeated, but that will be harder for developers to understand. In this case, developer readability is preferred.

      In this section, you worked with the group selector and turned repetitive CSS properties into a single selector block. You also added in a combinator selector with a selector group to write reusable properties with high specificity.

      Conclusion

      In this tutorial, you learned about the baseline selectors needed to write CSS. You can now effectively find an element on a page with CSS that is nested deep in HTML and give it specific styles. You also learned about the DRY programming principle, which is helpful to write concise and manageable CSS. These selectors can be paired with many other CSS selectors to get to the exact element and situation you wish to style.

      If you would like to read more CSS tutorials, check out our CSS topic page.



      Source link