SQL基础语法
查询
-
全表查询:
select * from student;
-
选择查询:
select name, gender from student;
-
别名:
select name as 员工姓名, position as 职位名称 from employees;
上述代码中的
as
也可以省略,比如name 员工姓名
也是 OK 的。 -
常量和运算:
select order_id, unit_price, quantity, unit_price * quantity as total_amount from orders;
此外,SQL可以直接把常量作为列名,比如执行下列SQL语句:
select 200, '篮球' as hobby;
-
条件查询:
-
where:
select 列1, 列2, ... from 表名 where 条件;
其中,
列1, 列2, ...
是你要选择的列,可以是具体的列名,也可以是*
表示选择所有列。表名
是你要从中查询数据的表名。条件
是指定的查询条件,可以使用比较运算符(如=
、<
、>
等)、逻辑运算符(如and
、or
等)、in
操作符、like
操作符等来设置条件。 -
运算符:
select name, age, salary from employees where age between 25 and 30;
运算符是 SQL 中用于在条件查询中进行条件判断的特殊符号,比如
=
、!=
、<
、>
等。通过使用不同的运算符,我们可以在查询语句中设定多样化的条件,从而根据数据的不同属性进行灵活的筛选和过滤。 -
空值:
select name, age, from employees where hire_date is null;
-
模糊查询:
select name, age, position from employees where name like '%张%';
有如下 2 种通配符:
- 百分号(%):表示任意长度的任意字符序列。
- 下划线(_):表示任意单个字符。
-
逻辑运算:
select name, age, salary from employees where name like '%李%' and age < 30;
在逻辑运算中,常用的运算符有:
- and:表示逻辑与,要求同时满足多个条件,才返回 true。
- or:表示逻辑或,要求满足其中任意一个条件,就返回 true。
- not:表示逻辑非,用于否定一个条件(本来是 true,用了 not 后转为 false)
-
-
关联查询:
- cross join:
select e.emp_name, e.salary, d.department, d.manager from employees e cross join departments d;
- inner join:
select e.emp_name, e.salary, e.depertment, d.manager from employees e join depertments d on e.depertment = d.depertment;
- outer join:
select e.emp_name, e.salary, e.department, d.manager from empolyees e left join departments d on e.department = d.department;
- cross join:
-
子查询:
- 正常类型:
select name, total_amount from customers where customer_id in (select distinct customer_id from orders where total_amount > 200);
- exists:
select name, total_amount from customers where exists (select 1 from orders where order.customers_id = customers.customer_id);
- 正常类型:
-
组合查询:
select name, age, department from table1 union select name, age, department from table2;
两种常见的组合查询操作:UNION 和 UNION ALL。
- UNION 操作:它用于将两个或多个查询的结果集合并, 并去除重复的行 。即如果两个查询的结果有相同的行,则只保留一行。
- UNION ALL 操作:它也用于将两个或多个查询的结果集合并, 但不去除重复的行 。即如果两个查询的结果有相同的行,则全部保留。
-
开窗函数:
- sum over:
select order_id, customers_id, order_date, total_amount, sum(total_amount) over (partition by customer_id) as customer_total_amount from orders;
- sum over order by:
select order_id, customer_id, order_date, total_amount, sum(total_amount) over (partition by customer_id order by order_date asc) as cumulative_total_amount from orders;
- rank:
rank() over (partition by 列名1, 列名2, ...order by 列名3 [asc|desc], 列名4 [asc|desc], ...) as rank_column
- row_number:
row_number() over (partition by column1, column2, ... order by column3 [asc|desc], column4 [asc|desc], ...) as row_number_column
- lag/lead:
select student_id, exam_date, score, lag(score, 1, NULL) over (partition by student_id order by exam_date asc) as previous_score, lead(score, 1, NULL) over (partition by student_id order by exam_date asc) as next_score from scores;
- sum over:
插入
insert into:
insert into table_name values (value1, value2, ...);
insert into table_name (column1, column2, ...) values (value1, value2, ...)
更新
update:update table_name set column1 = value1, column2 = value2, ... where condition;
删除
delete:delete from table_name where condition;
去重
去重:select distinct class_id from students;
除了按照单字段去重外,
distinct
关键字还支持根据多个字段的组合来进行去重操作,确保多个字段的组合是唯一的。示例语法如下:
distinct 字段1, 字段2, 字段3, ...
排序
排序:select name, age from students order by age asc;
在 SQL 中,我们可以使用
order by
关键字来实现排序操作。order by
后面跟上需要排序的字段,可以选择升序(asc)或降序(desc)排列。在排序的基础上,我们还可以根据多个字段的值进行排序。当第一个字段的值相同时,再按照第二个字段的值进行排序,以此类推。
示例语法如下:
order by 字段1 [升序/降序], 字段2 [升序/降序], ...;
截断和偏移
截断和偏移:select task_name, due_date from tasks limit 2;
select task_name, due_date from tasks limit 2, 2;
条件分支
条件分支:select name, case when (name = '小明') then '会' else '不会' end as can_rap from students;
条件分支
case when
是 SQL 中用于根据条件进行分支处理的语法。它类似于其他编程语言中的 if else 条件判断语句,允许我们根据不同的条件选择不同的结果返回。使用
case when
可以在查询结果中根据特定的条件动态生成新的列或对现有的列进行转换。
case when
支持同时指定多个分支,示例语法如下:case when (条件1) then 结果1 when (条件2) then 结果2 ... else 其他结果 end as 字段名
函数
-
时间函数:
select date() as current_date;
select datetime() as current_datetime;
select time() as current_time;
还有很多时间函数,比如计算两个日期的相差天数、获取当前日期对应的毫秒数等,实际运用时自行查阅即可,此处不做赘述。
-
字符串处理:
- 转换大小写:
select name, upper(name) as upper_name from employees;
- 计算字符串长度:
select name, length(name) as name_length from employees;
还有很多字符串函数,比如搜索和替换子字符串等,实际运用时自行查阅即可,此处不做赘述。
- 转换大小写:
-
聚合函数:
select count(distinct customer_id) as customer_num from orders;
常见的聚合函数包括:
- COUNT:计算指定列的行数或非空值的数量。
- SUM:计算指定列的数值之和。
- AVG:计算指定列的数值平均值。
- MAX:找出指定列的最大值。
- MIN:找出指定列的最小值。
分组聚合
- 单字段分组:
select customer_id, count(order_id) as order_num from orders group by customer_id;
- 多字段分组:
select customer_id, product_id, sum(amount) as total_amount from orders group by customer_id, product_id;
having
子句:select customer_id, count(order_id) as order_num from orders group by customer_id having count(order_id) > 1;