Skip to content

SELECT, WHERE, LIMIT ​

This page covers the fundamental SQL clauses for selecting and filtering data.

SELECT ​

The SELECT clause specifies which columns to retrieve.

Select All Columns ​

sql
SELECT * FROM users.csv

Select Specific Columns ​

sql
SELECT name, email, age FROM users.csv

Column Aliases ​

Use AS to rename columns in the output:

sql
SELECT name AS user_name, age AS user_age FROM users.csv

The AS keyword is optional:

sql
SELECT name user_name, age user_age FROM users.csv

Expressions ​

Perform calculations in SELECT:

sql
SELECT
    name,
    price,
    quantity,
    price * quantity AS total
FROM orders.csv

Functions ​

Apply functions to columns:

sql
SELECT
    UPPER(name) AS name,
    ROUND(price, 2) AS price,
    LENGTH(description) AS desc_length
FROM products.csv

DISTINCT ​

Remove duplicate rows:

sql
-- Unique cities
SELECT DISTINCT city FROM users.csv

-- Unique combinations
SELECT DISTINCT city, country FROM users.csv

FROM ​

The FROM clause specifies the data source.

File Paths ​

sql
-- Relative path
SELECT * FROM users.csv

-- With quotes (recommended for paths with spaces)
SELECT * FROM 'my data/users.csv'

-- Absolute path
SELECT * FROM '/var/log/app.csv'

Table Aliases ​

Aliases simplify queries, especially with JOINs:

sql
SELECT u.name, u.email
FROM users.csv u
WHERE u.age > 30

Multiple Files (with JOIN) ​

sql
SELECT u.name, o.total
FROM users.csv u
JOIN orders.csv o ON u.id = o.user_id

WHERE ​

The WHERE clause filters rows.

Comparison Operators ​

OperatorDescriptionExample
=EqualWHERE status = 'active'
!=Not equalWHERE status != 'deleted'
<>Not equal (alternate)WHERE status <> 'deleted'
<Less thanWHERE age < 30
>Greater thanWHERE age > 18
<=Less than or equalWHERE price <= 100
>=Greater than or equalWHERE score >= 90

Examples ​

sql
-- Numeric comparison
SELECT * FROM users.csv WHERE age > 30

-- String comparison
SELECT * FROM users.csv WHERE city = 'New York'

-- Date comparison
SELECT * FROM logs.csv WHERE date > '2024-01-01'

Logical Operators ​

AND ​

Both conditions must be true:

sql
SELECT * FROM users.csv
WHERE age > 18 AND city = 'New York'

OR ​

Either condition can be true:

sql
SELECT * FROM users.csv
WHERE city = 'New York' OR city = 'Los Angeles'

NOT ​

Negates a condition:

sql
SELECT * FROM users.csv
WHERE NOT status = 'deleted'

Complex Conditions ​

Use parentheses for complex logic:

sql
SELECT * FROM users.csv
WHERE (city = 'New York' OR city = 'Los Angeles')
  AND age >= 21
  AND status = 'active'

BETWEEN ​

Range check (inclusive):

sql
-- Age between 18 and 65
SELECT * FROM users.csv WHERE age BETWEEN 18 AND 65

-- Equivalent to:
SELECT * FROM users.csv WHERE age >= 18 AND age <= 65

-- Date range
SELECT * FROM logs.csv
WHERE date BETWEEN '2024-01-01' AND '2024-12-31'

IN ​

Check if value is in a list:

sql
SELECT * FROM users.csv
WHERE city IN ('New York', 'Los Angeles', 'Chicago')

-- Equivalent to:
SELECT * FROM users.csv
WHERE city = 'New York'
   OR city = 'Los Angeles'
   OR city = 'Chicago'

NOT IN excludes values:

sql
SELECT * FROM users.csv
WHERE status NOT IN ('deleted', 'banned')

LIKE ​

Pattern matching for strings:

PatternMatches
%Zero or more characters
_Exactly one character
sql
-- Names starting with 'J'
SELECT * FROM users.csv WHERE name LIKE 'J%'

-- Names ending with 'son'
SELECT * FROM users.csv WHERE name LIKE '%son'

-- Names containing 'ann'
SELECT * FROM users.csv WHERE name LIKE '%ann%'

-- Three-letter names starting with 'J'
SELECT * FROM users.csv WHERE name LIKE 'J__'

NOT LIKE excludes matches:

sql
SELECT * FROM logs.csv
WHERE message NOT LIKE '%debug%'

IS NULL / IS NOT NULL ​

Check for NULL values:

sql
-- Find records with missing email
SELECT * FROM users.csv WHERE email IS NULL

-- Find records with email
SELECT * FROM users.csv WHERE email IS NOT NULL

WARNING

Don't use = NULL or != NULL. Always use IS NULL or IS NOT NULL.

LIMIT ​

Restrict the number of rows returned:

sql
-- First 10 rows
SELECT * FROM users.csv LIMIT 10

-- With ORDER BY for top N
SELECT * FROM users.csv
ORDER BY score DESC
LIMIT 5

TOP (MS Log Parser Compatible) ​

TOP is an alternative to LIMIT that provides Microsoft Log Parser 2.2 compatibility:

sql
-- First 10 rows (same as LIMIT 10)
SELECT TOP 10 * FROM users.csv

-- With ORDER BY for top N
SELECT TOP 5 *
FROM users.csv
ORDER BY score DESC

TOP appears right after SELECT, before the column list. Both TOP and LIMIT achieve the same result - use whichever you prefer or need for script compatibility.

INTO (Output Routing) ​

The INTO clause specifies where to write output, making queries self-contained:

sql
-- Write results to a CSV file
SELECT * INTO output.csv FROM users.csv

-- Write to JSON (format inferred from extension)
SELECT name, score INTO results.json FROM users.csv

-- Write to SQLite database (format inferred from .db extension)
SELECT TOP 100 * INTO analysis.db FROM 'logs/access.log'

-- Write to XML
SELECT * INTO report.xml FROM data.csv WHERE status = 'active'

Format Inference ​

The output format is automatically inferred from the file extension:

ExtensionFormat
.csvCSV
.tsv, .tabTSV
.json, .ndjsonJSON (NDJSON)
.xmlXML
.db, .sqlite, .sqlite3SQLite
.png, .svgChart
.parquetParquet
.natNative binary

You can override format inference with the -o option:

bash
loq -o:XML "SELECT * INTO output.txt FROM data.csv"

INTO with Full Paths ​

For paths containing forward slashes, quote the destination:

bash
loq "SELECT * INTO '/tmp/results.csv' FROM 'data/input.csv'"

MS Log Parser Compatibility ​

INTO provides full compatibility with MS Log Parser 2.2 scripts:

sql
-- Classic Log Parser syntax works
SELECT TOP 1000 *
INTO filtered.csv
FROM 'C:\Logs\access.log'
WHERE sc-status >= 500

-- Write aggregate results to database
SELECT cs-uri-stem, COUNT(*) AS hits
INTO stats.db
FROM 'access.log'
GROUP BY cs-uri-stem
ORDER BY hits DESC

Combining Clauses ​

A complete query combining all clauses:

sql
SELECT
    name,
    city,
    score,
    ROUND(score * 1.1, 1) AS adjusted_score
FROM users.csv
WHERE age >= 18
  AND city IN ('New York', 'Chicago')
  AND email IS NOT NULL
  AND name LIKE 'J%'
ORDER BY score DESC
LIMIT 20

Best Practices ​

1. Quote File Paths ​

Always quote paths with spaces or special characters:

sql
-- Good
SELECT * FROM 'my data/users.csv'

-- May fail
SELECT * FROM my data/users.csv

2. Use Meaningful Aliases ​

sql
-- Good
SELECT customer_name AS name, order_total AS total

-- Less clear
SELECT customer_name AS cn, order_total AS ot

3. Filter Early ​

Put more selective conditions first:

sql
-- Better: checks status first (likely indexed/faster)
WHERE status = 'active' AND name LIKE 'J%'

-- Worse: pattern match first (slower)
WHERE name LIKE 'J%' AND status = 'active'

4. Use BETWEEN for Ranges ​

sql
-- Good
WHERE age BETWEEN 18 AND 65

-- Less readable
WHERE age >= 18 AND age <= 65

5. Use IN for Multiple Values ​

sql
-- Good
WHERE city IN ('NYC', 'LA', 'Chicago')

-- Less readable
WHERE city = 'NYC' OR city = 'LA' OR city = 'Chicago'

All rights reserved.