目录
一、插入记录
创建Users表
CREATE TABLE Users(
id INT PRIMARY KEY AUTO_INCREMENT,
UserNmae VARCHAR(20) NOT NULL,
age TINYINT NOT NULL,
sex ENUM('男','女','保密') DEFAULT '保密',
caid VARCHAR(18) NOT NULL UNIQUE
);
1、不指定字段名
语法格式:INSERT [INTO] 表名 VALUES(值1,......)
INSERT INTO Users VALUES(NULL,'root',20,'男','500111111111111111');
2、指定字段名
语法格式:INSERT [INTO] 表名(字段1,......) VALUES(值1,......)
INSERT INTO Users(age,UserNmae,caid) VALUES(18,'admin','500222222222222222');
二、更新记录
语法格式:UPDATE 表名 SET 字段名称=值,......[WHERE 条件] [ORDER BY 字段名] [LIMIT 限制条数]
UPDATE Users SET UserNmae='administrator' WHERE UserNmae='root';
三、删除记录
语法格式:DELETE FROM 表名 [WHERE 条件] [ORDER BY 字段名] [LIMIT 限制条数]
DELETE FROM Users WHERE id=1;
彻底清空数据表:TRUNCATE [TABLE] 表名
TRUNCATE TABLE Users;
四、查询记录
1、基本查询
查询表中所有记录:
语法格式:SELECT * FROM 表名,*号代表所有字段
SELECT * FROM Users;
根据字段名进行查询
语法格式:SELECT 字段名1,...... FROM 表名
SELECT UserNmae,sex FROM Users;
多表查询
如果涉及到多数据库、多表查询时,请带上数据库名和表名
SELECT Users.UserNmae,Users.age FROM user.Users;
设置别名
通过设置表名别名,可以简化输入表名。通过设置字段别名,可以自定义显示查询字段名。
SELECT a.UserNmae AS '姓名',a.age AS '年龄' FROM Users AS a;
2、条件查询
查询条件 | 符号 |
---|---|
比较 | =、<、<=、>、>=、!=、<>、!>、!<、<=> |
指定范围 | BETWEEN AND、NOT BETWEEN AND |
指定集合 | IN、NOT IN |
匹配字符 | LIKE、NOT LIKE |
是否为控制 | IS NULL、IS NOT NULL |
多个查询条件 | AND、OR |
比较查询
SELECT * FROM Users WHERE id>3;
SELECT * FROM Users WHERE id=1;
SELECT * FROM Users WHERE id<>1;
范围查询
使用BETWEEN AND指定查询范围
SELECT * FROM users where id BETWEEN 1 AND 3;
SELECT * FROM users WHERE id NOT BETWEEN 1 AND 2;
使用IN指定集合范围查询
SELECT * FROM users WHERE id IN(1,3);
SELECT * FROM users WHERE id NOT IN(1,3);
模糊查询
%号:表示0个或一个或多个任意字符
_号:表示1个任意字符
//查询用户名以t字符结尾的
SELECT * FROM users WHERE UserNmae LIKE '%t';
//查看用户名包含d字符的
SELECT * FROM users WHERE UserNmae LIKE '%d%';
//查询用户名为四位的
SELECT * FROM users WHERE UserNmae LIKE '____';
逻辑查询
使用AND、OR逻辑运算符进行查询
//查询性别为男并且年龄为20
SELECT * FROM users WHERE sex='男' AND age=20;
//查询身份证号码以500开头的或者是年龄大于20的
SELECT * FROM users WHERE Caid LIKE '500%' OR age>20;
//查询身份证号码以500开头的并且年龄大于20的
SELECT * FROM users WHERE Caid LIKE '500%' AND age>20;
分组查询
使用GROUP BY 进行分组查询,查询结果只会显示该组的第一行记录。
//按照性别进行分组查询,可看到查询结果为3行性别不同的记录
SELECT * FROM users GROUP BY sex;
也可以多字段进行分组查询
//先按照proid进行分组,在按照性别进行分组
SELECT * FROM users GROUP BY proid,sex;
函数名 | 作用 |
---|---|
GROUP_CONCAT() | 得到分组详情 |
COUNT() | 统计记录总数 |
MAX() | 统计记录最大值 |
MIX() | 统计记录最小值 |
AVG() | 平均值 |
SUM() | 求和 |
WITH ROLLUP | 分组后进行再次聚合统计 |
使用GROUP_CONCAT()函数得到分组详情信息
//查询所有用户名
SELECT id,GROUP_CONCAT(username) FROM users;
//按照性别进行分组,然后显示各分组里的用户名信息
SELECT id,GROUP_CONCAT(username) FROM users GROUP BY sex;
//按照性别进行分组,然后显示各分组里的用户名信息、密码信息
SELECT id,GROUP_CONCAT(username),GROUP_CONCAT(password) FROM users GROUP BY sex;
使用聚合函数
//得到表中总记录数
SELECT COUNT(*) AS '总数' FROM users;
//对性别进行分组查询,显示各组的用户名信息,并统计各组的个数
SELECT ID,GROUP_CONCAT(username) AS '用户名',COUNT(*) AS '个数' FROM users GROUP BY sex;
//对性别进行分组,并得到各组里年龄最大的用户信息
SELECT id,GROUP_CONCAT(username),MAX(age) FROM users GROUP BY sex;
使用WITH ROLLUP进行分组后再次统计
SELECT id,GROUP_CONCAT(username),MAX(age) FROM users GROUP BY sex WITH ROLLUP;
如图所示,使用WITH ROLLUP可以对分组后的信息再次统计。
对分组查询再次筛选
使用HAVING语句可以对分组查询进行二次筛选,HAVING只能用于分组查询中
//对性别进行分组查询,显示各分组用户名信息、最大年龄数、年龄总和
SELECT GROUP_CONCAT(username),MAX(age),SUM(age) AS sum FROM users GROUP BY sex;
//对性别进行分组查询,显示各分组用户名信息、最大年龄数、年龄总和,并且年龄总合大于50的
SELECT GROUP_CONCAT(username),MAX(age),SUM(age) AS sum FROM users GROUP BY sex HAVING sum>50;
对查询结果进行排序 ORDER BY
//对查询结果按照年龄进行排序
SELECT * FROM users ORDER BY age;
//或者通过数字也可以表示字段
SELECT * FROM users ORDER BY 5
小技巧:ORDER BY 和 GROUP BY都可以用于猜字段数
控制显示条数 LIMIT
//显示1条查询结果
SELECT * FROM users LIMIT 1;
//显示3条查询结果
SELECT * FROM users LIMIT 3;
//LIMIT 偏移量,条数
//显示第一条结果
SELECT * FROM users LIMIT 0,1;
//显示第二条结果
SELECT * FROM users LIMIT 1,1;
3、内连接查询
连接查询是将两个或两个以上的表按某个条件连接起来,从中选取需要的数据。
当不同的表中存在相同的意义的字段时,可以通过该字段连接这几个表。
使用JOIN ON进行内连接查询
demo:users表中的proid对应着proid表中的id
//使用where条件进行多表连接查询
SELECT users.username,users.sex,users.age,proid.proname FROM users,proid WHERE users.proid=proid.id;
//使用JOIN ON进行内连接查询
SELECT users.username,users.sex,users.age,proid.proname FROM users JOIN proid ON users.proid=proid.id;
以上两条查询语句结果相同,那为什么还要用内连接查询呢,因为WHERE条件只能使用一次,使用JOIN ON内连接查询后还可以用WHERE进行再次筛选。
SELECT users.username,users.sex,users.age,proid.proname FROM users JOIN proid ON users.proid=proid.id WHERE sex='男';
4、外连接查询
左外连接:LEFT JOIN 显示左表的全部记录及右表符合连接条件的记录
右外连接:RIGHT JOIN 显示右表的全部记录及左表符合连接条件的记录
demo:在ussers表中插入一条记录,其中proid=10,这个值在proid表中不存在
当用内连接查询时,是看不到proid=10的那条记录,因为不满足条件users.proid=proid.id
但用外连接进行查询时,可以看到,能查询到proid=10那条记录,其中不满足的条件的字段用NULL表示
SELECT users.username,users.sex,users.age,proid.proname FROM users LEFT JOIN proid ON users.proid=proid.id;
5、联合查询
将多个查询结果合并在一起。两个表对应的列数和数据类型必须相同或兼容。
UNION:去掉重复记录,在合并
UNION ALL:合并
SELECT username FROM users UNION SELECT proname FROM proid;
6、子查询
子查询是将一个查询语句嵌套在另一个查询语句中,内层查询语句的查询结果可以作为外层查询语句提供条件。
子查询支持 IN、比较运算符(>、<、>=、等等)、EXISTS
SELECT * FROM users WHERE proid IN(SELECT id FROM proid);
SELECT * FROM users WHERE proid > (SELECT id FROM proid WHERE id=1);
7、正则表达式查询
通过REGEXP '匹配方式'
SELECT * FROM users WHERE username REGEXP '^r';
SELECT * FROM users WHERE username REGEXP 't$';
SELECT * FROM users WHERE username REGEXP 'r.*';
8、运算符
算数运算符
算数运算符用于各类数值运算,包括+、-、*、/、%
比较运算符
比较运算符用于比较运算,包括>、<、=、>=、<=、!=以及in、between and、is null、greatest、least、like、regexp等。
逻辑运算符
逻辑运算符的求值结果为true和false,包括not/!、and/&&、or/||、xor
位运算符
位操作运算符运算按二进制位进行运算,包括&、|、~、^、<<、>>