MySQL-SQL的分类以及基本的操作
1.DDL:数据定义语言
用来定义数据对象:数据库,表,列等
关键字:create、drop、alter等
(1)操作数据库:CRUD
1.C(Create):创建
Ⅰ.创建数据库:create database 数据库名称;
Ⅱ.指定数据库的字符集以及判断是否已经存在该数据库,如果存在就不创建该数据库:create database if not exists 数据库名称 character set 字符集名称(如:utf8);
2.R(Retrieve):查询
Ⅰ.查询所有数据库的名称:show databases;
Ⅱ.查询某个数据库的字符集:查询某个数据库的创建语句:show create database 数据库名称;
3.U(Update):修改
Ⅰ.修改数据库的字符集:alter database 数据库名称 character set 字符集名称;
4.D(Delete):删除
Ⅰ.删除数据库:drop database 数据库名称;
Ⅱ.判断数据库是否存在,如果存在再删除:drop database if exists 数据库名称;
5.使用数据库
Ⅰ.查询当前正在使用的数据库名称:select database 数据库名称;
Ⅱ.使用数据库:use 数据库名称;
(2)操作表
1.C(Create):创建
Ⅰ.语法:create table 表名(
列名1 数据类型1,
列名2 数据类型2,
...... ......,
列名n 数据类型n
);
Ⅱ.复制表:create table 复制的表名 like 被复制的表名;
Ⅲ.数据库的数据类型:
Ⅳ.注意:
double类型要标注一共几个位,保留小数点后几位:create table score double(5,2);
date,datetime,timestamp都是表示时间,区别是:date只表示年月日,datetime和timestamp都表达年月日时分秒,而timestamp如果不给它的字段赋值则默认使用当前的时间,而datetime如果不给它的字段赋值则显示的是null
2.R(Retrieve):查询
Ⅰ.查询某个数据库所有的表名称:show tables;
Ⅱ.查询表结构:desc 表名称;
3.U(Update):修改
Ⅰ.修改表名:alter table 表名 rename to 新表名;
Ⅱ.修改表的字符集:alter table 表名 character set 新的字符集;
Ⅲ.添加列:alter table 表名 add 列名 数据类型;
Ⅳ.修改列名,类型:alter table 表名 change 列名 新列名 新数据类型;
Ⅴ.只修改类型:alter table 表名 modify 列名 新数据类型;
Ⅵ.删除列:alter table 表名 drop 列名;
4.D(Delete):删除
Ⅰ.删除表:drop table 数据库表名;
Ⅱ.如果存在该表则删除,如果不存在就不删除:drop table if exists 数据库表名;
2.DML:数据操作语言
用来对数据库中的表进行增删改
关键字:insert、update、delete等
(1)添加数据:
Ⅰ.可以将选择的列插入数据,没有选择的列值为null:insert into 表名(列名1,列名2,列名3,...,列名n) values(值1,值2,...,值n);
Ⅱ.为所有的列插入数据:insert into 表名(列名1,列名2,列名3,...,列名n) values(值1,值2,...,值n);
(2)删除数据:
Ⅰ.删除单个数据:delete from 表名 where 条件;
Ⅱ.删除该表的全部数据:
delete from 表名;(不推荐,因为有多少条记录就会执行多少次删除操作,效率低下)
truncate table表名;(推荐,这条sql语句是将该表先删除,然后在创建一个名字一模一样的空表,只执行两条sql语句,效率较高)
(3)修改数据:
Ⅰ.修改单个数据:update 表名 set 列名1=值1,列名2=值2,...,列名n=值n where 条件;
Ⅱ.修改表中选择列的全部数据:update 表名 set 列名1=值1,列名2=值2,...,列名n=值n;
Ⅲ.为某列的部份字段修改相同的数据(如修改这个表的部分数量减一):update 表名 set 列名=值 where id in(id1,id2,id3...idn);
3.DQL:数据查询语言
用来查询数据库中表的记录
关键字:select、where、
(1)查询数据:
Ⅰ.基本查询:select 查询的列名 from 表名;
①.去除重复的结果集:select distinct 列名 from 表名;(注意:如果该列名查询出来的结果还会有重复,则看一下重复的数据是否有空格的存在,如:'香港'和'香港 ')
②.计算数据之和:select 列名1,列名2,列名3,列名2+列名3 from 表名;(注意:该计算的数据之和如果任何一个数据是null,计算结果也是null,如列名2的结果是null,列名3有数据,则结果依然是null)
select 列名1,列名2,列名3,ifnull(列名2,0)+列名3 from 表名;(解决了上述结果为null的情况,就是用ifnull来把为null的数据替换为0)
③.给列起别名:select 列名1,列名2,列名3,列名2+列名3 from 表名 as 别名;(把列名2+列名3的数据之和的这一列的列名起一个别名)
Ⅱ.sql语句的查询可能用到的查询的条件:
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
Ⅲ.条件查询:
①where字符句后跟条件
②比较运算符
>、<、<=、>=、=、<>:在这些运算符中,没有==,是用=代替的,既可以使用!=,也可以使用<>,代表的意思一样
BETWEEN...AND:查询在一个范围内符合要求的字段,包头也包尾 如:select * from student where age between 20 and 30;(相当于select * from student where age>=20 and age<=30;)
in:集合表示多个值,用逗号隔开 如:select * from student where age in(22,18,25); (相当于select * from student where age=22 or age=18 or age=25;)
like:模糊查询
根据%(多个占位符)来确定如何模糊查询,如 '%张' 则说明是这一列末尾的字为张的所有字段,'张%' 这个则说明是这一列第一个字为张的所有字段,'%张%' 这个表示这一列存在张的所有字段(无论张在句首还是句尾还是句中)
根据_(单个占位符)来确定如何模糊查询,如 '_张%' 说明这一列第二个字为张的所有字段,'张_' 这个说明这一列只有两个字符且第一个字符为张的所有字段,且第一个为张,'%张_' 这个说明这一列倒数第二个字符为张的所有字段,'___'这个则说明查询这一列有三个字符的所有字段
is (not) null:查询某一列为(不为)null的字段(在sql语句中不能写=null)如:select * from student where age is null;(不能这么写:select * from student where age=null;)
③逻辑运算符
and 或 &&:与
or 或 ||:或
not 或 !:非
4.DCL:数据控制语言
用来定义数据库的访问权限和安全级别,及创建用户
关键字:grant、revoke等
1.管理用户
1.添加用户:
--创建用户
create user '用户名'@'主机名' identified by '密码';
2.删除用户:
--删除用户
drop user '用户名'@'主机名';
3.修改用户密码:
--修改密码
update user set password = password('新密码') where user = '用户名';
或
set password for '用户名'@'主机名' = password('新密码');
4.查询用户:
--切换到mysql数据库(每个数据库自带的数据库)
use mysql;
--查询user表
select * from user;
通配符:%表示可以在任意主机使用用户登录数据库
5.忘记密码
2.权限管理:
1.查询权限
show grants for '用户名'@'主机名';
show grants for 'lisl'@'%';
2.授予权限
--授予部分权限
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
grant select,delete on db.account to 'lisi'@'%';
--授予所有权限
grant all on *.* to '用户名'@'主机名';
grant all on *.* 'zhangsan'@'localhost';
3.撤销权限
--撤销权限
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
revoke select on db.account from 'lisi'@'%';