zoukankan      html  css  js  c++  java
  • 6.MySQL简介

    MySQL简介
      ·点击查看MySQL官方网站
      ·MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,后来被Sun公司收购,Sun公司后来又被Oracle公司收购,目前属于facle旗下产品


    特点  

      ·使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性

      ·支持多种操作系统,如Linux、Widdows、AlX、FreeBSD、HP-UX、MacOS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris等
      ·为多种编程语言提供了API,如C、C++、Python、Java、Perl、PHP、Eiffel、Ruby等
      ·支持多线程,充分利用CPU资源
      ·优化的SQL查询算法,有效地提高查询速度
      ·提供多语言支持,常见的编码如GB2312、BIG5、UTF8
      ·提供TCP/IP、ODBC和JDBC等多种数据库连接途径
      ·提供用于管理、检查、优化数据库操作的管理工具
      ·大型的数据库。可以处理拥有上千万条记录的大型数据库
      ·支持多种存储引擎
      ·MySQL软件采用了双授权政策,它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库
      ·MySQL使用标准的SQL数据语言形式
      ·Mysql是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统
      ·在线DDL更改功能
      ·复制全局事务标识
      ·复制无崩渍从机
      ·复制多线程从机

    数据类型与约束
      ·为了更加准确的存储数据,保证数据的正确有效,需要合理的使用数据类型和约束来限制数据的存储。
    常用数据类型
      ·整数:int,有符号范围(-2147483648~2147483647),无符号范围(0~429496725)
      ·小数:decimal,如decimal(5.2)表示共存5位数,小数占2位,整数占3位
      ·字符串:varchar,范围(0~65533),如varchar(3)表示最多存3个字符,一个中文或一个字母都占一个字符
      ·日期时间:datetime,范围(1000-01-01 00:00:00~9999-12-3123:59:59),如12020-01-01 12:29:59'
    约束
      ·主键(primary key):物理上存储的顺序
      ·非空(not nul):此字段不允许填写空值
      ·惟一(unique):此字段的值不允许重复
      ·默认值(default):当不填写此值时会使用默认值,如果填写时以填写为准
      ·外键foreign key):维护两个表之间的关联关系

    数据库的基本操作

    创建数据库的语法格式:

    create databases 数据库名称 ;

    例:创建一个名称为xiaoxu的数据库,SQL语句如下:

    create databases xiaoxu ;

    查看数据库的语法格式:

    show databases ;

    查看某个已创建好的数据库的语法格式:

    show create databases 数据库名称 ;

    修改数据库编码的语法格式:

    lter database 数据库名称 default character set 编码方式 collate 编码方式_bin ;

    例:将数据库xiaoxu 的编码修改为 gbk,SQL语句如下所示:

    alter database xiaoxu default character set gbk collate gbk_bin ;

    删除数据库的语法格式:

    drop database 数据库名称 ;

    数据表的基本操作

    创建数据表语法格式:

    create table 表名 
     
    { 
     
        字段名 1,数据类型[完整性约束条件], 
     
        字段名 2,数据类型[完整性约束条件], 
     
        ... 
     
        字段名 n,数据类型[完整性约束条件], 
     
    }

    例:创建学生表,字段要求如下 
    姓名(长度为10),年龄

    create table student(
     id int unsigned primary key auto_increment,
    name varchar(10),
    age int unsigned,
    height decimal(5,2)
    )

    查看数据表的语法格式:

    show create table 表名 ; 
     
    或者 
     
    describe 表名 ; 
     
    简写为 
     
    desc 表名 ;

    删除表

    drop table 表名;
    
    或者
    
    drop table if exists 表名;

    例:删除学生表

    drop table students
    
    或
    
    drop table if exists students

    添加数据

    添加一行数据
    格式一:所有字段设置值,值的顺序与表中字段的顺序对应

      ·说明:主键列是自动增长,插入时需要占位,通常使用0或者default 或者nul来占位,插入成功后以实

    insert into 表名 values(...)

    例:插入一个学生,设置所有字段的信息

    insert into students values(e,'亚瑟”,22,177.56)

    格式二:部分字段设置值,值的顺序与给出的字段顺序对应

    insert into 表名(字段1,..) values(值1.…)

    例:插入一个学生,只设置姓名

    insert into students(name) values(“老夫子")

    添加多行数据
    方式一:写多条insert语句,语句之间用英文分号隔开

    insert into students(name) values(“老夫子2);
    insert into students(name) values('老夫子3’);
    insert into students values (0,‘亚瑟2",23,167.56)

    方式二:写一条insert语句,设置多条数据,数据之间用英文逗号隔开

    格式一:insert into 表名 values(..),(...)...
    例:插入多个学生,设置所有字段的信息
    insert into students values(0,'亚瑟3',23,167.56),(0,‘亚瑟4,23167.56)
    格式二:insert into 表名(列1,..)values(值1..),(值1......
    例:插入多个学生,只设置姓名
    insert into students(name) values('老夫子5),('老夫子6)

    修改

    格式:update 表名 set 列1=值1,列2=值2 … where条件

    例:修改id为5的学生数据,姓名改为狄仁杰,年龄改为20

    update students set name='数仁杰’,age=20 where id=5

    删除

    格式:delete from 表名 where 条件

    例:删除id为6的学生数据

    delete from students where id=6

    逻辑删除

    1、设计表,给表添加一个字段isdelete,1代表删除,0代表没有删除
    2、把所有的数据isdelete都改为0
    3、要删除某一条数据时,更新他的isdelete为1
    4、当要查询数据时,只查询isdelete为0的数据
    update students3 set isdelete=0
    update students3 set isdelete=1 where id=1
    select * from students3 where isdelete=0

    查询数据

    创建数据表

    drop table if exists students;
    create table students(
    studentNo varchar(10) primary key,
    name varchar(18),
    sex varchar(1),
    hometown varchar(20),
    age tinyint(4),
    class varchar(10),
    card varchar(28),
    )

    准备数据

    insert into students values
    (‘001’,‘王昭君’,‘女’,‘北京’,‘20’,‘1班‘,‘340322199001247654’),
    (‘002',‘诸葛亮’,‘男’,‘上海’,‘18’,‘2班’,'340322199002242354‘),
    (‘003',‘张飞‘,‘男’,‘南京’,‘24’,'3班’,‘340322199003247654’),
    (‘084’,‘白起’,‘男’,‘安徽’,‘22’,14班’,‘348322199005247654’),
    (‘005’,‘大乔’,‘女’,‘天津”,‘19’,‘3班’,‘340322199004247654’),
    (‘086’,‘孙尚香,‘女’,‘河北’,‘18’,‘1班’,‘340322199006247654’),
    (‘007’,‘百里玄策”,‘男’,‘山西’,‘20’,‘2’班”,‘340322199007247654’),
    查询所有字段
    
    select *from 表名
    select * from students
    查询指定字段
    在select后面的列名部分,可以使用as为列起别名,这个别名出现在结果集中
    select列1,列2,..from表名
    
    --表名.字段名
    select students,name,students.age from students
    --可以遥过as给表起别名
    select s.name,s.age from students as s
    --如果是单表查询可以省略表名
    select name,age from students
    -使用as给字段起别名
    select studentNo as 学号,name as 名字,sex as 性别 from students

    条件
    ·使用where子句对表中的数据筛选,符号条件的数据会出现在结果集中
    ·语法如下  

    select 字段1,字段2...from 表名 where 条件;
    
    例:
    
    select *from students Where id=1;

    ·where后面支持多种运算符,进行条件的处理
      。比较运算  
      。逻辑运算
      。模糊查询
      。范围查询
      。空判断

    比较运算符
      ·等于:=
      ·大于:>
      ·大于等于:>=
      ·小于:<
      ·小于等于:<=
      ·不等于:!=或<>

    例1:查询小乔的年龄
    select age from students where name='小乔'
    例2:查询20岁以下的学生
    select * from students where age<20
    例3:查询家乡不在北京的学生
    select * from students where hometown!='北京'

    逻辑运算符
      ·or
      ·not

      ·and

    例1:查询年龄小于20的女同学
    select * from students where age<20 and sex=‘女'
    例2:查询女学生或1班”的学生
    select * from students where sex='女”or class='1班’
    例3:查询非天津的学生
    select * from students where not hometown=‘天津

    模糊查询
      ·like
      ·%表示任意多个任意字符
      ·表示一个任意字符

    例1:查询姓孙的学生
    select *from students where name like ‘孙%'
    
    例2:查询姓孙且名字是一个字的学生
    select * from students where name like‘孙_'
    
    例3:查询叫乔的学生
    select *from students where name like '%乔!'

    范围查询
      ·in表示在一个非连续的范围内

    例1:查询家乡是北京或上海或广东的学生
    select * from students where hometown in('北京”,‘上海’,‘广东”)

    ·between...and....表示在一个连续的范围内

    例2:查询年龄为18至20的学生
    
    select * from students where age between 18 and 20

    空判断
      ·注意null与“是不同的
      ·判空is null
    例1:查询没有填写身份证的学生

    select * from students where card is null

      ·判非空is not null

    例2:查询填写了身份证的学生

    select* from students where card is not null

    排序
      ·为了方便查看数据,可以对数据进行排序
      ·语法:

    select *from 表名
    order by 列1 asc l desc,列2 asc l desc.. 

    ·将行数据按照列1进行排序,如果某些行列1的值相同时,则按照列2排序,以此类推
    ·默认按照列值从小到大排列
    ·asc从小到大排列,即升序
    ·desc从大到小排序,即降序

    例1:查询所有学生信息,按年龄从小到大排序

    select *from students order by age

    例2:查询所有学生信息,按年龄从大到小排序,年龄相同时,再按学号从小到大排序

    select *from students order by age desc,studentNo

    聚合函数
      ·为了快速得到统计数据,经常会用到如下5个聚合函数
      ·count(*)表示计算总行数,括号中写星与列名,结果是相同的
      ·聚合函数不能在where中使用

    例1:查询学生总数

    select count(*from students;

      ·max()表示求此列的最大值

    例2:查询女生的最大年龄

    select max(age) from students where sex=''

      ·min(列)表示求此列的最小值

    例3:查询1班的最小年龄

    select min(age) from students;

    分组
      ·按照字段分组,表示此字段相同的数据会被放到一个组中
      ·分组后,分组的依据列会显示在结果集中,其他列不会显示在结果集中
      ·可以对分组后的数据进行统计,做聚合运算
      ·语法:

    select 列1,列2,聚合.…from表名 group by 列1,列2...

    例1:查询各种性别的人数

    select sex,count(*) from students group by sex

    例2:查询各种年龄的人数

    select age,count(*) from students group by age

    分组后的数据筛选
      ·语法:

    select 列1,列2,聚合..from表名
    group by 列1,列2,列3...
    having 列1.…聚合...

      ·having后面的条件运算符与where的相同

    例1:查询男生总人数

    方案一
    select count(*from students where sex='男’
    
    方案二:
    select sex,count(*)from students group by sex having sex=''

    获取部分行
      ·当数据量过大时,在一页中查看数据是一件非常麻烦的事情
      ·语法

    select *from 表名
    limit start,count

      ·从start开始,获取count条数据
      ·start索引从0开始
    例1:查询前3行学生信息

    select *from students limit 0,3

    要求每页显示3条
    select count(*)from students
    12/3获取总页数
    第一页
    select* from students limit 0,3     3*(1-1)
    第二页
    select * from students limit 3,3    3*(2-1)
    第三页
    select * from students limit 6,3    3*(3-1)
    第四页
    select * from students limit 9,3    3*(4-1)

    连接查询
      ·当查询结果的列来源于多张表时,需要将多张表连接成一个大的数据集,再选择合适的列返回
      ·等值连接查询:查询的结果为两个表匹配到的数据

      ·左连接查询:查询的结果为两个表匹配到的数据加左表特有的数据,对于右表中不存在的数据使用null
      填充

      ·右连接查询:查询的结果为两个表匹配到的数据加右表特有的数据,对于左表中不存在的数据使用null
      填充

     

    准备数据

    drop table if exists courses;
    create table courses( courseNo int(18) unsigned primary key auto_increment, name varchar(18) ); insertinto courses values'1''数据库'), ('2',‘qtp'), ('3''linux'), ('4’,‘系统测试'), ('5,‘单元测试'), ('6',‘测试过程'); drop table if exists scores; create table scores( id int(10) unsigned primary key auto_increment, courseNo int(10), studentno varchar(10), score tinyint(4) ); insert into scores values'1',‘1',‘001',‘90'), ('2',‘1',‘002''75'), ('3''2',‘002''98'), ('4',‘3',‘001',‘86'), ('5',‘3',‘003',‘80'), ('6',‘4',‘004',‘79'), ('7',‘5',‘005',‘96'), ('8',‘6',‘006',‘80');

    等值连接

    方式一
    select*from 表1,表2 where表1.列=表2.列

    例1:查询学生信息及学生的成绩

    select * from students,scores where students.studentno=scores.studentno
    方式二(又称内连接)
    不会产生笛卡尔积,不会产生临时表,性能高

    select * from 表1 inner join 表2 on 表1.列=表2.列
    select * from students
    inner join scores on students.studentno=scores.studentno

    例2:查询课程信息及课程的成绩

    select * from courses,scores where courses.courseNo=gcores.courseNo
    select * from couses inner join acores on courses.courseNo=acores.courseNo

    例3:查询学生信息及学生的课程对应的成绩

    select from students,courses,scores where students.studentNo=scores.studentNo and scores.courseNo=courses.courselNo
    select * from students
    inner join scores on students.studentNo=scores,studentNo
    inner join courses on scores.courseNo=courses.courseNo

    左连接

    select * from 表1
    left join 表2 on表1.列=表2.列
    例1:查询所有学生的成绩,包括没有成绩的学
    select from students stu
    left join scores sc on stu.studentNo=sc.studentNo

    例1:查询所有学生的成绩,包括没有成绩的学生
    左连接 : join前面的表称为左表 , join后面的表称为右表

    select * from students
    left join scores on students.studentNo=scores.studentNo

    例2:查询所有学生的成绩,包括没有成绩的学生,需要显示课程名

    select *from students
    left join scores on students.studentNo-scores.studentNo
    left join courses on courses.courseNo=scores.courseNo

    右连接

    insert into courses values0,语文),
    (0,数学);
    例1:查询所有课程的成绩,包括没有成绩的课程
    select
    * from scores rioht join courses on scores.courseNo=courses.courseNo
    例2:查询所有课程的成绩,包括没有成绩的课程,包括学生信息
    select* trom scores
    right join courses on scorea.courseNo-courses.courseNo
    right join students on students.studentNo=scores.studentNo.

    子查询
      ·在一个select 语句中,嵌入了另外一个select 语句,那么被嵌入的select 语句称之为子查询语句

    主查询
      ·主要查询的对象,第一条select语句
    主查询和子查询的关系
      ·子查询是嵌入到主查询中
      ·子查询是辅助主查询的,要么充当条件,要么充当数据源
      ·子查询是可以独立存在的语句,是一条完整的 select 语句
    子查询分类
      ·标量子查询:子查询返回的结果是一个数据(一行一列)

    例一:查询大于平均年龄的学生
    select avg(age) from students
    21.5833
    select * from students where age>21.5833
    
    select *from students where age>(select avg(age)from students)
    例2:查询王昭君的成绩,要求显示成绩
    select studentNo from students where name='王昭君'
    select score from scores where studentNo=(select studentNo from students where name='王昭君')

      ·列子查询:返回的结果是一列(一列多行)

    例3:查询18岁的学生的成绩,要求显示成绩
    
    select *trom atudenta where age=18
    
    select * from scores where studentNo in(1002','006')
    select * from scores where studentNo in (select studentno  from students where age=18)

      ·行子查询:返回的结果是一行(一行多列)

    例4:查询男生中年龄最大的学生信息
    select * from students where sex='男‘ and age=(select max(age) from students)
    
    select * from students where (sex,age)=(‘男‘,30)
    
    select * from students where (sex,age)=(select sex,age from students where sex=‘男‘ order by age desc limit 1)

      ·表级子查询:返回的结果是多行多列

    例5:查询数据库和系统测试的课程成绩
    select from scores as s
    inner join (select * from courses where name in(‘数据库‘,‘系统测试’)) as c on s.courseNo=c.courseNo

    子查询中特定关键字使用
      ·in 范围
        。格式:主查询where条件in(列子查询)
      ·anyl some任意一个
        。格式:主查询where列=any(列子查询)
        。在条件查询的结果中匹配任意一个即可,等价于in
      ·all
        。格式:主查询where列=all(列子查询):等于里面所有
        。格式:主查询where列<>all(列子查询):不等一其中所有

    数据库DOS命令

    数据库

    ·查看所有数据库
        show databases;
    ·使用数据库
        use数据库名;
    ·查看当前使用的数据库
        select database();
    ·创建数据库
        create database 数据库名 charset=ut棉;
    例:
        create database ceshi charset=utf8;
    ·删除数据库
        drop database数据库名;
    例:
        drop database ceshi;

    数据表

    ·查看当前数据库中所有表
        show tables;
    ·查看表结构
        desc 表名;
    查看表的创建语句
        show create table 表名;
    例:
        show create table students;

    备份

    首先要以管理员身份运行
    ·运行mysqldump 命令 mysqldump -uroot -p 数据库名 > ceshi.sql #按提示输入mysqL的密码

    恢复

    ·先创建新的数据库
        mysql -uroot -p新数据库名<ceshi.sql
    #根据提示输入my5q1密码

    内置函数

    字符串函数

    ·拼接字符串 concat(str1,str2..)
        select concat(12,34,'ab');
    
    ·包含字符个数 length(str)
        select length('abc');
    
    ·截取字符串
        。left(str,len)返回字符串str的左端len个字符
        。right(str,len)返回字符串str的右端len个字符
        。substring(str,pos,len)返回字符串str的位置pos起len个字符
        select substring('abc123',2,3);
    
    ·去除空格
        。trim(str)返回删除了左空格的字符串str
        。rtrim(str)返回删除了右空格的字符串str
        select ltrim('bar ');
    
    ·大小写转换,函数如下
        。lower(str)
        。upper(str)
        select lower('aBcD');

    数学函数

    ·求四舍五入值round(n.d),n表示原数,d表示小数位置,默认为0
        select round(1.6);
    
    ·求x的y次幂pow(x.y)
        select pow(2,3);
    
    ·获取圆周率Pl()
        select PI();
    
    ·随机数rand(),值为0-1.0的浮点数
        select rand();
    
    
    随机0-10的整数
        select round(rand()*18)
    
    随机从一个表中取一条记录
        select * from goods order by rand() limit 1

    日期时间函数

    ·当前日期current_date0
        select current_date();
    
    ·当前时间current_time0
        select current_time();
    
    ·当前日期时间now0
        select now();
    
    ·日期格式化date_fomat(date,format)
    ·参数format可选值如下
    
    %Y获取年,返回完整年份
    %y获取年,返回简写年份
    %册获取月,返回月份
    %d获取日,返回天值
    H获取时,返回24进制的小时数
    %h获取时,返回12进制的小时数
    i获取分,返回分钟数
    %s获取秒,返回秒数
    
    ·例:将使用-拼接的日期转换为使用空格拼接
        select date_format('2016-12-21','%Y %m %d");

    流程控制

    ·case语法:等值判断
    ·说明:当值等于某个比较值的时候,对应的结果会被返回;如果所有的比较值都不相等则返回else的结果;如果没有else并且所有比较值都不相等则返回null
    casewhen 比较值1 then结果1 when 比较值2 then 结果2...else 结果end
    例:
    select case 1 when 1 then ‘one' when 2 then ‘two' else 'zero' end as result;

    自定义函数

    创建
        ·语法如下
        delimiter $$
        create function函数名称(参数列表)returns 返回类型
        begin
        sql语句
        end 
        $$
        delimiter;
    ·说明:delimiter用于设置分割符,默认为分号 ·在“sql语句”部分编写的语句需要以分号结尾,此时回车会直接执行,所以要创建存储过程前需要指定其它符号作为分割符,此处使用∥,也可以使用其它字符
      示例 ·要求:创建函数my_trim,用于删除字符串左右两侧的空格 ·step1:设置分割符 delimiter $$ ·step2:创建函数
    create function my_trim(str varchar(100)) returns varchar(100) begin return ltrim(rtrim(str)); end * $$ ·step3:还原分割符 delimiter;

    创建

    ·语法如下
        delimiter//
        create procedure 存储过程名称(参数列账)
        begin
        sql语句
        end
        //
        delimiter;
    
        ·说明:delimiter用于设置分割符,默认为分号
        ·在“sql语句”部分编写的语句需要以分号结尾,此时回车会直接执行,所以要创建存储过程前需要指定其它符号作为分割符,此处使用∥,也可以使用其它字符

    调用

    ·语法如下
        call存储过程(参数列表);
    
        调用存储过程proc_stu
        call proc_stu();
    
        ·存储过程和函数都是为了可重复的执行操作数据库的sql语句的集合。
        ·存储过程和函数都是一次编译,就会被缓存起来,下次使用就直接命中缓存中已经编译好的sql,不需要重复编译
        ·减少网络交互,减少网络访问流量

    视图

    ·对于复杂的查询,在多个地方被使用,如果需求发生了改变,需要更改sql语句,则需要在多个地方进行修改,维护起来非常麻烦
    ·解决:定义视图
    ·视图本质就是对查询的封装
    ·定义视图,建议以v开头
    
        create view 视图名称 as 
        select 语句;
    
    ·例:创建视图,查询学生对应的成绩信息
    
    create view v_stu_score_course as
    select
        stu.*,cs.courseNo,Cs.name courseName,sc.score
    from
        students stu
    inner join scores sc on stu.studentNo = sc.studentNo
    inner join courses cs on cs.courseNo = sc.courselo
    
    
    ·查看视图:查看表会将所有的视图也列出来
        show tables;
    
    ·删除视图
        drop view 视图名称;
    
    例:
        drop view v_stu_score_course;
    ·使用:视图的用途就是查询
        select * from v_stu_score_course;

    事务

    为什么要有事务?

    ·事务广泛的运用于订单系统、银行系统等多种场景
    ·例如:A用户和B用户是银行的储户,现在A要给B转账500元,那么需要做以下几件事:
      1.检查A的账户余额>500元;
      2.A账户中扣除500元;
      3.B账户中增加500元;
    ·正常的流程走下来,A账户扣了500,B账户加了500,皆大欢喜。那如果A账户扣了钱之后,系统出故障了呢?A白白损失了500,而B也没有收到本该属于他的500。以上的案例中,隐藏着一个前提条件:A扣钱和B加钱,要么同时成功,要么同时失败。事务的需求就在于此
    ·所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行。所以,应该把他们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性

    转账
        大乔500
        小乔200
    
        beginupdate account set money=money-100 where name=‘大乔!
            update account set money=money+100 where name=‘小乔!
            。。。。。。。。。。。
            。。。。。。。。。。。
            若以上所有操作都成功
       commitbegin;
            任何一步失败
       rollback

    索引

    语法
    
        ·查看索引
            show index from表名;
    
        ·创建索引
        方式一:建表时创建索引
            create table create_index(
            id int primary key,
            name varchar(10unique,
            age intkey(age)
            );       
    
        方式二:对于已经存在的表,添加索引
            如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致
            字段类型如果不是字符串,可以不填写长度部分
    
            create index索引名称 on表名(字段名称(长度))
    
            例:
                create index age_index on create_index(age);
                create index name_index on create_index(name(10));
    
        ·删除索引:
            drop index索引名称on表名;

    示例

    查询
        ·开启运行时间监测:
            set profiling=1;
    
        ·查找第1万条数据test10000
            select * from test_index where title='test10000';
    
        ·查看执行的时间:
            show profiles;
    
        ·为表itle_index的title列创建索引:
            create index title_index on test_index(title(10));
    
        ·执行查询语句:
            select* from test_index where title='test10000';
    
        ·再次查看执行的时间
            show profiles;
        
    缺点
        ·虽然索引大大提高了查询速度,同时却会降凭更新表的速度,如对表进行INSERT、UPDATE和DELETE,因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件
        ·但是,在互联网应用中,查询的语句远远大于增别改的语句,甚至可以占到80%~90%,所以也不要太在意,只是在大数据导入时,可以先删除索引,再批量插入数据,最后再添加索引

    外键foreign key

    ·如果一个实体的某个字段指向另一个实体的主键,就称为外键。被指向的实体,称之为主实体(主表),也叫父实体(父表)。负责指向的实体,称之为从实体(从表),也叫子实体(子表)
    ·对关系字段进行约束,当为从表中的关系字段填写值时,会到关联的主表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失败并报错
    
    语法
        ·查看外键
            show create table 表名    
    
        ·设置外键约束
            方式一:创建数据表的时候设置外键约束
                create table class(
                id int unsigned primary key auto_increment,
                name varchar(10)
                create table stu(
                name varchar(10),
                class_id int unsigned,
                foreign key(class_id)references class(id)
                );
                foreign key(自己的字段)references 主表(主表字段)
    
            方式二:对于已经存在的数据表设置外键约束
                alter table 从表名 add foreign key(从表字段)references 主表名(主表字段);
            alter table stu add foreign key(class_id)references class(id);
    
        ·删除外键
            需要先获取外键约束名称
                show create table stu;
    
            获取名称之后就可以根据名称来删除外键约束
                alter table 表名 drop foreign key 外键名称;
                alter table stu drop foreign key stu_ibfk_1;
    
            在实际开发中,很少会使用到外键约束,会极大的降低表更新的效率

    修改密码

    ·使用root登录,修改mysql数据库的user表
        。使用password0函数进行密码加密
        。注意修改完成后需要刷新权限
    
            use mysql;
            update user set pas sword=password(’新密码”)where user='用    户名’;
    
            例:
            update user set password=password('123')where user='root';
            刷新权限:flush privileges;

    忘记root账户密码怎么办?

    1、配置mysql登录时不需要密码,修改配置文件
        ·Centos中:配置文件位置为/etc/my.cnf
        ·Windows中:配置文件位置为C:\Program Files(×86)MySQL\MySQL Server 5.1\my.ini
        修改,找到mysqld,在它的下一行,添加skip-grant-tables
    
            [mysqld]
            skip-grant-tables
    
    2、重启mysql,免密码登录,修改mysql数据库的user表
    
        use mysql;
        update user set password=password('新密码”)where user=‘用户名’;
    
        例:
            update user set password=password('123') where user='root';
            刷新权限:flush privileges;
    
    3、还原配置文件,把刚才添加的skip-grant-tables刷除,重启
  • 相关阅读:
    MySQL Binlog解析(2)
    在线修改GTID模式
    官方online ddl
    pt-osc原理
    pt-osc使用方法
    python基本数据类型
    第一句python
    搭建私有云kodexplorer
    frp搭建
    Linux下快速分析DUMP文件
  • 原文地址:https://www.cnblogs.com/zhuifeng-mayi/p/9825905.html
Copyright © 2011-2022 走看看