全文约 3421 字,预计阅读时长: 10分钟
视图
- 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。
- 基表:原始表,修改两者中的一个都会互相影响。
- 视图,存的是筛选的中间结果,不用每次都写冗长的sql语句来过滤得到最终结果。在本地存着的只有一个.frm文件,一种小而美的设计。
基本使用
- 创建视图:
#create view 视图名 as select语句;
#create view v_ename_dname as select ename, dname
- 修改了视图,对基表数据有影响;修改了基表,对视图有影响
#update v_ename_dname set dname='sales' where ename='CLARK'; //修改视图
#mysql> update EMP set deptno=20 where ename='JAMES'; //-- 修改基表
- 删除视图:
drop view 视图名;
视图规则和限制
- 与表一样,必须唯一命名(不能出现同名视图或表名)
- 创建视图数目无限制,但要考虑复杂查询创建为视图之后的性能影响
- 视图不能添加索引,也不能有关联的触发器或者默认值
- 视图可以提高安全性,必须具有足够的访问权限
- order by 可以用在视图中,但是如果从该视图检索数据 select 中也含有 order by ,那么该视图中的order by 将被覆盖
- 视图可以和表一起使用
用户管理
如果我们只能使用root用户,这样存在安全隐患。这时,就需要使用MySQL的用户管理。
-
查看用户信息
-
创建用户
-
删除用户
-
修改用户密码
-
给用户授权
-
回收用户的权限。
用户信息
用户信息:MySQL中的用户,都存储在系统数据库mysql的user表中
#mysql> use mysql;
#mysql> select host,user,authentication_string from user;
host
: 表示这个用户可以从哪个主机登陆,如果是localhost,表示只能从本机登陆user
: 用户名authentication_string
: 用户密码通过password函数加密后的*_priv
: 用户拥有的权限
创建用户
- 语法:
#create user '用户名'@'登陆主机/ip' identified by '密码';
//示例
#mysql> create user 'comeon'@'localhost' identified by '12345678';
- 此时便可以使用新账号新密码进行登陆啦。可能实际在设置密码的时候,因为mysql本身的认证等级比较高,一些简单的密码无法设置。
- 关于新增用户这里,不要轻易添加一个可以从任意地方登陆的user。
删除用户
- 语法:
- 直接给个用户名,不能删除,它默认是%,表示所有地方可以登陆的用户。
#drop user '用户名'@'主机名'
//示例
#mysql> drop user 'comeon'@'localhost'; //--删除用户
修改用户密码
- 自己改自己密码
#set password=password('新的密码');
- root用户修改指定用户的密码
#set password for '用户名'@'主机名'=password('新的密码');
# flush privileges;
- 根据数据库版本不同,方法略有差异,可用万能的度娘。
数据库的权限
- 刚创建的用户毛权限都米有。权限可以细化到某个库的某个表的某个查或删或改的具体操作上。
MySQL数据库提供的权限列表:
给用户授权
- 语法:
#grant 权限列表 on 库.对象名 to '用户名'@'登陆位置' [identified by '密码']
#grant select, delete, create on ....
#grant all [privileges] on ... //-- 表示赋予该用户在该对象上的所有权限
- 权限列表,多个权限用逗号分开
*.*
: 代表本系统中的所有数据库的所有对象(表,视图,存储过程等)库.*
: 表示某个数据库中的所有数据对象(表,视图,存储过程等)- identified by可选。 如果用户存在,赋予权限的同时修改密码,如果该用户不存在,就是创建用户
回收权限
- 语法:
#revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置';
//示例
#mysql> revoke all on test.* from 'comeon'@'localhost';
C语言连接数据库
- 要使用C语言连接mysql,需要使用mysql官网提供的库,大家可以去官网下载。
- 保证mysql服务有效;在官网上下载合适自己平台的mysql connect库,以备后用。
其中 include 包含所有的方法声明, lib 包含所有的方法实现(打包成库)。
- 首先要安装一个叫 mysql-devel 东西,这个是一个驱动 通过 yum install mysql-devel 命令安装,
- 通过
mysql_get_client_info()
函数,来验证我们的引入是否成功。
#include <stdio.h>
#include <mysql.h>
int main()
{
printf("mysql client Version: %s\n", mysql_get_client_info());
return 0;
}
# gcc -o test test.c -I./include -L./lib -lmysqlclient
#export LD_LIBRARY_PATH=./lib
- 第三方库导入环境变量、或者移动到默认搜索路径下;或者给个软连接,编译时给个路径。。
mysql接口介绍
要使用库,必须先进行初始化!
MYSQL *mysql_init(MYSQL *mysql);
。
初始化完毕之后,必须先链接数据库,在进行后续操作。(mysql网络部分是基于TCP/IP的)
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host,
const char *user,
const char *passwd,
const char *db,
unsigned int port,
const char *unix_socket,
unsigned long clientflag);
下发mysql命令mysql_query
int mysql_query(MYSQL *mysql, const char *q);
string s1 = "select * from table";
s1.c_str()作为第二个参数
获取执行结果mysql_store_result
- 如果mysql_query返回成功0,那么我们就通过mysql_store_result这个函数来读取结果。
MYSQL_RES *mysql_store_result(MYSQL *mysql);
- 获取结果行数
mysql_num_rows
my_ulonglong mysql_num_rows(MYSQL_RES *res);
- 获取结果列数
mysql_num_fields
unsigned int mysql_num_fields(MYSQL_RES *res);
- 获取列名
mysql_fetch_fields
unsigned int mysql_num_fields(MYSQL_RES *res);
int fields = mysql_num_fields(res);
MYSQL_FIELD *field = mysql_fetch_fields(res);
int i = 0;
for(; i < fields; i++)
{
cout<<field[i].name<<" ";
}
cout<<endl;
- 获取结果内容
mysql_fetch_row
- 它会返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char **.就当成一个二维数组来用吧。
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
i = 0;
MYSQL_ROW line;
for(; i < nums; i++)
{
line = mysql_fetch_row(res);
int j = 0;
for(; j < fields; j++)
{
cout<<line[j]<<" ";
}
cout<<endl;
}
- 关闭 mysql链接
mysql_close
void mysql_close(MYSQL *sock);
- mysql C api还支持事务等常用操作。