MySQL查询数据
基本SELECT语法
SELECT语句用于从MySQL数据库表中查询数据。
简单查询
sql
-- Select all columns from a table
SELECT * FROM users;
-- Select specific columns
SELECT name, email FROM users;
-- Select with column aliases
SELECT name AS user_name, email AS user_email FROM users;
-- Select with expressions
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
-- Select with calculations
SELECT product_name, price, price * 0.9 AS discounted_price FROM products;WHERE子句过滤
sql
-- Equality condition
SELECT * FROM users WHERE status = 'active';
-- Comparison operators
SELECT * FROM products WHERE price > 100;
SELECT * FROM orders WHERE quantity >= 10;
SELECT * FROM users WHERE age < 30;
-- IN operator
SELECT * FROM users WHERE country IN ('USA', 'Canada', 'UK');
-- BETWEEN operator
SELECT * FROM products WHERE price BETWEEN 50 AND 200;
-- LIKE operator for pattern matching
SELECT * FROM users WHERE email LIKE '%@gmail.com';
SELECT * FROM products WHERE name LIKE 'iPhone%';
-- IS NULL
SELECT * FROM users WHERE phone IS NULL;
-- Combining conditions
SELECT * FROM users WHERE status = 'active' AND age >= 18;
SELECT * FROM products WHERE (category = 'Electronics' OR category = 'Computers') AND price < 1000;排序
sql
-- Ascending order (default)
SELECT * FROM users ORDER BY name;
-- Explicit ascending
SELECT * FROM users ORDER BY name ASC;
-- Descending order
SELECT * FROM products ORDER BY price DESC;
-- Multiple column sorting
SELECT * FROM users ORDER BY country ASC, name ASC;
-- Sorting by position
SELECT name, email, age FROM users ORDER BY 3 DESC;
-- Sorting with expressions
SELECT name, price, price * 0.9 AS sale_price FROM products ORDER BY sale_price DESC;
-- NULL handling in sorting
SELECT * FROM users ORDER BY phone IS NULL, phone;限制和偏移
sql
-- Limit number of results
SELECT * FROM users LIMIT 10;
-- Skip first 10 results
SELECT * FROM users LIMIT 10 OFFSET 10;
-- Alternative syntax
SELECT * FROM users LIMIT 10, 10;
-- Pagination example (page 3 with 10 items per page)
SELECT * FROM products LIMIT 10 OFFSET 20;
-- Get latest records
SELECT * FROM orders ORDER BY created_at DESC LIMIT 5;
-- Random sampling
SELECT * FROM users ORDER BY RAND() LIMIT 10;去重
sql
-- Get unique values
SELECT DISTINCT country FROM users;
-- Multiple columns
SELECT DISTINCT country, city FROM users;
-- With WHERE clause
SELECT DISTINCT category FROM products WHERE price > 100;
-- Counting distinct values
SELECT COUNT(DISTINCT country) AS unique_countries FROM users;聚合函数
sql
-- Count all rows
SELECT COUNT(*) FROM users;
-- Count specific column (non-NULL values)
SELECT COUNT(phone) FROM users;
-- Count distinct values
SELECT COUNT(DISTINCT country) FROM users;
-- Sum values
SELECT SUM(amount) FROM orders;
-- Average value
SELECT AVG(price) FROM products;
-- Minimum value
SELECT MIN(price) FROM products;
-- Maximum value
SELECT MAX(price) FROM products;
-- Multiple aggregates
SELECT
COUNT(*) AS total_orders,
SUM(amount) AS total_revenue,
AVG(amount) AS average_order,
MIN(amount) AS min_order,
MAX(amount) AS max_order
FROM orders;分组
sql
-- Group by single column
SELECT country, COUNT(*) AS user_count
FROM users
GROUP BY country;
-- Group by multiple columns
SELECT country, city, COUNT(*) AS user_count
FROM users
GROUP BY country, city;
-- With HAVING clause
SELECT category, AVG(price) AS avg_price
FROM products
GROUP BY category
HAVING AVG(price) > 100;
-- With WHERE and ORDER BY
SELECT
status,
COUNT(*) AS count,
AVG(amount) AS avg_amount
FROM orders
WHERE created_at >= '2024-01-01'
GROUP BY status
HAVING COUNT(*) > 10
ORDER BY avg_amount DESC;子查询
sql
-- Simple subquery
SELECT * FROM products
WHERE price > (SELECT AVG(price) FROM products);
-- Correlated subquery
SELECT p1.name, p1.price
FROM products p1
WHERE p1.price > (
SELECT AVG(p2.price)
FROM products p2
WHERE p2.category = p1.category
);
-- EXISTS subquery
SELECT * FROM customers c
WHERE EXISTS (
SELECT 1 FROM orders o
WHERE o.customer_id = c.id
);
-- FROM subquery
SELECT category, avg_price
FROM (
SELECT category, AVG(price) AS avg_price
FROM products
GROUP BY category
) AS category_avg
WHERE avg_price > 100;连接操作
sql
-- INNER JOIN
SELECT u.name, o.order_number, o.amount
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
-- LEFT JOIN
SELECT u.name, o.order_number
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
-- RIGHT JOIN
SELECT u.name, o.order_number
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;
-- Self JOIN
SELECT e1.name AS employee, e2.name AS manager
FROM employees e1
LEFT JOIN employees e2 ON e1.manager_id = e2.id;
-- Multiple JOINs
SELECT
u.name,
o.order_number,
p.product_name,
oi.quantity
FROM users u
INNER JOIN orders o ON u.id = o.user_id
INNER JOIN order_items oi ON o.id = oi.order_id
INNER JOIN products p ON oi.product_id = p.id;联合
sql
-- Combine results from multiple queries
SELECT name, email FROM customers
UNION
SELECT name, email FROM suppliers;
-- UNION ALL (includes duplicates)
SELECT product_name FROM products WHERE category = 'Electronics'
UNION ALL
SELECT product_name FROM products WHERE price < 100;
-- With ORDER BY
SELECT name, 'customer' AS type FROM customers
UNION
SELECT name, 'supplier' AS type FROM suppliers
ORDER BY name;条件表达式
sql
-- CASE expression
SELECT
name,
price,
CASE
WHEN price < 50 THEN 'Cheap'
WHEN price < 200 THEN 'Moderate'
ELSE 'Expensive'
END AS price_category
FROM products;
-- Simple CASE
SELECT
name,
status,
CASE status
WHEN 'active' THEN '活跃'
WHEN 'inactive' THEN '不活跃'
WHEN 'pending' THEN '待定'
ELSE '未知'
END AS status_cn
FROM users;
-- IF function
SELECT name, IF(age >= 18, 'Adult', 'Minor') AS age_group FROM users;
-- IFNULL
SELECT name, IFNULL(phone, 'No phone') AS contact FROM users;
-- COALESCE
SELECT name, COALESCE(phone, email, 'No contact') AS contact FROM users;日期和时间函数
sql
-- Current date/time
SELECT NOW(), CURDATE(), CURTIME();
-- Date extraction
SELECT
YEAR(created_at) AS year,
MONTH(created_at) AS month,
DAY(created_at) AS day
FROM orders;
-- Date arithmetic
SELECT
created_at,
DATE_ADD(created_at, INTERVAL 7 DAY) AS week_later,
DATE_SUB(created_at, INTERVAL 1 MONTH) AS month_ago
FROM orders;
-- Date difference
SELECT
name,
DATEDIFF(NOW(), created_at) AS days_since_registration
FROM users;字符串函数
sql
-- String manipulation
SELECT
CONCAT(first_name, ' ', last_name) AS full_name,
UPPER(email) AS email_upper,
LOWER(name) AS name_lower,
LENGTH(description) AS desc_length,
SUBSTRING(phone, 1, 3) AS area_code,
REPLACE(email, '@gmail.com', '@example.com') AS new_email,
TRIM(name) AS trimmed_name
FROM users;模式匹配
sql
-- LIKE patterns
SELECT * FROM users WHERE email LIKE '%@gmail.com';
SELECT * FROM products WHERE name LIKE 'iPhone%';
SELECT * FROM users WHERE name LIKE '_ohn%';
-- REGEXP (regular expressions)
SELECT * FROM users WHERE email REGEXP '^[a-z]+@[a-z]+\\.com$';
SELECT * FROM products WHERE sku REGEXP '^[A-Z]{3}-[0-9]{4}$';WITH(公用表表达式)
sql
-- Non-recursive CTE
WITH high_value_customers AS (
SELECT customer_id, SUM(amount) AS total_spent
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 1000
)
SELECT c.name, hvc.total_spent
FROM customers c
INNER JOIN high_value_customers hvc ON c.id = hvc.customer_id;
-- Multiple CTEs
WITH
monthly_sales AS (
SELECT
DATE_FORMAT(order_date, '%Y-%m') AS month,
SUM(amount) AS total
FROM orders
GROUP BY month
),
avg_monthly AS (
SELECT AVG(total) AS avg_total
FROM monthly_sales
)
SELECT ms.month, ms.total, am.avg_total
FROM monthly_sales ms
CROSS JOIN avg_monthly am
WHERE ms.total > am.avg_total;限制变化
sql
-- Top N by value
-- Top N with offset (pagination)
-- Random sample
-- First and last
-- With GROUP BY综合示例
sql
-- Column selection with aliases
-- Aggregates
-- Conditional expressions
-- Date functions
-- String functions小结
SELECT语句是MySQL中数据检索的基础:
基本查询:使用带特定列和条件的SELECT 过滤:使用WHERE子句进行精确数据选择 排序:使用ORDER BY对结果排序 限制:使用LIMIT和OFFSET进行分页 聚合:COUNT、SUM、AVG、MIN、MAX 分组:带HAVING的GROUP BY 连接:INNER、LEFT、RIGHT、SELF连接 子查询:嵌套查询实现复杂逻辑 表达式:CASE、IF、COALESCE实现条件逻辑 CTE:使用WITH子句实现可重用子查询
上一个:插入数据
下一个:WHERE子句