Python · SQL · Web Dev · Java · AI/ML tracks launching soon — your one platform for all of IT

Multiple Conditions — AND, OR, NOT

Combine WHERE filters to answer complex business questions — precedence rules, truth tables, and every pattern you will use in production

35 min April 2026

// Part 01

Why One Condition Is Never Enough

In Module 06 you learned to filter rows with a single WHERE condition. Real business questions almost never have a single condition. They sound like this:

Real questions from real teams
Growth"Show me Gold and Platinum customers from Bangalore who joined after January 2022."
Finance"Find all UPI orders above ₹1,000 that are either Cancelled or Returned."
Ops"Which products are out of stock AND priced above ₹200?"
HR"Employees in the Management department earning above ₹50,000 OR any Store Manager regardless of salary."

Every one of these questions requires combining multiple conditions. SQL provides three logical operators to do this: AND, OR, and NOT. Together they let you express any combination of conditions — no matter how complex — in a single WHERE clause.

// Part 02

AND — Both Conditions Must Be True

AND combines two conditions and returns TRUE only when both conditions are true. If either condition is false, the row is excluded. Think of AND as narrowing your results — every AND you add makes the filter more restrictive.

Truth table for AND

Condition ACondition BA AND B
TRUETRUETRUE
TRUEFALSEFALSE
FALSETRUEFALSE
FALSEFALSEFALSE
TRUENULLNULL
FALSENULLFALSE
NULLNULLNULL

The NULL rows are important — if either condition is NULL (unknown), AND cannot determine a definitive TRUE result unless the other condition is definitively FALSE.

AND in practice — FreshMart examples

Loading FreshMart DB…
Ctrl + Enter to run
Loading FreshMart database in your browser…
Loading FreshMart DB…
Ctrl + Enter to run
Loading FreshMart database in your browser…
Loading FreshMart DB…
Ctrl + Enter to run
Loading FreshMart database in your browser…
Loading FreshMart DB…
Ctrl + Enter to run
Loading FreshMart database in your browser…

// Part 03

OR — At Least One Condition Must Be True

OR combines two conditions and returns TRUE when at least one condition is true. If both are true, the row is still included. Think of OR as broadening your results — every OR you add makes the filter more permissive, potentially returning more rows.

Truth table for OR

Condition ACondition BA OR B
TRUETRUETRUE
TRUEFALSETRUE
FALSETRUETRUE
FALSEFALSEFALSE
TRUENULLTRUE
FALSENULLNULL
NULLNULLNULL

Notice that OR with NULL can still return TRUE if the other condition is TRUE. This is different from AND — when one condition is TRUE and the other is NULL, OR returns TRUE because one known TRUE is enough.

OR in practice — FreshMart examples

Loading FreshMart DB…
Ctrl + Enter to run
Loading FreshMart database in your browser…
Loading FreshMart DB…
Ctrl + Enter to run
Loading FreshMart database in your browser…
Loading FreshMart DB…
Ctrl + Enter to run
Loading FreshMart database in your browser…
🎯 Pro Tip
When you find yourself writing multiple OR conditions on the same column — WHERE city = 'Bangalore' OR city = 'Hyderabad' OR city = 'Mumbai' — there is a cleaner way: the IN operator. WHERE city IN ('Bangalore', 'Hyderabad', 'Mumbai'). You will learn IN in Module 15. For now, OR works perfectly and understanding it deeply makes IN intuitive when you get there.

// Part 04

NOT — Reverse the Condition

NOT reverses the result of a condition. A condition that was TRUE becomes FALSE, and a condition that was FALSE becomes TRUE. It is the SQL equivalent of saying "everything except this."

Truth table for NOT

ConditionNOT Condition
TRUEFALSE
FALSETRUE
NULLNULL

Important: NOT NULL is still NULL — the absence of a value reversed is still unknown. This is why NOT IN behaves surprisingly when the list contains NULL values — you will see this in Module 15.

NOT in practice — FreshMart examples

Loading FreshMart DB…
Ctrl + Enter to run
Loading FreshMart database in your browser…
Loading FreshMart DB…
Ctrl + Enter to run
Loading FreshMart database in your browser…
Loading FreshMart DB…
Ctrl + Enter to run
Loading FreshMart database in your browser…
Loading FreshMart DB…
Ctrl + Enter to run
Loading FreshMart database in your browser…

// Part 05

Operator Precedence — The Order SQL Evaluates Conditions

When you combine AND, OR, and NOT in the same WHERE clause, the order in which they are evaluated matters enormously. SQL does not evaluate conditions left to right — it follows a precedence order, just like arithmetic (multiplication before addition).

The precedence order for logical operators is:

1stNOTEvaluated first — applies to the immediately following condition
2ndANDEvaluated second — binds conditions tightly
3rdOREvaluated last — loosely connects groups of conditions

The classic precedence mistake

This is the most common AND/OR bug in SQL. The query looks correct but returns wrong results because AND binds before OR:

The precedence trap — this query has a bug
-- INTENTION: Find Gold or Platinum customers from Bangalore
-- ACTUAL: Find ALL Platinum customers + Gold customers from Bangalore

SELECT first_name, city, loyalty_tier
FROM customers
WHERE loyalty_tier = 'Gold'
   OR loyalty_tier = 'Platinum'
  AND city = 'Bangalore';

-- What the database actually evaluates (AND runs first):
-- WHERE loyalty_tier = 'Gold'
--    OR (loyalty_tier = 'Platinum' AND city = 'Bangalore')

-- This returns ALL Gold customers from ANY city
-- plus only Platinum customers from Bangalore
-- Not what was intended!
Loading FreshMart DB…
Ctrl + Enter to run
Loading FreshMart database in your browser…

The fix — always use parentheses with OR

Parentheses override precedence completely. Anything inside parentheses is evaluated first, just like in math. When combining AND and OR, use parentheses to make your intent explicit and unambiguous.

Loading FreshMart DB…
Ctrl + Enter to run
Loading FreshMart database in your browser…
⚠️ Important
The AND-before-OR precedence bug is one of the most common silent data quality issues in SQL. The query runs without error and returns results — just the wrong results. Always use parentheses when mixing AND and OR. Even when precedence would give the right answer, explicit parentheses make your intent clear to anyone reading the query.

// Part 06

Combining All Three — AND, OR, NOT Together

Complex business questions require all three operators together. The key is always: use parentheses to make evaluation order explicit. Never rely on precedence rules alone when your query mixes AND and OR.

Loading FreshMart DB…
Ctrl + Enter to run
Loading FreshMart database in your browser…
Loading FreshMart DB…
Ctrl + Enter to run
Loading FreshMart database in your browser…
Loading FreshMart DB…
Ctrl + Enter to run
Loading FreshMart database in your browser…
Loading FreshMart DB…
Ctrl + Enter to run
Loading FreshMart database in your browser…

The last query demonstrates nested parentheses — the inner parentheses group the city-tier pairs, the outer AND then applies the date filter to whichever city-tier combination matched. Reading complex WHERE clauses from the inside out (innermost parentheses first) is the most reliable way to understand what they do.

// Part 07

AND, OR, NOT with NULL — The Surprising Behaviour

NULL values interact with AND, OR, and NOT in ways that surprise beginners. The truth tables from Parts 02–04 showed the full picture — here are the practical consequences you need to know.

AND with NULL

If one condition is NULL and the other is FALSE, AND returns FALSE. If one condition is NULL and the other is TRUE, AND returns NULL (which means the row is excluded). This means a NULL condition on the AND side can cause rows to silently disappear from your results.

OR with NULL

If one condition is NULL and the other is TRUE, OR returns TRUE. This is the one place where NULL does not cause a row to disappear — the TRUE condition is enough for OR. If one condition is NULL and the other is FALSE, OR returns NULL (row excluded).

NOT with NULL

NOT NULL is still NULL. This has a major practical consequence: if you write WHERE NOT city = 'Bangalore', rows where city IS NULL will not be included in the results — even though logically you might expect "not Bangalore" to include "unknown city." NULL propagates through NOT unchanged.

Loading FreshMart DB…
Ctrl + Enter to run
Loading FreshMart database in your browser…
Loading FreshMart DB…
Ctrl + Enter to run
Loading FreshMart database in your browser…

🎯 Pro Tip

Whenever you write a WHERE clause that combines conditions, mentally ask: "What happens if any of the columns in my conditions contain NULL?" If a NULL value in the data would cause a row to silently disappear from your results when you expect it to be included, add an explicit IS NULL or IS NOT NULL check. Silent data loss from NULL propagation is one of the hardest bugs to spot because the query runs without error.

// Part 08

Writing Readable Multi-Condition WHERE Clauses

As conditions multiply, WHERE clauses can become hard to read. Professional SQL follows consistent formatting conventions that make complex conditions readable at a glance.

Formatting conventions for multi-condition WHERE
-- Each condition on its own line
-- AND/OR at the START of the line (not the end)
-- This makes it easy to comment out individual conditions

SELECT *
FROM orders
WHERE order_status = 'Delivered'    -- primary filter
  AND payment_method = 'UPI'        -- secondary filter
  AND total_amount > 1000           -- threshold filter
  AND order_date >= '2024-01-01';   -- date filter

-- When mixing AND and OR — always use parentheses
-- Group related conditions with matching indentation

SELECT *
FROM orders
WHERE (order_status = 'Cancelled'
       OR order_status = 'Returned')
  AND total_amount > 500
  AND order_date >= '2024-01-01';

-- Complex conditions — each group on its own indented block

SELECT *
FROM customers
WHERE (
    (city = 'Bangalore' AND loyalty_tier IN ('Gold', 'Platinum'))
    OR
    (city = 'Mumbai'    AND loyalty_tier = 'Platinum')
  )
  AND joined_date >= '2022-01-01';

The convention of putting AND/OR at the beginning of lines (not the end) makes it easy to comment out individual conditions during debugging — just add -- in front of the line without breaking the query syntax.

// Part 09

Real Business Scenarios — Complete Examples

Here are the four business questions from Part 01 — now answered with complete queries.

Growth team — high-value customers in specific cities

Loading FreshMart DB…
Ctrl + Enter to run
Loading FreshMart database in your browser…

Finance team — UPI orders that failed

Loading FreshMart DB…
Ctrl + Enter to run
Loading FreshMart database in your browser…

Operations team — stock and price analysis

Loading FreshMart DB…
Ctrl + Enter to run
Loading FreshMart database in your browser…

HR team — leadership compensation review

Loading FreshMart DB…
Ctrl + Enter to run
Loading FreshMart database in your browser…

// Part 10

What This Looks Like at Work

You are a data analyst at CRED, a Bangalore-based fintech that rewards credit card users. The growth team calls an urgent meeting — they are preparing a targeted cashback campaign and need a segmented customer list by end of day.

3:00 PM
Campaign brief arrives
The growth manager explains three segments for the cashback campaign. Segment A: high-spending users in metro cities (Delhi, Bangalore, Mumbai) who have been active in the last 60 days. Segment B: users in Tier 2 cities who have a credit score above 750 but have been inactive for more than 30 days — the reactivation target. Segment C: new users (joined in the last 90 days) who have already completed at least one high-value transaction. Each segment needs a separate list with user IDs, cities, and relevant metrics.
3:15 PM
You translate the brief into WHERE conditions
Segment A requires: city IN metro list AND last_active_date within 60 days. Segment B requires: city NOT IN metro list AND credit_score greater than 750 AND last_active_date more than 30 days ago. Segment C requires: joined_date within 90 days AND at least one transaction above ₹5,000. Each segment becomes a separate WHERE clause. You build them one at a time, verifying row counts before sharing.
Segment A — Metro high-spenders (adapted for FreshMart data)
-- Adapt to FreshMart: Gold/Platinum customers in metro cities
-- with recent orders (Feb 2024 or later)
SELECT
  c.customer_id,
  c.first_name || ' ' || c.last_name  AS customer_name,
  c.city,
  c.loyalty_tier
FROM customers c
WHERE (c.city = 'Bangalore'
    OR c.city = 'Delhi'
    OR c.city = 'Mumbai')
  AND (c.loyalty_tier = 'Gold'
    OR c.loyalty_tier = 'Platinum')
ORDER BY c.city;
4:30 PM
Three lists delivered, 90 minutes early
You run three separate queries, export each to a sheet tab, and share the Google Sheet link. The growth manager adds it directly to the campaign tool. "This is exactly what we needed — and the segmentation logic is right there in the SQL comments so I can adjust it next time." Your queries are not just answers — they are documented, reproducible, adjustable analysis.

🎯 Pro Tip

Always add comments to complex WHERE clauses explaining what business segment or rule each condition represents. The SQL itself shows WHAT is being filtered. The comments explain WHY — which campaign, which definition of "high-value," which date range and why. A query with good comments is a self-documenting piece of business logic that your team can run, verify, and adjust without asking you.

// Part 11

Interview Prep — 5 Questions With Complete Answers

Q: What is operator precedence in SQL and why does it matter for AND and OR?

Operator precedence determines the order in which SQL evaluates logical operators when multiple operators appear in the same WHERE clause. In SQL, NOT has the highest precedence, AND has the second highest, and OR has the lowest. This means SQL evaluates NOT conditions first, then AND conditions, and finally OR conditions — regardless of the order they appear in the query text.

This matters because mixing AND and OR without parentheses can produce results that differ from what was intended. For example: WHERE tier = 'Gold' OR tier = 'Platinum' AND city = 'Bangalore' is evaluated as WHERE tier = 'Gold' OR (tier = 'Platinum' AND city = 'Bangalore') — because AND binds before OR. This returns all Gold customers from any city plus Platinum customers from Bangalore only, rather than Gold and Platinum customers from Bangalore as the author likely intended.

The correct approach is always to use parentheses when combining AND and OR: WHERE (tier = 'Gold' OR tier = 'Platinum') AND city = 'Bangalore'. Parentheses override precedence completely — expressions inside parentheses are always evaluated first. Even when precedence would naturally produce the correct result, writing explicit parentheses makes intent clear to anyone reading the query and prevents bugs when conditions are added or modified later.

Q: What is the difference between AND and OR? When would you use each?

AND returns TRUE only when both conditions are true — it narrows results by requiring all conditions to be satisfied simultaneously. Every additional AND condition makes the filter more restrictive. OR returns TRUE when at least one condition is true — it broadens results by accepting rows that satisfy any of the conditions. Every additional OR condition makes the filter more permissive.

Use AND when you need rows that satisfy multiple criteria simultaneously: orders that are both delivered AND paid by UPI AND above ₹1,000. All three characteristics must be present in the same row. Use OR when you need rows that match any of several alternative criteria: customers from Bangalore OR Hyderabad OR Mumbai. A customer matching any one city qualifies.

A practical test: if you read the question with "AND" and "OR" literally, the answer is usually correct. "Give me customers from Bangalore AND with Gold tier" — AND. "Give me customers from Bangalore OR Hyderabad" — OR. "Give me Gold or Platinum customers from Bangalore" — the "or" applies to tier, so OR for tier, then AND for the city: WHERE (tier = 'Gold' OR tier = 'Platinum') AND city = 'Bangalore'.

Q: How does NOT work and what are its limitations with NULL?

NOT reverses the logical result of a condition. A condition that evaluates to TRUE becomes FALSE, and a condition that evaluates to FALSE becomes TRUE. NOT NULL, however, is still NULL — the unknown reversed is still unknown. This is the fundamental limitation of NOT with nullable columns.

The practical consequence: WHERE NOT city = 'Bangalore' returns rows where city is any value other than 'Bangalore' but does NOT return rows where city IS NULL. Rows with a null city silently disappear from the results. If you want to include null values in a NOT condition, you must explicitly add them: WHERE (city <> 'Bangalore' OR city IS NULL).

NOT is most commonly used in two forms: NOT LIKE (does not match a pattern), NOT IN (value not in a list), and NOT EXISTS (no matching rows in a subquery). The NOT IN form has a particularly dangerous NULL interaction — if the IN list contains even one NULL value, NOT IN returns zero rows for the entire query, which is almost never what was intended. This is why NOT EXISTS is often preferred over NOT IN for correlated subqueries. You will learn this in Module 38.

Q: Given the query: WHERE status = 'Delivered' OR status = 'Returned' AND amount > 1000 — what does it actually return?

Due to operator precedence (AND before OR), this query is evaluated as: WHERE status = 'Delivered' OR (status = 'Returned' AND amount > 1000). It returns two groups of rows: all rows where status is 'Delivered' regardless of amount (every delivered order, whether ₹10 or ₹100,000), plus rows where status is 'Returned' AND amount is greater than 1,000.

This is almost certainly not what was intended. The author likely wanted all Delivered or Returned orders with amount above 1,000. The correct query uses parentheses: WHERE (status = 'Delivered' OR status = 'Returned') AND amount > 1000. The parentheses force the OR to be evaluated first, grouping the two status values, and then AND applies the amount threshold to the combined group.

This type of bug is particularly insidious because the query runs without error and returns results — just wrong results. The only way to catch it is to understand precedence rules and verify results against expected counts. Always run a SELECT COUNT(*) to verify the row count makes sense before using the results for any decision. If Delivered orders are 18 of your 30 orders, a query returning 22 rows for "delivered or returned above 1000" should immediately prompt a precedence check.

Q: How would you write a WHERE clause to find customers who are NOT from the top three cities?

There are several correct approaches with different trade-offs. The most readable approach uses NOT with an OR group: WHERE NOT (city = 'Bangalore' OR city = 'Hyderabad' OR city = 'Mumbai'). This is evaluated as: exclude rows where city is any of the three. By De Morgan's law, this is equivalent to: WHERE city <> 'Bangalore' AND city <> 'Hyderabad' AND city <> 'Mumbai'.

A more concise and equally readable approach uses NOT IN: WHERE city NOT IN ('Bangalore', 'Hyderabad', 'Mumbai'). This is cleaner for more than two or three values. Both approaches are semantically identical and produce the same results.

The critical caveat: if the city column can contain NULL values, neither NOT with OR nor NOT IN will include rows where city is NULL — they will silently exclude them. If you want to include customers with an unknown city alongside those from non-top-three cities, add an explicit NULL check: WHERE (city NOT IN ('Bangalore', 'Hyderabad', 'Mumbai') OR city IS NULL). In the FreshMart customers table, city is defined NOT NULL, so this is not an issue — but in any table where nullable city is possible, the NULL case must be handled explicitly.

// Part 12

Errors You Will Hit — And Exactly Why They Happen

Query returns more rows than expected — WHERE city = 'Bangalore' OR city = 'Hyderabad' AND loyalty_tier = 'Gold'

Cause: Operator precedence bug — AND evaluates before OR. The query is actually evaluated as: WHERE city = 'Bangalore' OR (city = 'Hyderabad' AND loyalty_tier = 'Gold'). This returns ALL Bangalore customers regardless of tier, plus only Gold customers from Hyderabad. If the intention was Gold customers from both cities, the result includes non-Gold Bangalore customers which should not be there.

Fix: Always use parentheses when combining AND and OR: WHERE (city = 'Bangalore' OR city = 'Hyderabad') AND loyalty_tier = 'Gold'. To debug, run SELECT COUNT(*) with each version and compare to expected counts. If your table has 8 Bangalore customers and 4 Hyderabad-Gold customers, the buggy query returns 12. The fixed query returns only the Bangalore-Gold plus Hyderabad-Gold count.

ERROR: syntax error at or near 'AND' — WHERE AND city = 'Bangalore'

Cause: AND and OR must connect two complete conditions — they cannot appear at the start of a WHERE clause with nothing before them, and they cannot appear between a condition and nothing. This error happens when a condition is accidentally deleted leaving only the AND/OR connector, or when copying and pasting conditions in the wrong order.

Fix: Ensure AND and OR always connect exactly two complete conditions. Each side of AND/OR must be a valid condition: column operator value, or a parenthesised group of conditions. Check that you have not accidentally deleted the first condition in the pair. In editors that highlight syntax, AND/OR at the start of a clause (with nothing before it) is visually obvious as a red highlight.

WHERE NOT in ('Cancelled', 'Returned') returns zero rows

Cause: NOT IN returns zero rows when the list contains even one NULL value. If order_status can be NULL and any row has a NULL status, NOT IN internally evaluates to: status <> 'Cancelled' AND status <> 'Returned' AND status <> NULL. Since any comparison with NULL returns NULL (not TRUE), the entire condition becomes NULL for every row — and the WHERE clause discards all NULL results. Even if your list has no explicit NULLs, if the column itself has NULL values, NOT IN behaves unexpectedly.

Fix: Use NOT EXISTS or an explicit exclusion with IS NOT NULL: WHERE order_status IS NOT NULL AND order_status NOT IN ('Cancelled', 'Returned'). Or rewrite using NOT and OR: WHERE NOT (order_status = 'Cancelled' OR order_status = 'Returned') AND order_status IS NOT NULL. In production, always check whether the column can contain NULLs before using NOT IN — SELECT COUNT(*) FROM orders WHERE order_status IS NULL; if this returns any rows, NOT IN is dangerous.

Query is correct but very slow — WHERE LOWER(city) = 'bangalore' OR LOWER(city) = 'hyderabad'

Cause: Applying a function to the column side of OR conditions (LOWER(city)) prevents the database from using an index on the city column. The index stores raw city values ('Bangalore', 'Hyderabad') — not their lowercase equivalents. When LOWER() is applied, the database cannot use the index and must scan every row, applying LOWER() to each one. On a table with millions of rows, this causes a full table scan that is orders of magnitude slower than an index lookup.

Fix: Two approaches. First, standardise data at insertion time — store all city values in consistent case ('Bangalore' not 'bangalore') and use case-sensitive comparison: WHERE city = 'Bangalore' OR city = 'Hyderabad'. This allows index usage. Second, if consistent casing cannot be guaranteed, create a functional index on LOWER(city): CREATE INDEX idx_customers_city_lower ON customers (LOWER(city)); — then WHERE LOWER(city) = 'bangalore' OR LOWER(city) = 'hyderabad' can use this index. For performance-critical queries, always check whether index usage is possible with EXPLAIN ANALYZE (covered in Module 57).

Unexpected results — NOT city = 'Bangalore' excludes NULL city rows

Cause: NOT condition propagates NULL. Rows where city IS NULL evaluate NOT NULL = NULL (not FALSE, and not TRUE) — and the WHERE clause discards NULL results. If you intended WHERE NOT city = 'Bangalore' to mean 'all customers not specifically in Bangalore — including those with no city recorded,' the query silently excludes the NULL-city rows without any error or warning.

Fix: Explicitly include NULL rows: WHERE city <> 'Bangalore' OR city IS NULL. The OR city IS NULL clause captures rows that were being silently excluded. This pattern — adding OR column IS NULL — is the standard fix whenever you need a NOT condition to include rows with null values. Run SELECT COUNT(*) FROM customers WHERE city IS NULL before and after to confirm whether NULL rows are present and whether your fix captures them.

Try It Yourself

The FreshMart finance team needs two separate reports. Report 1: All orders from store ST001 OR ST008 that were delivered AND paid by either Card or NetBanking — sorted by total_amount descending. Report 2: All orders that are NOT delivered (any other status) AND have a total_amount above ₹400. Write both queries.

🎯 Key Takeaways

  • AND returns TRUE only when both conditions are true — it narrows results. Every AND makes the filter more restrictive.
  • OR returns TRUE when at least one condition is true — it broadens results. Every OR makes the filter more permissive.
  • NOT reverses a condition: TRUE becomes FALSE, FALSE becomes TRUE. NOT NULL is still NULL — rows with null values are silently excluded by NOT conditions.
  • Operator precedence: NOT first, AND second, OR last. SQL evaluates AND before OR in the same WHERE clause regardless of left-to-right reading order.
  • Always use parentheses when mixing AND and OR — even when precedence would give the correct result. Explicit parentheses prevent bugs and make intent clear.
  • The classic precedence bug: WHERE tier = 'Gold' OR tier = 'Platinum' AND city = 'Bangalore' is not "Gold or Platinum customers from Bangalore." AND binds first, making it: Gold (any city) OR (Platinum AND Bangalore). Fix: (tier = 'Gold' OR tier = 'Platinum') AND city = 'Bangalore'.
  • NOT IN returns zero rows if the list or the column contains any NULL values — because any comparison with NULL returns NULL, not FALSE. Use NOT EXISTS or add IS NOT NULL explicitly when NULL rows are possible.
  • Applying functions to the column side of conditions (LOWER(city) = 'bangalore') prevents index usage — a full table scan results. Standardise data on insert and use direct comparison instead.
  • When a NOT condition must include NULL rows, explicitly add OR column IS NULL: WHERE (city <> 'Bangalore' OR city IS NULL).
  • Format multi-condition WHERE clauses with one condition per line, AND/OR at the start of each line. This makes commenting out individual conditions easy during debugging.

What comes next

In Module 08, you control the order your results come back in using ORDER BY — ascending, descending, multiple columns, and how sorting interacts with NULL values.

Module 08 → Sorting Results — ORDER BY
Share

Discussion

0

Have a better approach? Found something outdated? Share it — your knowledge helps everyone learning here.

Continue with GitHub
Loading...