3.4.1插入记录
1.关键字说明
INSERT INTO 表名 (字段名1,字段名2,...) VALUES(值1,值2 ... );
注意:
除数值类型外,其他字段类型的值必须加引号;
如果要插入空值,可以不写字段,或者插入null;
3.4.1.1插入全部字段
所有字段名写出来
INSERT INTO 表名(字段名1,字段名2,字段名3...) VALUES (值1,值2,值3);
不写字段名
INSERT INTO 表名 VALUES (值1,值2,值3);
3.4.1.2插入部分数据
INSERT INTO 表名(字段名1,字段名2...) VALUES (值1,值2...);
没有添加数据的字段会使用NULL;
3.4.1.3蠕虫复制
INSERT INTO 表名1 SELECT * FROM 表名2;
将表名2中的数据复制到表名2中
将student中的name,age字段数据父子到student2表中
INSERT INTO student(name,age) SELECT name,age FROM student;
SELECT 语句用于从表中选取数据(列)。
结果被存储在一个结果表中(称为结果集)。
SELECT 列名称 FROM 表名称 SELECT * FROM 表名称
如需获取名为 "LastName" 和 "FirstName" 的列的内容(从名为 "Persons" 的数据库表),请使用类似这样的 SELECT 语句:
SELECT LastName,FirstName FROM Persons
关键词 DISTINCT 用于返回唯一不同的值。
SELECT DISTINCT 列名称 FROM 表名称
如果要从 "Company" 列中选取所有的值,我们需要使用 SELECT 语句:
SELECT Company FROM Orders
如需从 Company" 列中仅选取唯一不同的值,我们需要使用 SELECT DISTINCT 语句:
SELECT DISTINCT Company FROM Orders
WHERE 子句用于规定选择的标准。
如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句。
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
操作符
描述
=
等于
<>
不等于
>
大于
<
小于
>=
大于等于
<=
小于等于
BETWEEN
在某个范围内
LIKE
搜索某种模式
注释:在某些版本的 SQL 中,操作符 <> 可以写为 !=。
如果只希望选取居住在城市 "Beijing" 中的人,我们需要向 SELECT 语句添加 WHERE 子句:
SELECT * FROM Persons WHERE City='Beijing'
请注意,我们在例子中的条件值周围使用的是单引号。
SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号
in关键字
SELECT 字段名 FROM 表名 WHERE 字段 in(数据1,数据2...); SELECT 字段名 FROM 表名 WHERE 字段 not in(数据1,数据2...);
in里面的每个数据都会作为一次操作,只要满足条件的就会显示(或);
文本值
这是正确的: SELECT * FROM Persons WHERE FirstName='Bush' 这是错误的: SELECT * FROM Persons WHERE FirstName=Bush
数值:
这是正确的: SELECT * FROM Persons WHERE Year>1965 这是错误的: SELECT * FROM Persons WHERE Year>'1965'
AND 和 OR 运算符用于基于一个以上的条件对记录进行过滤。
AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。
如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。
使用 AND 来显示所有姓为 "Carter" 并且名为 "Thomas" 的人:
SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter'
使用 OR 来显示所有姓为 "Carter" 或者名为 "Thomas" 的人:
SELECT * FROM Persons WHERE firstname='Thomas' OR lastname='Carter'
我们也可以把 AND 和 OR 结合起来(使用圆括号来组成复杂的表达式):
SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William') AND LastName='Carter'
ORDER BY 语句用于对结果集进行排序。
ORDER BY 语句用于根据指定的列对结果集进行排序。
ORDER BY 语句默认按照升序对记录进行排序。
按照降序对记录进行排序,可以使用 DESC 关键字。
单列排序
SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名 [ASC|DESC];升序|降序
以字母顺序显示公司名称:
SELECT Company, OrderNumber FROM Orders ORDER BY Company
以逆字母顺序显示公司名称:
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC
结果:
Company
OrderNumber
W3School
2356
W3School
6953
IBM
3532
Apple
4698
注意:在以上的结果中有两个相等的公司名称 (W3School)。只有这一次,在第一列中有相同的值时,第二列是以升序排列的。如果第一列中有些值为 nulls 时,情况也是这样的。
组合排序
SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名1[ASC|DESC],字段名2 [ASE|DESC];
以字母顺序显示公司名称(Company),并以数字顺序显示顺序号(OrderNumber):
SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber
Company
OrderNumber
Apple
4698
IBM
3532
W3School
2356
W3School
6953
先以Company排序,Company相同的再以OrderNumber排序。
INSERT INTO 语句
INSERT INTO 语句用于向表格中插入新的行。
INSERT INTO 表名称 VALUES (值1, 值2,....)
我们也可以指定所要插入数据的列:
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')//行 INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')//列
Update 语句用于修改表中的数据。
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
更新某一行中的一个列
我们为 lastname 是 "Wilson" 的人添加 firstname:
UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson'
更新某一行中的若干列
我们会修改地址(address),并添加城市名称(city):
UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing' WHERE LastName = 'Wilson'
关键字说明
UPDATE:修改数据 SET:修改哪些字段 WHERE:指定条件
DELETE 语句用于删除表中的行。
DELETE FROM 表名称 WHERE 列名称 = 值
删除某行
"Fred Wilson" 会被删除:
DELETE FROM Person WHERE LastName = 'Wilson'
删除所有行
可以在不删除表的情况下删除所有的行。这意味着表的结构、属性和索引都是完整的:
DELETE FROM table_name 或者: DELETE * FROM table_name
truncate删除表记录
TRUNCATE TABLE 表名;
truncate与delete的区别
delete是将表中数据一条一条删除;
truncate是将整个表摧毁,重新建立一个新表,新表与原表结构相同
3.5.3.4范围
BETWEEN 值1 AND 值2;
闭区间,例 age BETWEEN AND 35 AND 70;
3.5.3.5 like
LIKE代表模糊查询
SELECT * FROM 表名 WHERE 字段名 LIKE ‘通配符字符串’;
MYSQL通配符字符串有两个:
%:表示0个或多个字符(恩一个字符)
_:表示一个字符
例:查询姓孙的英雄 SELECT * FROM hero WHERE name LIKE '孙%'; 查询姓名中包含'孙'字的英雄 SELECT * FROM hero WHERE name LIKE '%孙%'; 查询姓孙且名字有三个字的英雄 SELECT * FROM hero WHERE name LIKE '孙__';
聚合函数
纵向查询,对一列值进行计算,然后返回结果,会忽略空值;
五个聚合函数
count:统计指定列记录数,记录为NULL的不统计
sum:计算指定列的数值和,如果不是数值类型,那么计算结果为0
max:计算指定列的最大值
min:计算指定列的最小值
avg:计算指定列的平均值,如果不是数值类型,那么计算结果为0
聚合函数使用卸载select后字段名的地方
SELECT 字段名... FROM 表名; SELECT COUNT(age) FROM 表名;age这一行可能有NULL SELECT COUNT(*) FROM 表名;所有行,若这一行所有数据都为NULL则不计入,这一行也无意义
3.5.3.8分组
SELECT 字段1,字段2... FROM 表名 GROUP BY 分组字段 [HAVING 条件];
HAVING处理分组以后的条件
SELECT COUNT(*),sex FROM hero WHERE age<30 GROUP BY sex HAVING COUNT(*)>2;
查询年龄大于30岁的人,按性别分组,统计每组人数,并且只显示性别人数大于2的数据
SELECT 字段1,字段2... FROM 表名 GROUP BY 分组字段;
会返回每组的第一条,没有意义
分组一般和聚合函数一起使用
SELECT SUM(life) FROM hero GROUP BY sex;
SELECT SUM(life),sex FROM hero GROUP BY sex;
注意:但我们使用分组时,在查询时也需要将这个字段查询出来
3.5.3.9 limit语句
limit限制查询记录的条数
SELECT 字段1,字段2... [AS 别名]FROM 表名 [WHERE 子句][GROUP BY 分组字段] [HAVING 条件][LIMIT子句]];
LIMIT语法格式
LIMIT offset,length;或者LIMIT length; offset是指偏移量,跳过的记录数量,默认为0 length是指需要显示的总记录数
SELECT * FROM student3 limit 2,6;跳过前面两条,取六条
LIMIT使用场景:分页
建立视图的语法: Create view 视图名称[(字段1) (字段2) (字段3)…] AS Select 查询语句 [with check option]
参数:[with check option]可选项,防止用户对数据插入、删除、更新是操作了视图范围外的基本表的数据。
删除视图的语法:
Drop view 视图名;
建立一个视图,实验一下:
Create view vw1 as Select 学号,姓名,所属院系 From student Where 课名=’软件工程’ and 所属院系=’计算机’;
Create view vw1 as Select st.学号,st.姓名,st.所属院系 from student as st,course as co,score as sc Where co.课名=’心理学’ and sc.考试成绩>80 and st.学号=sc.学号 and co.课号=sc.课号;
SQL SELECT TOP 子句
SELECT TOP 子句用于规定要返回的记录的数目。
SELECT TOP 子句对于拥有数千条记录的大型表来说,是非常有用的。
MySQL 语法
SELECT column_name(s) FROM table_name LIMIT number;
实例
SELECT * FROM Persons LIMIT 5;