码迷,mamicode.com
首页 > 数据库 > 详细

MySQL应用

时间:2019-04-04 09:32:14      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:option   fun   sign   show   报错   作用   所有权   read   登录   

用户管理

1.以某用户登入某个资料库:

mysql -u username -ppassword db_name

-p与密码之间没有空格

如果没有密码,-p可省略

db_name为可选项

2.创建用户:

mysql -u root -ppassword mysql

create user ‘username‘@‘hostname‘ identified by ‘password‘;

3.删除用户

mysql -u root -ppassword mysql

drop user ‘username‘@hostname;

如果从mysql.user表中直接删除用户,会导致重新创建同一用户时报错。

4.授权

grant privilegesCode on dbName.tableName tousername‘@‘host‘ identified bypasswordwith grant option;

flush privileges;

privilegesCode表示授予的权限类型,常用的有以下几种类型:

  • all privileges:所有权限。
  • select:读取权限。
  • delete:删除权限。
  • update:更新权限。
  • create:创建权限。
  • drop:删除数据库、数据表权限。

dbName.tableName表示授予权限的具体库或表,常用的有以下几种选项:

  • *.*:全局权限,授予该数据库服务器所有数据库的权限。
  • dbName.*:数据库权限,授予dbName数据库所有表的权限。
  • dbName.dbTable:表格权限,授予数据库dbName中dbTable表的权限。

username@host表示授予的用户以及允许该用户登录的IP地址。其中Host有以下几种类型:

  • localhost:只允许该用户在本地登录,不能远程登录。
  • %:允许任何一台机器,本地和远程。
  • 172.168.32.12:具体的IP表示只允许该用户从特定IP登录。

with grant option表示用户可以将自己拥有的权限授权给别人。

flush privileges表示刷新权限变更。

5.撤销授权

revoke privilegesCode on dbName.tableName fromusername@‘hostnameidentified bypassword;

flush privileges;

6.查看权限

show grants for ‘username@‘hostname‘;

7.授权系统

MySQL的授权系统通常是通过MySQL数据库中的四个表来实现的,这些表有user、db、tables_priv和columns_priv。

  • user--该表决定是否允许用户连接到服务器。如果允许连接,权限字段则为该用户的全局权限。
  • db--用于决定哪些用户可以从哪些主机访问哪些数据库。包含在db表中的权限适用于这个表标识的数据库。
  • tables_priv--该表与db表相似,不同之处是它用于表而不是数据库。这个表还包含一个其他字段类型,包括timestamp和grantor两个字段,用于存储时间戳和授权方。
  • columns_priv--该表作用几乎与db和tables_priv表一样,不同之处是它提供的是针对某些表的特定列的权限。这个表也多出了一个字段类型,即其他字段,包括了一个timestamp列,用于存放时间戳。

碰到的问题:

问题描述:新建用户,查看只有grant usage权限,但可以增删改查。

问题原因:以前没有彻底删除用户,user和db两个表中数据的不一致,用户在db中还能map到权限。

解决办法:清除db表中相关行的数据。

 

命令管理

1.执行文件中的mysql语句

方法1:命令行里执行

mysql [db_name] < /文件路径/文件名

如果文件路径中有空格,记得加上\,譬如/google\ driver/

方法2:已经进入mysql,执行

source /文件路径/文件名

或者

\. /文件路径/文件名

注意:文件路径无引号

2. 

 

 

数据管理

1.数据库操作

create database db_name;

drop database db_name;

show databases;

use db_name;

2.表格操作

create table tb_name (column_name column_type, column_name column_type,);

例子:create table Took (sID integer, oID integer, grade smallint, primary key (sID, oID), foreign key (sID) references Student(sID), foreign key (oID) references Offering(oID)); 创建表格,声明key和外部key。

drop table tb_name;

insert into tb_name (field1, field2, ...) values (value1, value2, ..);

insert into tb_name (subquery);

例子:create table invite (name char, campus varchar(25) default ‘StG‘, email text, age int);

insert into invite(name, email) (select firstname, email from student where cgpa >3.4);

delete from tb_name where clause;

delete from tb_name;全部删除

例子:delete from invite where name=‘shen‘;

update tb_name set attributes_assignments where clause;

update tb_name set attributes_assignments;更新所有行

例子:updata invite set campus=‘ut‘;

select column_name,column_name from tb_name where clause [limit n] [offset m]

例子:select * from student;选择student里面的全部数据

例子:select * from student s1, student s2;重命名student,并取self-joins。

例子:select name as title from course where clause; 重命名name为title。

例子:select * from offering where dept=‘csc‘ and cnum>=300;选取3rd和4th-year的课程

例子:select * from student order by sID [asc | desc];默认以学号升序排列

例子:select grade-10 from took; 数学操作符

例子:select concat(dept, cnum) as course from course; 合并两列并重命名

例子:select dept,cnum,‘satisfied‘ as breadthrequirement from course where breadth;新增breadthrequirement,赋值satisfied

例子:select * from course where name like ‘%comp%‘; pattern匹配,%任意字符,_任意单个字符;

 

3.聚合函数(aggregation function)和分组(group by) 

聚合函数:sum, avg, count, max, min 

count(*): 所有行数

count(属性):某列非空行数

count(distinct 属性):某列非空不重复行数

分组:group by 属性 having 需要满足的条件

如果使用分组group by,select、having后的属性要么是聚合函数,要么是group by后的属性,包含其他属性没有意义。

换句话说:分组后,select、having的属性要么是分组依据的属性(列名),要么就是其他某一列通过聚合函数聚合后得到的属性

例子:select count(*) from student where campus=‘stg‘; 返回campus=‘stg‘的所有行数,select属性为聚合函数

例子:select count(sid) from student where campus=‘stg‘; 返回campus=‘stg‘的所有sid非空行数,select属性为聚合函数

例子:select campus, count(*) from student group by campus; 按campus分组,并返回campus和每组campus对应的行数

例子:select sID, count(*) from student group by campus; 没有意义。

例子:select campus, count(*) from student group by campus having count(*)>1; 按campus分组,并返回满足count(*)>1条件的campus和每组campus对应的行数

例子:

4. SQL查询顺序

语言请求顺序:select, from, where, group by, having, order by

实际执行顺序:from, where, group by, having, select, order by

选择表格,筛选行,分组,分组后筛选,选取列,排序

5. set还是bag操作  

select from where:默认结果为bag,不删除重复项;

select distinct from where:结果为set,删除重复项;

union:删除重复项;

union all:保留重复项;

6. 视图view

视图简单、安全、数据独立

创建视图:

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select from where
[WITH [CASCADED | LOCAL] CHECK OPTION]

1)OR REPLACE:表示替换已有视图

2)ALGORITHM:表示视图选择算法,默认算法是UNDEFINED(未定义的):MySQL自动选择要使用的算法 ;merge合并;temptable临时表

3)select_statement:表示select语句

4)[WITH [CASCADED | LOCAL] CHECK OPTION]:表示视图在更新时保证在视图的权限范围之内

  cascade是默认值,表示更新视图的时候,要满足视图和表的相关条件

  local表示更新视图的时候,要满足该视图定义的一个条件即可

TIPS:推荐使用WHIT [CASCADED | LOCAL] CHECK OPTION选项,可以保证数据的安全性

例子:CREATE OR REPLACE VIEW topresults (名字,姓氏,课程代码) AS SELECT firstname, surname, cnum FROM Student, Took, Offering WHERE Student.sid = Took.sid AND Took.oid = Offering.oid AND grade >= 80 AND dept = ‘CSC‘; 创建或更新视图

查看视图 

DESC view_name:查看view列属性

SHOW CREATE VIEW view_name:查看create view指令

SELECT * FROM view_name:查看view中内容

修改视图

CREATE OR REPLACE:更新视图

ALTER:修改视图,保持视图与基表的一致性

DML操作:UPDATE view_name set name=‘王五‘ where 学号=‘1‘;

删除视图:

DROP VIEW [IF EXISTS] view_name;

7. NULL

A [LEFT | RIGHT | RIGHT] JOIN B 引入NULL值

如果聚合列A每一项的值均为NULL,那么该列聚合函数的结果为NULL,但是count(A)为0

否则,NULL值对聚合函数sum, avg 和 count 无影响,也不会成为max和min中的结果

8.子查询(Subquery)

在FROM中的子查询:必须用()和重命名

SELECT sid, concat(dept,cnum) as course, grade FROM Took, (SELECT *FROM Offering WHERE instructor=‘Horton’) Hoffering WHERE Took.oid = Hoffering.oid;

在WHERE中的子查询:必须用(),并用any,all,in,exists解决查询结果为多项的问题: 

SELECT sid, surname FROM Student WHERE cgpa > ALL (SELECT cgpa FROM Student WHERE campus = ‘StG’);

SELECT surname, cgpa FROM Student WHERE EXISTS ( SELECT * FROM Took WHERE Student.sid = Took.sid and grade > 85);结果同下例

SELECT surname, cgpa FROM Student WHERE (sid, cgpa) IN ( SELECT sid, cgpa FROM Took WHERE Student.sid = Took.sid and grade > 85);结果同上例

 

 

 

 

[]:括弧里为可选项

 

参考mysql说明文档:

https://dev.mysql.com/doc/refman/8.0/en/adding-users.html

用户权限说明:

https://www.cnblogs.com/caibird2005/p/4512905.html

深入解析MySQL视图VIEW

https://www.cnblogs.com/geaozhang/p/6792369.html#chuangjianshitu

MySQL应用

标签:option   fun   sign   show   报错   作用   所有权   read   登录   

原文地址:https://www.cnblogs.com/shendehong/p/10556222.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!