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;