账号:mysql8登陆root账号,初始密码在/var/log/mysqld.log
建立账号:create user 用户名@'所有者' identified mysql_native_password by '密码';
授权: grant 权限 on 作用域 to 用户;
grant all privileges on *.* to linux;
grant select name on db.student to admin;
撤权: revoke 权限 on 作用域 from 用户;
revoke select on students.* from linux;
权限:select、insert、drop、update、grant、create、revoke、alter 等
作用域:数据库.表
*代表所有
改密码:mysql5.7以前密码有加密函数:password('密码')
set password='密码'; --默认为root账户
set password for 用户名='密码';
查看权限:desc mysql.user;
show grants for 用户;
select * from mysql.user where user='用户名' and host='所有者'G;
导入、还原数据库:1、工具导入(SQLyog):导入→执行SQL脚本(ctrl+shift+Q)
2、在mysql中导入:mysql>source d:/db.sql;
3、在mysql外导入:mysql -uroot <d:/db.sql
导出、备份数据库: 1、工具导出(SQLyog):导出/备份→备份数据库,转储到SQL(ctrl+shift+E)
2、在mysql外导出:①导出多个数据库:mysqldump -uroot --databases db1 ab2 db3 > d:/db.sql
②导出一个数据库中多个表的数据与结构:mysqldump -uroot -p db t1 t2 > d:/m.sql
说明:>前面加-t是只要表的数据、加-d只要表结构(操作)
全部数据库表示为-A
数据类型:
1、数字: 整数 tinyint、smallint、int、bigint
小数 decimal(p,s):p为总字数限制,s为小数限制 如:decimal(3,2) 9.9
2、字符串 :char(18) 18个字节
varchar(50) 50个字符
text
longtext
3、日期时间: datetime 时间与日期 2019-08-20 15:59:30
date 日期 2019-08-20
4、二进制
5、复合类型
enum() 枚举: gender enum('男','女','保密');
set()集合 :set('java','php','python');
'java' 'php,python' 'python,php,java' 'html,php'
6、JSON 类型 (NoSQL 特性)
操作:(table后面可接if判断条件以是否执行 如:drop table if exists student;)
导入数据库:source 文件名;
一、建立表(先use 数据库;)
create table 表名(
`列名` 数据类型 约束,
...
)engine=innodb charset=utf8;
如:create table if not exists student(
sno int unsigned auto_increment primary key,
sname varchar(30),
sgender enum('男','女'),
sbrithday datetime,
smoney decimal(8,1),
sdept varchar(50)default '计算机科学',
sinfo text
)engine=innodb charset =utf8 auto_increment = 201601;
二、 查看表数据:select * from 表名;
查看表结构:desc 表名;
修改表:
-- 修改表名
alter table 表名 rename to 新名;
rename table 表名 to 新名;
-- 增加一列
alter table 表名 add `列名` 数据类型;
alter table 表名 add `列名` 数据类型 after;
alter table 表名 add `列名` 数据类型 first;
-- 修改列名及类型(缺一不可)
alter table 表名 change 列名 新名 数据类型;
-- 删除一列
alter table 表名 drop `列名`;
-- 删除表
drop table 表名;
drop table if exists 表名;
三、增删改(where后面用索引信息定位,一般用主键的值)
增: 插入一条:insert 表名 values(以逗号隔开,字符串用'',空则填null,不可不填)
插入多条: insert 表名 values(),(),();
插入部分字段:insert 表名(`列名`,`列名`) values(值,值);
insert没有插入指定位置之说,因为一般主键是int类型,而表是按主键排列的,若要‘指定’,注意插入条的主键序号
删: delete from 表名 where `某列名`=值;
改: update 表名 set `列名`=值 where 用字段定位;
update 表名 set `列名`=值,`列名`=值 where 用字段定位,用字段定位;
四、查:(重点,若语句多,可换行区分)
普通计算:select 函数;
如:此时:now()、往时:date_add(now(),interval 10 day)、来时:date_add(now(),interval -10 day)、小时:hour(now())、唯一字符串:uuid()
查询数据:select 查看的字段 from 表名 条件;
别名格式:select 查看的字段 别名 from 表名 条件;
①查看的字段:就是查看的内容以列名或函数计算、并以字段形式显示,写一个就显示一列,查看多个就用逗号隔开。(*表示表中所有字段)
1、对查看的内容消去重复:distinct+字段名,如:
select distinct address ...
2、普通函数: ·计行函数:count(*)
·int函数:max()、min()、avg()、sum()、round()、floor()、abs()、ceil()、sqrt()
·字符串(时间)函数:char_length()、length()、now()、 from_unixtime(时间戳)、unix_timestamp('2006-11-04 12:23:00')、concat(连接函数)、concat_ws(分隔符写在第一个位置)、
repeat(重复函数)、upper()、lower()、left(字符串,取用个数)、right(str,length)、mid(截取)
这些函数作为字段,不能直接当作值来用,若要用:如s=max(),可用子查询,用select的结果作为值,如:s=(select max(sno)...)
3、子查询:将首先查看到的结果括起来作为 新表!用来再select
如查看成绩最高的学生信息:select * from students where grate =(select max(grate) from student);
4、if函数:以if()的返回值作为查看结果
if( 条件,值1,值2)
if(条件,值1,if(条件,值2,...))
如:
select 等级,count(*) 人数 from
(select sname 姓名,
sperformance 成绩,
if(sperformance>=90,'优秀',if(sperformance>=80,'良好',if(sperformance>=60,'及格','补考'))) 等级
from students
) ss group by 等级;
5、排序、排名
5.1、新增一个排序字段:select row_number() over(order by 列名 desc) 序号 from...
5.2、新增一个排名字段:
跳号排名:select rank() over(order by 列名 asc) from 表名 order by 列名 asc;
不跳号 排序:select dense_rank() over(order by 列名 desc) from 表名 order by 列名 asc;
select rank() over(order by `grate` asc) from students order by `grate` asc;
②条件:就是对前面字段进行要求、限制条件,从而筛选数据,好比为:前面查看的是哪些列(字段),而索引查看的就是哪些行(条),没有条件,所有条数据就全查看了
1、指定查看哪些行:
limit 行数;
limit 开始行,行数;
select * from students limit 0,10;
2、查询语句where:where `列名` 如下+数据
=、!=、>、<、>=、<=:判断值
and:且
or:或
like、not like: 可以使用通配符:%(表示0,1或多个,如:'%为%','王%') _(表示一个字符,如:'__','李_')
in()、not in()
is、is not:表示`是非`,用于判断性质(而非判断值)!如:select * from students where name is not null;
regrep:正则表达式,如:'^[0-9a-zA-Z]+$'
between .. and .. :用于日期,数字等有序数据,如:select * from stu where `birthday` between '1990-1-1' and '2000-1-1';
not between .. and ..
3:分组语句group by :根据后面,相同的分为一组having
select left(sname,1) 姓,count(*) 人数 from students group by left(sname,1) having count(*)>=5 order by count(*) desc;
4:排序语句order by:
升序(默认):order by `列名` asc
降序:order by `列名` desc
③union:连接两个查询语句一并显示,前提是两者表结构相同
④外键(关联另外一个表,跨表查看):constraint fk foreign key(列名) references 表名(列名)
外键必须都是唯一索引(一般是其他表的主键)
在表中设立一个外键:alter table student add foreign key (tid) references class(id);
constraint fk foreign key(tid) references teacher(id)
如果建立外键时遇到foreign key constraint fails 错误,检查两者数据类型即值是否一致,检查引擎是否一致,检查值是否匹配
还有注意一点,外键必须要对应上另一个表的值或者为null,否则报错,即不能选择别的‘老师’,要么没有
#所以一般不建议用外键,直接连表查询就好
select s.`id`,s.`name`,s.`grate`,t.`name` from student s,teacher t where t.`id`=s.`id`;
select s.`id`,s.`name`,s.`grate`,t.`name` from student s,teacher t from student left join teacher on t.`id`=s.`id`;
五、复制表(备份):
复制表结构:create table 新表名 like 表名;
复制表数据:insert 新表 select * from 表名;
仅复制表数据:create table 新表 as select * from 表名;
也可以部分复制:create table 新表 as select 列名,列名 from 表名;
说明:
0、 用户尽量用像 root@%、linux@'192.168.10.11' 这样的格式
列名最好用``包住
1、一列称为一个字段(field),其名叫做列名
2、建立字段的约束条件有: ①auto_increment primary key(主键:唯一索引)
②注释:comment,默认:default,无负号:unsigned
3、表名用->可用数据库.表名<- 实现跨库操作表
4、单元格内容不可啥都不填,若想表示‘无数据’填null ,若想表示‘空数据’,填0或''
5、drop 删除:数据库 、表、账号,delete删除数据
6、查看多个表:select *from stu1,stu2,stu3;
7、赋予权限后及时刷新权限:flush privileges
8、普及:角色是权限的集合