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,性别为女,名字为xx的记录
select *from users where age=23 and gender='女' and name='xx';
查询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: 允许用户创建或删除索引。