SQL语句的类型
DDL(Data Definition Language)数据定义语言 DML(Data Manipulation Language)数据操作语言 DQL(Data Query Language)数据查询语言 DCL(Data Control Language)数据控制语言
MySQL逻辑表达
-
逻辑与(AND):用于将两个条件组合起来,要求它们同时成立。在 MySQL 中,逻辑与可以用
AND
关键字或&&
符号表示。SELECT * FROM table_name WHERE condition1 AND condition2; SELECT * FROM table_name WHERE condition1 && condition2;
-
逻辑或(OR):用于将两个条件组合起来,只要其中一个条件成立就返回结果。在 MySQL 中,逻辑或可以用
OR
关键字或||
符号表示。SELECT * FROM table_name WHERE condition1 OR condition2; SELECT * FROM table_name WHERE condition1 || condition2;
-
逻辑非(NOT):用于对条件进行否定,即取反操作。在 MySQL 中,逻辑非可以用
NOT
关键字或!
符号表示。SELECT * FROM table_name WHERE NOT condition; SELECT * FROM table_name WHERE !condition;
-
逻辑异或(XOR):在 MySQL 中也支持逻辑异或运算,使用
XOR
关键字。当两个条件中有且仅有一个条件为真时,返回真;SELECT * FROM table_name WHERE condition1 XOR condition2;
这些逻辑运算符可以结合使用,以构建复杂的逻辑条件来过滤数据或进行判断。
DDL
DDL(Data Definition Language)数据定义语言
操作数据库
-- 创建库 create database 库名; #库名别和sql语句重复不然后面会出错 -- 创建库时判断库是否存在,不存在则创建 create database if not exists 库名; -- 查看所有数据库 show databases; -- 使用指定数据库 use 库名; -- 查看当前指定数据库包含的数据表 show tables; -- 查看数据库的结构定义信息 show create database 库名; -- 删除数据库 drop database 库名; -- 修改数据库的字符集为utf8 alter database 库名 character set utf8;
操作数据表
-- 创建表 create table 表名( 字段1 类型1 属性 属性, 字段2 类型2 属性 属性, 字段3 类型3 属性 属性, ........... -- 查看表结构 desc 表名; -- 查看创建表的SQL语句 show create table 表名; -- 修改表名 alter table 表名 rename to 新的表名; rename table 表名 to 新的表名;s -- 添加一个新的字段 alter table 表名 add 字段 字段类型 属性; -- 修改字段名 alter table 表名 rename column 字段名 to 新的字段名; -- 修改字段类型(注意类型修改前后数据是否兼容) alter table 表名 modify column 字段名 新的字段类型; -- 删除一个字段 alter table 表名 drop 字段名; -- 删除表 drop table 表名; -- 删除表时判断表是否存在,若存在则删除 drop table if exists 表名;
DML
DML(Data Manipulation Language)数据操作语言
insert into(插入数据)
-- 有多少个字段,就要写多少个值,且是一一对应的 -- 全字段插入数据 insert into 表名 values(值1,值2,值3...值n); -- 部分字段插入数据 insert into 表名(字段1,字段2...字段n) values(值1,值2...值n);
delete / truncate 删除数据
-- 删除表中所有数据 delete from 表名; -- drop table 表名; 是连表一起删除 -- 删除表中指定的数据 delete from 表名 where 字段 = 值; -- 删除表中所有数据(先删除整张表,然后创建一张一样的空表,此方法更高效) truncate table 表名;
updata 修改数据
-- 无限制条件的修改,会修改整张表 update 表名 set 字段 = 值; -- 有限制条件的修改,只修改特定记录 update 表名 set 字段 = 值 where 条件(字段 = 值);
SQL
DQL(Data Query Language)数据查询语言
无条件查询
-- 查询表中所有数据 select *from 表名;
查询在...到...之间(between and / && / and)
-- 查询users表中年龄在18~25岁之间的记录 -- 方式1 between..and.. select *from users where age between 18 and 25; -- 方式2 && select *from users where age>=18 && age<=25; -- 方式3 and select *from users where age>=18 and age<=25;
指定条件查询
-- 查询users表中年龄为18,20,25岁的记录 -- 方式1 or select *from users where age=18 or age=20 or age=25; -- 方式2 in select *from users where age in(18,20,25); -- 查询users表中年龄为23,性别为女,名字为小楠的记录 select *from users where age=23 and gender='女' and name='小楠';
查询NULL值
-- 查询id为空的 select *from users where id is null -- 查询id不为空的 select *from users where id is not null
模糊查询(like)
-- _:单个任意字符 -- %:0个/多个任意字符 -- 查询users表中姓名第一个字为李的记录 select *from users where name like '李%'; -- 查询users表中姓名第二个字为李的记录 select *from users where name like '_李%'; -- 查询users表中姓名含有李字的记录 select *from users where name like '%李%'; -- 查询users表中姓名是两个字的记录 select *from users where name like '__'; SELECT DISTINCT name FROM users WHERE LENGTH(name) = 2;
去除重复记录查询(distinct)
-- 查询users表中所在城市不相同的记录 -- select distinct 字段 from 表名; -- 去掉city 重复的部分 select distinct city from users; -- users 表从不重复的name 中查询name 为两个字的 select distinct name from users where name like '__'; SELECT DISTINCT name FROM users WHERE LENGTH(name) = 2;
排序查询(order by)
-- 查询users表中记录,并以年龄升序排序 select *from users order by age asc; -- asc默认升序 select *from test1 where age > 18 order by id; -- 查询users表中记录,并以年龄降序排序 select *from users order by age desc; -- desc降序 -- 查询users表中记录,并体育成绩降序,年龄升序 select *from users order by PE desc,age asc; select *from users order by PE desc,age desc;
聚合函数
-
计算和(sum)
-- 将求和后输出的字段以sumvalue展示 -- 默认以sum(字段)展示 -- 下面一样 select sum(字段) as sumvalue from 表名; select sum(id) as ID,count(id) ID_count from users;
-
计算最大值(max)
select max(字段) as maxvalue from 表名;
-
计算最小值(min)
select min(字段) as minvalue from 表名;
-
计算平均值(avg)
select avg(字段) as avgvalue from 表名;
-
计算个数(count)
select count(字段) as totalcount from 表名;
分组查询(group by)
-- 只显示one column 分组后ave(PE)的值 select avg(PE) from users group by gender; -- 查询users表中的记录,按照性别分组,查询男,女的体育成绩平均分 select gender,avg(PE) from users group by gender; -- 和上一句差不多 只不过将显示gender的字段改为 unique_GD -- avg(PE) 同理 改为 avg(pe) select gender as unique_GD,avg(PE) as avg(pe) from users group by gender -- 查询users表中的记录,按照性别分组,分别查询男、女的体育成绩平均分,人数 select gender, avg(PE),count(id) from users group by gender; -- 查询users表中的记录, 按照性别分组,分别查询男、女的体育成绩平均分,人数 要求:分数低于60分的人,不参与分组 select gender, avg(PE),count(id) from users where PE > 60 group by gender; -- 查询users表中的记录,按照性别分组,分别查询男、女的体育成绩平均分,人数 要求:分数低于60分的人,不参与分组,分组之后,人数要大于2个人 select gender,avg(PE),count(id) from users where PE > 60 group by gender having count(id)>2;
分页查询(limit)
-- 查询users表中满足id < 100的前10行条记录 select *from users where id < 100 limit 10; -- 查询users表中第2~11条记录 (从第2条记录开始累加10条记录) select *from users limit 1,10; -- 查询users表中第5~17条记录 (从第5条记录开始累加13条记录) select *from users limit 4,13;
**内连接查询
如果查询数据的来源来自多张表,则必须对这些表进行连接查询,连接是把不同表的记录连到一起的最普遍的方法,通过连接查询可将多个表作为一个表进行处理,连接查询分为内连接和外连接。
-
字段的顺序会影响查询后输出的顺序
-
如果用 * 代替 那么会按后面 from 的顺序输出
-- 语法1 (隐式内连接) select 字段1,字段2... from 表1,表2... where 过滤条件; -- test1 的字段全都显示出来,test2只显示name字段为了区分这里将name 改为 test2.name; -- 条件是 test1.id = test2.id; select test1.*,test2.name as test2.name from test1,test2 where test1.id = test2.id; -- 语法2 (显式内连接) select 字段1,字段2... from 表1 inner join 表2 ... on 过滤条件;
**外连接查询
-
左外连接:是表1和表2的交集再并上表1的其他数据
-
右外连接:是表1和表2的交集再并上表2的其他数据
-
那个方向连接就以那个方向为主,无论查询结果如何都会显示整个表
-
字段的顺序会影响查询后输出的顺序
-
如果用 * 代替 那么会按后面 from 的顺序输出
-- 左外连接 select 字段1,字段2.. from 表1 left (outer) join 表2 on 过滤条件; -- () 可以省略 -- 右外连接 select 字段1,字段2.. from 表1 right (outer) join 表2 on 过滤条件;
DCL
DCL(Data Control Language)数据控制语言
管理用户
-- 添加用户 create user '用户名'@'主机名' identified by '密码'; -- 删除用户 drop user '用户名'@'主机名'; -- 查询所有用户 SELECT user, host FROM mysql.user; -- 查询所有用户 本且显示所有权限 SELECT CONCAT('SHOW GRANTS FOR ''', user, '''@''', host, ''';') AS sql_statements FROM mysql.user;
权限管理
-- 查询权限 show grants for '用户名'@'主机名'; -- 授予权限 -- 语法 grant 权限列表 on 数据库名.表名 to '用户名'@'主机名'; -- 授予faker用户所有权限,在任意数据库任意表上 grant all on *.* to 'faker'@'localhost'; -- 撤销权限 -- 语法 revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名'; -- 撤销faker用户对test数据库中city数据表的权限 revoke update on test.city from 'faker'@'localhost';
权限列表
-
SELECT: 允许用户查询(检索)数据库中的数据。
-
INSERT: 允许用户将新数据插入到数据库表中。
-
UPDATE: 允许用户修改数据库表中已有的数据。
-
DELETE: 允许用户从数据库表中删除数据。
-
CREATE: 允许用户创建新的数据库和表。
-
DROP: 允许用户删除数据库和表。
-
ALTER: 允许用户修改数据库表结构。
-
GRANT OPTION: 允许用户将自己拥有的权限授予给其他用户。
-
ALL PRIVILEGES: 给予用户所有可用的权限。
-
CREATE USER: 允许用户创建新用户账号。
-
RELOAD: 允许用户重新加载访问控制表或刷新服务器缓存等。
-
SHOW DATABASES: 允许用户查看数据库列表。
-
SHUTDOWN: 允许用户关闭数据库服务器。
-
PROCESS: 允许用户查看正在运行的进程。
-
FILE: 允许用户在服务器上读写文件。
-
EXECUTE: 允许用户执行存储过程。
-
INDEX: 允许用户创建或删除索引。