zoukankan      html  css  js  c++  java
  • 关系型数据库

    1、今天讲讲MySQL数据库:

    MySQL 为关系型数据库(Relational Database Management System), 这种所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成。

    表头(header): 每一列的名称;

    列(row): 具有相同数据类型的数据的集合;

    行(col): 每一行用来描述某个人/物的具体信息;

    值(value): 行的具体信息, 每个值必须与该列的数据类型相同;

    键(key): 表中用来识别某个特定的人/物的方法, 键的值在当前列中具有唯一性。

    2、Mysql用户设置:

    如果需要添加 MySQL 用户,只需要在 mysql 数据库中的 user 表添加新用户即可。

    以下为添加用户的的实例,用户名为ly,密码为123456,并授权用户可进行 SELECT, INSERT 和 UPDATE操作权限:

    1) // 使用mysql数据库

     use mysql;

    2) // 添加用户

    insert into user(host, user, password, select_priv, insert_priv, update_priv) values('localhost', 'ly', PASSWORD('123456'), 'Y',  'Y',  'Y'); 

    3) // 重新载入授权表

    flush privileges;

    4)  // 查询

    select host, user, password from user where user = 'ly';  

    注意:

    (1)在添加用户时,请注意使用MySQL提供的 PASSWORD() 函数来对密码进行加密。

    (2)在添加后需要执行 FLUSH PRIVILEGES 语句。 这个命令执行后会重新载入授权表。如果不使用该命令,你就无法使用新          

    创建的用户来连接mysql服务器,除非你重启mysql服务器。

    (3)可以在创建用户时,为用户指定权限,在对应的权限列中,在插入语句中设置为 'Y' 即可,用户权限列表如下:

     Select_priv   、  Insert_priv  、  Update_priv   、  Delete_priv    、  Create_priv    、   Drop_priv   、  Reload_priv

     Shutdown_priv    、  Process_priv     、  File_priv    、  Grant_priv    、   References_priv   、 Index_priv   、 Alter_priv 

    3、管理MySql的命令:

    use 数据库名            //选择要操作的Mysql数据库,使用该命令后所有Mysql命令都只针对该数据库。

    show databases      //列出 MySQL 数据库管理系统的数据库列表。

    Subtopic

    show tables             //显示指定数据库的所有表,使用该命令前需要使用 use 命令来选择要操作的数据库。

    4、MySQL数据类型:

    1)整形 

    2)浮点型

    设一个字段定义为float(5,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位。

    3)定点型

    浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。 

    例:decimal(m,d) 参数m<65 是总个数,d<30且 d<m 是小数位

    4)字符串

    char和varchar:

    (1).char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。 

    (2).char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),所以varchar(4),存入3个字符

    将占用4个字节。 

    (3).char类型的字符串检索速度要比varchar类型的快。

    varchar和text: 

    a.varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节。 

    b.text类型不能有默认值。 

    c.varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用。

    5)二进制数据

    (1).BLOB和text存储方式不同,TEXT以文本方式存储,英文存储区分大小写,而_Blob是以二进制方式存储,不分大小写。 

    (2).BLOB存储的数据只能整体读出。 

    (3).TEXT可以指定字符集,BLOB不用指定字符集。

    6)日期时间类型

    若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。

    7)数据类型的属性

    MySql的使用:

    (1)、登录Mysql

    当 MySQL 服务已经运行时, 我们可以通过MySQL自带的客户端工具登录到MySQL数据库中, 首先打开命令提示符, 输入以下格式的命名:

    mysql -h 主机名 -u 用户名 -p

    -h : 该命令用于指定客户端所要登录的MySQL主机名, 登录当前机器该参数可以省略;

    -u : 所要登录的用户名;

    -p : 告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项。

    以登录刚刚安装在本机的MySQL数据库为例, 在命令行下输入 mysql -u root -p 按回车确认, 如果安装正确且MySQL正在运行, 会得到以下响应。

    Enter password:

    若密码存在, 输入密码登录, 不存在则直接按回车登录, 按照本文中的安装方法, 默认 root 账号是无密码的。登录成功后你将会看到

    Welecome to the MySQL monitor... 的提示语。

    然后命令提示符会一直以 mysql> 加一个闪烁的光标等待命令的输入, 输入 exit 或 quit 退出登录。

    (2)、创建一个数据库

    使用 create database 语句可完成对数据库的创建, 创建命令的格式如下:

    create database 数据库名 其他选项];

    例如我们需要创建一个名为 my_db 的数据库, 在命令行下执行以下命令:

    create database my_db character set gbk;

    为了便于在命令提示符下显示中文, 在创建时通过 character set gbk 将数据库字符编码指定为 gbk。创建成功时会得到 Query OK, 1 row affected(0.02 sec) 的响应。

    注意: MySQL语句以分号(;)作为语句的结束, 若在语句结尾不添加分号时, 命令提示符会以 -> 提示你继续输入(有个别特例, 但加分号是一定不会错的); 

    提示: 可以使用 show databases; 命令查看已经创建了哪些数据库。

    选择所要操作的数据库:

    要对一个数据库进行操作, 必须先选择该数据库, 否则会提示错误:

     ERROR 1046(3D000): No database selected

    ***两种方式对数据库进行使用的选择:

    a.在登录数据库时指定, 命令: mysql -D 所选择的数据库名 -h 主机名 -u 用户名 -p

    例如登录时选择刚刚创建的数据库: mysql -D my_db -u root -p

    b. 在登录后使用 use 语句指定, 命令: use 数据库名;

    use 语句可以不加分号, 执行 use my_db 来选择刚刚创建的数据库, 选择成功后会提示: Database changed。

    (3)、创建数据库表

    使用 create table 语句可完成对表的创建, create table 的常见形式:

    create table 表名称(列声明);

    以创建 students 表为例, 表中将存放 学号(id)、姓名(name)、性别(sex)、年龄(age)、联系电话(tel) 这些内容:

      create table students

      (

        id int unsigned not null auto_increment primary key,

        name char(8) not null,

        sex char(4) not null,

        age tinyint unsigned not null,

        tel char(13) null default "-"

      );   

    对于一些较长的语句在命令提示符下可能容易输错, 因此我们可以通过任何文本编辑器将语句输入好后保存为 createtable.sql 的文件中,

    通过命令提示符下的文件重定向执行执行该脚本。 

    打开命令提示符, 输入: mysql -D my_db -u root -p < createtable.sql

     (提示: 1.如果连接远程主机请加上 -h 指令; 2. createtable.sql 文件若不在当前工作目录下需指定文件的完整路径。)

    5、数据插入

    insert 语句可以用来将一行或多行数据插到数据库表中, 使用的一般形式如下: 

    insert into] 表名 (列名1, 列名2, 列名3, ...)] values (值1, 值2, 值3, ...);

    例如:

    (1)要给 my_db 数据库中的 students 表插入一条记录, 执行语句:                 

             insert into students values(NULL, "王三", "男", 20, "13811371377");

    (2)需要插入部分数据, 或者不按照列的顺序进行插入, 可以使用这样的形式进行插入:

              insert into students (name, sex, age) values("孙丽华", "女", 21);

    6、数据查询

    (1)普通查询:

    select 语句常用来根据一定的查询规则到数据库中获取数据, 其基本的用法为:

    select 列名称 from 表名称 查询条件];

    例如:

    要查询 students 表中所有学生的名字和年龄, 输入语句 select name, age from students;

    也可以使用通配符 * 查询表中所有的内容, 语句: select * from students;

    (2)按特定条件查询:

    *where 关键词用于指定查询条件, 用法形式为: select 列名称 from 表名称 where 条件;

    以查询所有性别为女的信息为例, 输入查询语句: select * from students where sex="女";

    *where 子句不仅仅支持 "where 列名 = 值" 这种名等于值的查询形式, 对一般的比较运算的运算符都是支持的,

    例如 =、>、<、>=、<、!= 以及一些扩展运算符 is not] null、in、like 等等。 还可以对查询条件使用 or 和 and 进行组合查询。

    示例:

    查询年龄在21岁以上的所有人信息: select * from students where age > 21;

    查询名字中带有 "王" 字的所有人信息: select * from students where name like "%王%";

    查询id小于5且年龄大于20的所有人信息: select * from students where id<5 and age>20;

    7、数据更新

    update 语句可用来修改表中的数据, 基本的使用形式为:

    update 表名称 set 列名称=新值 where 更新条件;

    使用示例:

    将id为5的手机号改为默认的"-": update students set tel=default where id=5;

    将所有人的年龄增加1: update students set age=age+1;

    8、数据删除

    delete 语句用于删除表中的数据, 基本用法为:

    delete from 表名称 where 删除条件;

    使用示例:

    删除id为2的行: delete from students where id=2;

    删除所有年龄小于21岁的数据: delete from students where age<20;

    删除表中的所有数据: delete from students;

    9、数据库表的修改

    (1)添加列

    基本形式: alter table 表名 add 列名 列数据类型 after 插入位置];

    示例:

    在表的最后追加列 address: alter table students add address char(60);

    在名为 age 的列后插入列 birthday: alter table students add birthday date after age;

    (2)修改列

    基本形式: alter table 表名 change 列名称 列新名称 新数据类型;

    示例:

    将表 tel 列改名为 telphone: alter table students change tel telphone char(13) default "-";

    将 name 列的数据类型改为 char(16): alter table students change name name char(16) not null;

    (3)删除列

    基本形式: alter table 表名 drop 列名称;

    示例:

    删除 birthday 列: alter table students drop birthday;

    (4)重命名表

    基本形式: alter table 表名 rename 新表名;

    示例:

    重命名 students 表为 workmates: alter table students rename workmates;

    (5)删除整张表

    基本形式: drop table 表名;

    示例: 删除 workmates 表: drop table workmates;

    10、删除整个数据库

    基本形式: drop database 数据库名; 

    示例: 删除 my_db 数据库: drop database my_db;

    -- 创建用户

    create user "xt"@"localhost" identified by "xt";

    -- 查询数据库

    show databases;

    -- 使用数据库

    use mysql -- 可不加分号

    -- 查询表

    show tables;

    -- 查询用户

    select user from user;

    -- 修改密码

    set password for "xt"@"localhost" = PASSWORD("123456");

    -- 授权操作

    grant insert , create , update on *.* to "xt"@"localhost";

    -- 删除用户

    drop user "xt"@"localhost";

    -- 登录用户

    mysql -u xt -p

    -- 创建数据库

    create database xxtt;

    -- 删除数据库

    drop database xxtt;

    -- 创建表

    create table student(

    id int unsigned not null primary key auto_increment,

    name char(10) not null,

    age tinyint unsigned not null);

    -- 查看表结构

    describe student;

    -- 修改表

    alter table student add birthday date after id;

    alter table student drop id;

    alter table student add id int unsigned not null primary key auto_increment first;

    alter table student add tel char(11) default "-";

    alter table student rename stu;

    -- 插入数据

    insert into student(id , birthday , name , age , tel) values (1 , "1998-12-17" , "xt" , 21 , "111");

    insert into student(birthday , name , age , tel) values ("1995-9-17" , "twb" , 24 , "222");

    insert into student values

    (3 , "2010-3-12" , "许苗苗" , 8 , "333"),

    (4 , "1997-9-7" , "陈秋芝" , 22 , "444");

    -- 删除表

    drop table student;

    -- 删除数据库

    delete from student where id = 4;

    -- 查询数据

    select * from student;

    select name from student where id > 3;

    MySql接口使用:

    1、获取错误信息

    mysql_errno

    mysql_error

    2、连接远程服务器

    mysql_init

    mysql_close

    mysql_real_connect

    3、数据查询

    mysql_query(&mysql, "set names utf8");                      //解决显示中文乱码

    mysql_store_result                                                      //检索完整的结果集至客户端

    mysql_fetch_fields                                                       //返回所有字段结构的数组

    mysql_num_fields                                                        //返回结果集中的列数

    mysql_field_count                                                        //返回上次执行语句的结果列的数目

    mysql_fetch_row                                                          //从结果集中获取下一行

    mysql_fetch_lengths                                                   //返回当前行中所有列的长度

    mysql_use_result                                                        //初始化逐行的结果集检索

    mysql_free_result                                                       //释放结果集使用的内存

    4、MySql的事务处理

    开启事务:START TRANSACTION

    禁止自动提交:set autocommit=0

    开启自动提交:set autocommit=1

    提交事务:commit

    事务回滚:rollback

    事务封装:

    #define BEGIN_TRAN "START TRANSACTION"

    #define SET_TRAN "SET AUTOCOMMIT=0"

    #define UNSET_TRAN "SET AUTOCOMMIT=1"

    #define COMMIT_TRAN "COMMIT"

    #define ROLLBACK_TRAN "ROLLBACK"

    int mysql_BeginTran(MYSQL *mysql)

    {

    int ret = 0;

    //--执行事务开始SQL

    ret = mysql_query(mysql, BEGIN_TRAN);

    if (ret != 0)

    {

    printf("func mysql_query() err: %d ", ret);

    return ret;

    }

    //--设置事务手动提交

    ret = mysql_query(mysql, SET_TRAN);

    if (ret != 0)

    {

    printf("func mysql_query() err: %d ", ret);

    return ret;

    }

    return ret;

    }

    int mysql_Rollback(MYSQL *mysql)

    {

    int ret = 0;

    //--事务回滚操作

    ret = mysql_query(mysql, ROLLBACK_TRAN);

    if (ret != 0)

    {

    printf("func mysql_query() err: %d ", ret);

    return ret;

    }

    //--恢复事务自动提交标志

    ret = mysql_query(mysql, UNSET_TRAN);

    if (ret != 0)

    {

    printf("func mysql_query() err: %d ", ret);

    return ret;

    }

    return ret;

    }

    int mysql_Commit(MYSQL *mysql)

    {

    int ret = 0;

    //--执行事务提交SQL

    ret = mysql_query(mysql, COMMIT_TRAN);

    if (ret != 0)

    {

    printf("func mysql_query() err: %d ", ret);

    return ret;

    }

    //--恢复自动提交设置

    ret = mysql_query(mysql, UNSET_TRAN);

    if (ret != 0)

    {

    printf("func mysql_query() err: %d ", ret);

    return ret;

    }

    return ret;

    }

    11.总结:

    有了数据库,就可以把想要的数据存储起来,想要用的时候直接取出来,多加练习,再接再厉。

                                  改变自己,从现在做起-----------久馆

  • 相关阅读:
    Oracle数据库链Database links
    记录中文字符的烦恼
    oracle游标应用难点 sys_refcursor 和 cursor(转)
    C# Delegate类
    Oracle_merge into 中 using 后的查询表如果有参数的情况
    C# partial
    Excel快捷键
    时间格式的问题
    Ref_cursor
    .Net 引用命名空间
  • 原文地址:https://www.cnblogs.com/zzw19940404/p/14045055.html
Copyright © 2011-2022 走看看