学习目标:
提示:SQL语法规则
-
SQL语句总是以关键字开始,如SELECT、INSERT、UPDATE、DELETE、DROP、CREATE。
-
SQL语句以分号结尾。
-
SQL不区分大小写,意味着update与UPDATE相同。
-
一周掌握 Java 入门知识
数据库表:
数据库通常包含一个或多个表。每个表都用一个名称标识(例如,“Customers"或"Orders”)。该表包含带有数据(行)的记录。
在本教程中,我们将使用著名的Northwind示例数据库(包括MSAccess和MSSQLServer)。
下面是选自 “Customers” 表的数据:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country | Age | Salary |
---|---|---|---|---|---|---|---|---|
1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany | 21 | 125 |
2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico | 42 | 1500 |
3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico | 31 | 2000 |
4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK | 17 | 700 |
5 | Berglunds snabbköp | Christina Berglund | Berguvsvägen 8 | Luleå | S-958 22 | Sweden | 63 | 5600 |
上面的表包含五条记录(每一条对应一个客户)和九个列(CustomerID、CustomerName、ContactName、Address、City、PostalCode 和 Country,Age,Salary )。
- 基本语法:SELECT和FROM
SELECT column_name(s) FROM table_name
实例:
从 "Customers" 表中选取 "City" 列
select City from Customer;
从 "Customers" 表中选取 "CustomerName" 和 "City" 列
select CustomerName,City from Customer;
从 "Customers" 表中选取所有列
select * from Customer;
- 基本语法:DISTINCT 去除重复值
SELECT DISTINCT column_name(s)
FROM table_name;
实例:
从 "Customers" 表筛选出所有County且去重
select distinct Country from Customer;
- 基本语法:WHERE 语法 ,用于提取满足指定标准的记录
SELECT column_name(s)
FROM table_name
WHERE condition;
实例:
从"Customers"表中选择其国家为"Mexico"的所有客户
select Country from Customer
where Country=‘Mexico’;
-
如果是数值字段,则不要使用引号
从"Customers"表中选择CustomerID = 1的所有客户
。
select CustomerID from Customer
where CustomerID = 1; -
基本语法:SQL AND & OR 运算符,用于提取满足多个指定标准的记录
-
And语法:
SELECT column_name(s)
FROM table_name
WHERE condition1 AND condition2 AND condition3 …; -
Or 语法:
SELECT column_name(s)
FROM table_name
WHERE condition1 OR condition2 OR condition3 …; -
Not 语法:
SELECT column_name(s)
FROM table_name
WHERE NOT condition;
实例:
从 "Customers" 表中选择其国家为 "Germany" 、其城市为"Berlin" 的所有客户
。
select Country,City from Customer
where Country = ‘Germany’ and City =‘Berlin’;
从 "Customers" 表中选择城市为“Berlin”或“Germany”的“Customers”的所有字段
。
select Country,City from Customer
where Country = ‘Germany’ or City =‘Berlin’;
从 "Customers" 表中选择国家不是 "Germany"的"Customers"的所有字段
。
select Country from Customer
where not Country = ‘Germany’;
- SQL ORDER BY 关键字,ORDER BY 关键字用于按升序或降序对结果集进行排序。ORDER BY 关键字默认情况下按升序排序记录。如果需要按降序对记录进行排序,可以使用DESC关键字。
SELECT column_name(s)
FROM table_name
ORDER BY column_name(s) ASC|DESC;
从"Customers" 表中选择所有客户,按 "Country" 升序排列,并按 "CustomerName" 列降序排列
。
select * from Customer
order by Country asc,CustomerName desc;
- SQL INSERT INTO 语法,用于向表中插入新的数据行。
INSERT INTO 语句可以用两种形式编写。 - 第一个表单没有指定要插入数据的列的名称,只提供要插入的值,即可添加一行新的数据:
INSERT INTO table_name (column1, column2, column3, …)
VALUES (value1, value2, value3, …); - 第二种,如果要为表中的所有列添加值,则不需要在SQL查询中指定列名称。但是,请确保值的顺序与表中的列顺序相同。INSERT INTO语法如下所示:
INSERT INTO table_name
VALUES (value1, value2, value3, …);
在"Customers"表中插入一个新顾客的信息,('Cardinal','Tom B. Erichsen','Skagen 21','Stavanger','4006','Norway')
insert into Customer(CustomerName, ContactName, Address, City, PostalCode, Country)
value(‘Cardinal’,‘Tom B. Erichsen’,‘Skagen 21’,‘Stavanger’,‘4006’,‘Norway’);
- SQL UPDATE 语句,用于更新表中已存在的记录。
UPDATE table_name
SET column1 = value1, column2 = value2, …
WHERE condition;
把第一个客户(CustomerID = 1),ContactName更新为Alfred Schmidt和“City更新为Frankfurt”
update Customer
set ContactName=‘Alfred Schmidt’,City=‘Frankfurt’
where CustomerID =1;
把国家/地区为"Mexico"的所有记录的联系人姓名更新为“Juan”
update Customer
set CustomerName=‘Juan’
where Country=‘Mexico’;
- SQL DELETE 语句,用于删除表中现有记录
DELETE FROM table_name
WHERE condition;
从"Customers" 表中删除客户“Alfreds Futterkiste”
delete from Customer
where CustomerName=‘Alfreds Futterkiste’;
- SQL LIKE 语法,用于搜索列中的指定模式,有两个通配符与LIKE运算符一起使用:
% - 百分号表示零个,一个或多个字符
_ - 下划线表示单个字符
ELECT column1, column2, …
FROM table_name
WHERE columnN LIKE pattern;
LIKE 运算符 | 描述 |
---|---|
WHERE CustomerName LIKE ‘a%’ | 查找以“a”开头的任何值 |
WHERE CustomerName LIKE ‘%a’ | 查找以“a”结尾的任何值 |
WHERE CustomerName LIKE ‘%or%’ | 在任何位置查找任何具有“or”的值 |
WHERE CustomerName LIKE ‘_r%’ | 在第二个位置查找任何具有“r”的值 |
WHERE CustomerName LIKE ‘a_%_%’ | 查找以“a”开头且长度至少为3个字符的值 |
WHERE ContactName LIKE ‘a%o’ | 找到以"a"开头,以"o"结尾的值 |
选择以“a”开头的CustomerName的所有客户
select CustomerName
from Customer
where CustomerName like ‘a%’
- SQL BETWEEN 运算符,选取介于两个值之间的数据范围内的值
SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;
筛选年龄在20到50之间顾客信息
select Age
from Customer
where Age between 20 and 50;
- SQL 子查询
子查询(Sub Query)或者说内查询(Inner Query),也可以称作嵌套查询(Nested Query),是一种嵌套在其他 SQL 查询的 WHERE 子句中的查询。子查询用于为主查询返回其所需数据,或者对检索数据进行进一步的限制。
使用子查询必须遵循以下几个规则: - 子查询必须括在圆括号中
- 子查询的 SELECT 子句中只能有一个列,除非主查询中有多个列,用于与子查询选中的列相比较
- 子查询不能使用 ORDER BY,不过主查询可以。在子查询中,GROUP BY 可以起到同 ORDER BY 相同的作用
- 返回多行数据的子查询只能同多值操作符一起使用,比如 IN 操作符
- SELECT 列表中不能包含任何对 BLOB、ARRAY、CLOB 或者 NCLOB 类型值的引用。
- 子查询不能直接用在聚合函数中。
- BETWEEN 操作符不能同子查询一起使用,但是 BETWEEN 操作符可以用在子查询中
SELECT column_name [, column_name ]
FROM table1 [, table2 ]
WHERE column_name OPERATOR
(SELECT column_name [, column_name ]
FROM table1 [, table2 ]
[WHERE])
查询和Antonio Moreno Taquería 顾客同一个城市/地区的其他人的年纪
select Age
from Customer
where Country =
(select Country
from Customer
where CustomerName=‘Antonio Moreno Taquería’ );
将 CUSTOMERS 表中所有 AGE 大于或者等于 27 的客户的 Salary 字段都变为了原来的 0.25 倍
Update Customer
set Salary=Salary *0.25
where Age in(
select Age
from Customer
where Age> = 27);
- SQL Group By,通常用于配合聚合函数(如 COUNT()、MAX() 等),根据一个或多个列对结果集进行分组,HAVING 子句的作用:筛选满足条件的组,即在分组后过滤数据,条件中经常包含聚组函数,使用 HAVING 条件过滤出特定的组。
HAVING 子句使你能够指定过滤条件,从而控制查询结果中哪些组可以出现在最终结果里面。
WHERE 子句对被选择的列施加条件,而 HAVING 子句则对 GROUP BY 子句所产生的组施加条件。
SELECT column1, column2
FROM table1, table2
WHERE [ conditions ]
GROUP BY column1, column2
HAVING [ conditions ]
ORDER BY column1, column2
查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
SELECT Student.StudentID, Student.Name,r.sc – 第二步进行Student表和新表r进行拼接
FROM Student
JOIN
(SELECT StudentID,AVG(score) as sc – 第一步,先查询平均成绩>=60的StudentID
FROM Score
GROUP BY StudentID
HAVING AVG(score)>=60 )as r
WHERE Student.StudentID = r.StudentID;
相关参考
- Navicat的建表:https://zhuanlan.zhihu.com/p/386161906
- 创建的时候没有选择字符编码,导致输入中文的时候出现报错
https://blog.51cto.com/vmuu/4781365 - 多表联合查询 join 的详细解说:https://zhuanlan.zhihu.com/p/68136613
- Group by 的详细解说:https://www.cnblogs.com/rainman/archive/2013/05/01/3053703.html
- 经典50题参考1:https://cloud.tencent.com/developer/article/2055149
- 经典50题参考2:https://zhuanlan.zhihu.com/p/72223558
学习产出:
百度网盘:
链接:https://pan.baidu.com/s/18MrdbNkURXOfM1XolyNRZw?pwd=Cent
提取码:Cent