mysql常用语法

操作数据库 CRUD

1.C(create)创建
// 创建数据库,先判断是否存在,不存在就创建,并制定数据库的字符集
create database if not exists 数据库名称 character set 字符集名称(一般 utf8 );
2.R(retrieve)查询
// 查看所有数据库
show databases;

// 查看某个数据库字符集
show create database 数据库名称;
3.U(update)修改
// 修改某个数据库的字符集
alter database 数据库名称 character set 字符集名称(一般 utf8 );
4.D(delete)删除
// 删除数据库,先判断是否存在,存在就删除
drop database if exists 数据库名称;
5.普通操作
// 当前数据库
select database();

// 使用数据库
use 数据库名称;

操作表

1.C(create)创建
// 常用类型如下
1.int 整数类型
2.double(5,2) 小数类型:共5位数字,小数点后保留2位
3.date 日期:年月日形式,2020-02-02
4.datetime 日期:年月日时分秒形式,2020-02-02 12:00:00
5.timestamp 时间戳:年月日时分秒形式,2020-02-02 12:00:00
6.varchar(20) 字符串类型:最多20个字符
// 创建表
create table 表名(
    列名1 数据类型1,
    列名2 数据类型2,
    ...
    列名n 数据类型n
);

// 复制表
create table 新表名 like 已存在的表名;
// 测试  
// 注意:double(5,2)共5位数字,小数点后保留2位
// 注意:insert_time timestamp 最后一项没有逗号
create table person(
  id int,
  name varchar(20),
  weight double(5,2),  
  birthday date,
  insert_time timestamp
);
2.R(retrieve)查询
// 查看所有表
show tables;

// 查看某个表结构
desc 表名;

// 查看某个表字符集
show create table表名;
3.U(update)修改
// 修改表名
alter table 表名 rename to 新表名;

// 修改表的字符集
alter table 表名 character set 字符集(utf8);

// 添加一列
alter table 表名 add 列名 数据类型;

// 修改列名称
alter table 表名 change 列名 新列名 新数据类型;

// 修改列数据类型
alter table 表名 modify 列名 新数据类型;

// 删除列
alter table 表名 drop 列名;
4.D(delete)删除
// 删除表,先判断是否存在,存在就删除
drop table if exists 表名;

增删改数据(DML)

1.添加数据
// 中括号中列名可省略,省略后values中必须全部赋值。
// 赋值时,除了数字类型,其他类型都必须使用双引号
insert into 表名[(列1,列2,...列n)] values(数据1,数据2,...数据n);
2.删除数据
// 中括号中条件可省略,注意:省略后,会逐条删除全部数据。
delete from 表名 [where 条件];

// 先删除表,然后创建一张相同的空表,删除全部数据的效率高。
truncate table 表名;
3.修改数据
// 中括号中条件可省略,注意:省略后,会逐条删除全部数据。
update 表名 set 列1 = 数据1,列2 = 数据2,列n = 数据n [where 列=值];

查数据(DQL)

查询的基本语法字段
select 字段列表
from 表名列表
where 条件列表
group by 分组列表
having 分组后的条件
order by 排序
limit 分页

// 查看表中所有数据
select * from 表名;

// 去除重复数据
select distinct 字段名 from 表名;

// 计算数字数据,ifnull表示,如果是null值默认为后面的值。
select num01, num02, ifnull(num1,0) + ifnull(num2,1) from 表名;

// 起别名, as可以省略
select num01 别名, num02 别名, ifnull(num1,0) + ifnull(num2,1) [as] 别名 from 表名;

where查询条件示例,范围取值有: > < = >= <= !=

// 各种
select * from person where age = 20;
select * from person where age >= 20;
select * from person where age != 20;

// 20到30之间
select * from person where age >= 20 && age <= 30;
select * from person where age >= 20 and age <= 30;
select * from person where age between 20 and 30;

// 等于15,20,25岁的人
select * from person where age = 15 or age = 20 or age = 25;
select * from person where age in (15,20,25);

where查询null值,是null:is null 不是null:is not null

// 判断值是否为 null 必须使用 is null 或 is not null
select * from person where age is null;
select * from person where age is not null;

// 错误写法,错误写法,错误写法,null不是值,不能 = null
select * from person where age = null;

where查询的模糊查询:like,一个占位符_ 多个占位符%

// 姓马的人
select * from person where name like "马%";

// 第三个字为马的人,两个"_"代表两个字,后面字符不限加"%"
select * from person where name like "__马%";

// 姓名是3个字的人,只需要3个下划线 
select * from person where name like "___";

// 包含马字的人
select * from person where name like "%马%";

排序查询:ASC 升序(默认),DESC降序

// 按照数学成绩排名,只有数学成绩相等时,按照英语成绩排名。
select * from student order by math ASC , english DESC;

聚合函数:将一列数据作为整体,进行纵向计算。

// count:统计数据个数,一般选择使用主键统计个数
select count(id) from student;

// max:数据中最大值
select max(math) from student;

// min:数据中最小值
select min(math) from student;

// sum:数据和
select sum(math) from student;

// avg:数据平均数
select avg(math) from student;

分组:group by

// 按照性别分组,分别查询男、女的平均分
select sex , AVG(math) COUNT(id) from student group by sex;

// 按照性别分组,分别查询男、女的平均分
// 要求1:分数大于60分才参与计算
select sex , AVG(math) from student where math > 60 group by sex;

// 按照性别分组,分别查询男、女的平均分
// 要求1:分数大于60分才参与计算
// 要求2:分组后,组员数大于2,才参与计算
select sex , AVG(math) from student where math>60 group by sex having COUNT(id)>2;

// where 与 having 的区别
// 1.where在分组前限定,满足条件才能进组,限定的是数据。having在分组后限定,当组满足条件才能被查询,限定的是一个组。
// 2.where后不可以跟聚合函数,having后可以跟聚合函数。

分页查询:limit 起点数据的索引index,每页查询的条数
公式:起点数据的索引index =(当前页码-1)* 每页条数

// 第一页 
select * from student limit 0,5;
// 第二页
select * from student limit 5,5;
// 第三页
select * from student limit 10,5;

多表关系

一对多:一个旅游线路分类中有多个旅游线路。
1.旅游线路分类表(1)
2.旅游线路表(n)

多对多:多个用户可以收藏多个旅游线路。
1.旅游线路表
2.用户表

// cid 旅游线路分类主键,自动增长
// cname 旅游线路分类名称,非空,唯一
create table tab_category(
  cid int  primary key auto_increment,
  cname varchar(100) not null unique 
)

// rid 旅游线路主键,自动增长
// rname 旅游线路名称,非空,唯一
// cid 外键,关联 tab_category表的主键 cid。
create table tab_route(
  rid int primary key auto_increment,
  rname varchar(100) not null unique,
  price double,
  rdate date,
  cid int,
  foreign key (cid) references tab_category(cid)
)

// uid 用户主键,自动增长
// uname 用户名,非空,唯一
create table tab_user(
  uid int primary key auto_increment,
  uname varchar(20) not null unique,
  sex char(1) default '男'
)

// primary key(rid,uid) 联合主键
// rid 外键,关联 tab_route(rid)
// uid 外键,关联tab_user(uid)
create table tab_favorite(
  rid int,
  uid int,
  primary key(rid,uid),
  foreign key (rid) references tab_route(rid),
  foreign key (uid) references tab_user(uid)数据库
)

数据库的备份与还原

语法:

  • 备份:mysqldump -u用户名 -p密码 数据库名称 > 保存的路径
  • 还原:登录数据库 -- 创建数据库 -- 使用数据库 -- 执行文件:source 文件路径

子查询:子查询可作为条件使用运算

子查询结果为单行单列:运算符( > < = <= >= )

// 查询  tab_01.num 小于 table_02.num 平均值的数据
select * from tab_01 where tab_01.num < (select AVG(num) from table_02);

子查询结果为多行单列:运算符( in )

// 先查询 tab_c 中研发部和技术部的数据,拿到n条数据后,使用 in() 查询 tab 表中的数据
select * from tab where tab.cid in(select id from tab_c where tab_c.name in("研发部","技术部"));

子查询结果为多行多列:把子查询结果当做虚拟表使用

// 子查询格式
select 
  * 
from 
  tab1 as t1,
  (select * from tab2 where tab2.age > 1) as t2  
where 
  t1.id = t2.cid;

// 可以转化为普通内连接
select 
  *
from
  tab1, tab2
where
  tab1.id = tab2.cid
  and tab2.age > 1;

事务

1.概念:如果一个包含多个步骤的操作被事务管理,那么这些操作要么同时成功,要么同时失败。
2.操作:开启事务:start transaction 回滚:rollback 提交:commit
3.四大特征:

  • 原子性:最小操作单位,要么成功,要么失败。
  • 持久性:提交或回滚后,会持久保存数据。
  • 隔离性:多个事务间,相互独立。
  • 一致性:事务操作前后,数据总量不变。

DCL数据库用户管理

用户的基本操作

// 创建用户:格式 create user ‘用户名’@‘主机名’ identified by ‘密码’;
create user 'zhangsan'@'%' identified by '123456';

// 删除用户:格式 drop user ‘用户名’@‘主机名’
drop user 'zhangsan'@'%';

// 修改密码:
  // 1.已经登录到数据库:
    // 格式1 update user set password = password('新密码') where user = '用户名';
    update user set password = password('abc') where user = 'zhangsan';
    // 格式2:set password for '用户名'@'主机名' = password('新密码') 
    set password for 'zhangsan'@'%' = password('123')
  // 2.忘记root密码
    // (1)管理员运行cmd : net stop mysql  (停止mysql服务)
    // (2)使用无验证方式启动mysql :mysql --skip-grant-tables  (cmd会卡住)
    // (3)打开新的cmd窗口:mysql  (直接回车就能登录)
    // (4)新cmd窗口:use mysql;
    // (5)新cmd窗口:update user set password=password('123456') where user= 'root';
    // (6)修改密码成功后,关闭两个cmd窗口。
    // (7)打开任务管理器,关闭进程:mysqld.exe。
    // (8)cmd:net start mysql ,启动mysql服务后,就可以正常登录了

用户的权限管理:

// 查看用户权限:show grants for '用户名'@'主机名';
show grants for 'zhangsan'@'%';

// 授权:grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
grant select,update,insert on test.user to 'zhangsan'@'%';
grant all on *.* to 'zhangsan'@'%';

// 撤销权限:revoke 权限列表 on 数据库名.表名 to '用户名'@'主机名';
revoke delete,drop on test.user to 'zhangsan'@'%';

你可能感兴趣的:(mysql常用语法)