• Mysql 用法


            MySQL数据库是一个十分轻便的数据库管理系统,相比大型的数据库管理系统如Oracle、MS-SQL ,MySQL更拥有轻便、灵活、开发速度快的特色,更适用于中小型数据的存储与架构。MySQL之所以能够被数以万计的网站采用,也是由此而来。
       数据库的基础很少,但数据库的性能优化却是最重要的,所以多多优化,必有裨益。

    1、新建用户:

        >CREATE USER name IDENTIFIED BY 'ssapdrow';

    2、更改密码:

        >SET PASSWORD FOR name=PASSWORD('fdddfd');

    3、权限管理

        >SHOW GRANTS FOR name; //查看name用户权限

        >GRANT SELECT ON db_name.* TO name;    //给name用户db_name数据库的所有权限

        >REVOKE SELECT ON db_name.* TO name;    //GRANT的反操作,去除权限;

    一、数据库操作: 

      1、查看数据库:

        >SHOW DATABASES;

      2、创建数据库:

        >CREATE DATABASE db_name;  //db_name为数据库名

      3、使用数据库:

        >USE db_name;

      4、删除数据库:

        >DROP DATABASE db_name;

    二、创建表:

      1、创建表:

        >CREATE TABLE table_name(

        >id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,    //id值,无符号、非空、递增——唯一性,可做主键。

        >name VARCHAR(60) NOT NULL

        >score TINYINT UNSIGNED NOT NULL DEFAULT 0,    //设置默认列值

        >PRIMARY KEY(id)

        >)ENGINE=InnoDB    //设置表的存储引擎,一般常用InnoDB和MyISAM;InnoDB可靠,支持事务;MyISAM高效不支持全文检索

        >DEFAULT charset=utf8;  //设置默认的编码,防止数据库中文乱码

        如果有条件的创建数据表还可以使用 >CREATE TABLE IF NOT EXISTS tb_name(........

      2、复制表:

        >CREATE TABLE tb_name2 SELECT * FROM tb_name;

        或者部分复制:

        >CREATE TABLE tb_name2 SELECT id,name FROM tb_name;

      3、创建临时表:

        >CREATE TEMPORARY TABLE tb_name(这里和创建普通表一样);

      4、查看数据库中可用的表:

        >SHOW TABLES;

      5、查看表的结构:

        >DESCRIBE tb_name;

        也可以使用:

        >SHOW COLUMNS in tb_name;     //from也可以

      6、删除表:

        >DROP [ TEMPORARY ] TABLE [ IF EXISTS ] tb_name[ ,tb_name2.......];

        实例:

        >DROP TABLE IF EXISTS tb_name;

      7、表重命名:

        >RENAME TABLE name_old TO name_new;

        还可以使用:

        >ALTER TABLE name_old RENAME name_new;

    三、修改表:

      1、更改表结构:

        >ALTER TABLE tb_name ADD[CHANGE,RENAME,DROP] ...要更改的内容...

        实例:

        >ALTER TABLE tb_name ADD COLUMN address varchar(80) NOT NULL;

        >ALTER TABLE tb_name DROP address;

        >ALTER TABLE tb_name CHANGE score score SMALLINT(4) NOT NULL;

    四、插入数据:

      1、插入数据:

        >INSERT INTO tb_name(id,name,score)VALUES(NULL,'张三',140),(NULL,'张四',178),(NULL,'张五',134);

        这里的插入多条数据直接在后边加上逗号,直接写入插入的数据即可;主键id是自增的列,可以不用写。

      2、插入检索出来的数据:

        >INSERT INTO tb_name(name,score) SELECT name,score FROM tb_name2;

    五、更新数据:

      1、指定更新数据:

        >UPDATE tb_name SET score=189 WHERE id=2;

        >UPDATE tablename SET columnName=NewValue [ WHERE condition ]

    六、删除数据:

      1、删除数据:

        >DELETE FROM tb_name WHERE id=3;

    七、条件控制:

      1、WHERE 语句:

        >SELECT * FROM tb_name WHERE id=3;

      2、HAVING 语句:

        >SELECT * FROM tb_name GROUP BY score HAVING count(*)>2

      3、相关条件控制符:

        =、>、<、<>、IN(1,2,3......)、BETWEEN a AND b、NOT

        AND 、OR

        Linke()用法中 % 为匹配任意、 _ 匹配一个字符(可以是汉字)

        IS NULL 空值检测

    八、MySQL的正则表达式:

      1、Mysql支持REGEXP的正则表达式:

        >SELECT * FROM tb_name WHERE name REGEXP '^[A-D]' //找出以A-D 为开头的name

      2、特殊字符需要转义。

    九、MySQL的一些函数:

      1、字符串链接——CONCAT()

        >SELECT CONCAT(name,'=>',score) FROM tb_name

      2、数学函数:

        AVG、SUM、MAX、MIN、COUNT;

      3、文本处理函数:

        TRIM、LOCATE、UPPER、LOWER、SUBSTRING

      4、运算符:

        +、-、*、

      5、时间函数:

        DATE()、CURTIME()、DAY()、YEAR()、NOW().....

    十、分组查询:

      1、分组查询可以按照指定的列进行分组:

        >SELECT COUNT(*) FROM tb_name GROUP BY score HAVING COUNT(*)>1;

      2、条件使用Having;

      3、ORDER BY 排序:

        ORDER BY DESC|ASC    =>按数据的降序和升序排列

    十一、UNION规则——可以执行两个语句(可以去除重复行)

    十二、全文检索——MATCH和AGAINST

      1、SELECT MATCH(note_text)AGAINST('PICASO') FROM tb_name;

      2、InnoDB引擎不支持全文检索,MyISAM可以;

    十三、视图

      1、创建视图

        >CREATE VIEW name AS SELECT * FROM tb_name WHERE ~~ ORDER BY ~~;

      2、视图的特殊作用:

          a、简化表之间的联结(把联结写在select中);

          b、重新格式化输出检索的数据(TRIM,CONCAT等函数);

          c、过滤不想要的数据(select部分)

          d、使用视图计算字段值,如汇总这样的值。

    十四、使用存储过程:

      个人理解,存储过程就是一个自定义函数,有局部变量参数,可传入参数,可以返回值,不过这语法够呆滞的~~~

      1、创建存储过程:

        >CREATE PROCEDURE pro(

        >IN num INT,OUT total INT)

        >BEGIN

        >SELECT SUM(score) INTO total FROM tb_name WHERE id=num;

        >END;

       ***这里的 IN (传递一个值给存储过程),OUT(从存储过程传出一个值),INOUT(对存储过程传入、传出),INTO(保存变量)

      2、调用存储过程:

        >CALL pro(13,@total)      //这里的存储过程两个变量,一个是IN一个是OUT,这里的OUT也是需要写上的,不写会出错

        >SELECT @total         //这里就可以看到结果了;

      3、存储过程的其他操作:

        >SHOW PROCEDURE STATUS;      //显示当期的存储过程

        >DROP PROCEDURE pro;         //删除指定存储过程

    十五、使用游标:

      对这个理解不是很懂,朋友多多指点哦~~~

       1、游标的操作

        >CREATE PROCEDURE pro()

        >BEGIN

        >DECLARE ordername CURSOR FOR

        >SELECT order_num FROM orders;

        >END;

        >OPEN ordername;    //打开游标

        >CLOSE ordername;    //关闭游标

    十六、触发器:

      触发器是指在进行某项指定操作时,触发触发器内指定的操作;

      1、支持触发器的语句有DELETE、INSERT、UPDATE,其他均不支持

      2、创建触发器:

        >CREATE TRIGGER trig AFTER INSERT ON ORDERS FOR EACH ROW SELECT NEW.orser_name;

        >INSERT语句,触发语句,返回一个值

      3、删除触发器

        >DROP TRIGGER trig;

    十七、语法整理:

      1、ALTER TABLE(修改表)

        ALTER TABLE table_name

        (  ADD    column  datatype   [ NULL | NOT NULL ]  [ CONSTRAINTS ]

           CHANGE  column   datatype   COLUMNS  [ NULL | NOT NULL ]   [ CONSTRAINTS ]

           DROP    column,

           。。。。

        )

      2、COMMIT(处理事务)

        >COMMIT;

      3、CREATE INDEX(在一个或多个列上创建索引)

        CREATE INDEX index_name ON tb_name (column [ ASC | DESC ] , .......);

      4、CREATE PROCEDURE (创建存储过程)

        CREATE PROCEDURE pro([ parameters ])

        BEGIN

        ........

        END

      5、CREATE TABLE(创建表)

        CREATE TABLE tb_name(

        column_name  datetype  [ NULL | NOT NULL ]   [ condtraints] ,

        column_name  datetype  [ NULL | NOT NULL ]   [ condtraints] ,

        .......

        PRIMARY KEY( column_name )

        )ENGINE=[ InnoDB | MyiSAM ]DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

      6、CREATE USER(创建用户)

        CREATE USER user_name [ @hostname ] [ IDENTIFIED BY [ PASSWORD ] 'pass_word' ];

      7、CREATE VIEW (在一个或多个表上创建视图)

        CREATE [ OR REPLACE ] VIEW view_name AS SELECT。。。。。。

      8、DELETE (从表中删除一行或多行)

        DELETE FROM table_name [WHERE ......]

      9、DROP(永久删除数据库及对象,如视图、索引等)

        DROP DATEBASE | INDEX | PROCEDURE | TABLE | TRIGGER | USER | VIEW name

      10、INSERT (给表添加行)

        INSERT INTO tb_name [ ( columns,...... ) ] VALUES(value1,............);

        使用SELECT值插入:

        INSERT INTO tb_name [ ( columns,...... ) ]

        SELECT columns , ....... FROM tb_name [ WHERE ...... ] ;

       11、ROLLBACK(撤销一个事务处理块)

        ROLLBACK [ TO savapointname ];

       12、SAVEPOINT(为ROLLBACK设置保留点)

        SAVEPOINT sp1;

       13、SELECT (检索数据,显示信息)

        SELECT column_name,.....FROM tb_name [ WHERE ] [ UNION ] [ RROUP BY ] [ HAVING ] [ ORDER BY ]

      14、START TRANSACTION (一个新的事务处理块的开始)

        START TRANSACTION

       15、UPDATE(更新一个表中的一行或多行)

        UPDATE tb_name SET column=value,......[ where ]


    一、外连接
    外连接可分为:左连接、右连接、完全外连接。
    1、左连接 left join 或 left outer join
    SQL语句:select * from student left join course on student.ID=course.ID
    左连接图片
    (http://www.dedecms.com/uploads/allimg/120709/09233360W-2.jpg)
    左外连接包含left join左表所有行,如果左表中某行在右表没有匹配,则结果中对应行右表的部分全部为空(NULL).
    注:此时我们不能说结果的行数等于左表数据的行数。当然此处查询结果的行数等于左表数据的行数,因为左右两表此时为一对一关系。

    2、右连接 right join 或 right outer join
    SQL语句:select * from student right join course on student.ID=course.ID
    执行结果:
    右连接图片
    (http://www.dedecms.com/uploads/allimg/120709/09233355A-3.jpg)
    右外连接包含right join右表所有行,如果左表中某行在右表没有匹配,则结果中对应左表的部分全部为空(NULL)。
    注:同样此时我们不能说结果的行数等于右表的行数。当然此处查询结果的行数等于左表数据的行数,因为左右两表此时为一对一关系。

    3、完全外连接 full join 或 full outer join
    SQL语句:select * from student full join course on student.ID=course.ID
    执行结果
    (http://www.dedecms.com/uploads/allimg/120709/0923333J0-4.jpg)
    完全外连接包含full join左右两表中所有的行,如果右表中某行在左表中没有匹配,则结果中对应行右表的部分全部为空(NULL),如果左表中某行在右表中没有匹配,则结果中对应行左表的部分全部为空(NULL)。


    二、内连接 join 或 inner join
    SQL语句:select * from student inner join course on student.ID=course.ID
    执行结果:
    (http://www.dedecms.com/uploads/allimg/120709/0923335623-5.jpg)
    inner join 是比较运算符,只返回符合条件的行。
    此时相当于:select * from student,course where student.ID=course.ID


    三、交叉连接 cross join
    1.概念:没有 WHERE 子句的交叉联接将产生连接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。
    SQL语句:select * from student cross join course
    执行结果:
    (http://www.dedecms.com/uploads/allimg/120709/092333N91-6.jpg)
    如果我们在此时给这条SQL加上WHERE子句的时候比如SQL:select * from student cross join course where student.ID=course.ID
    此时将返回符合条件的结果集,结果和inner join所示执行结果一样。
    四、两表关系为一对多,多对一或多对多时的连接语句
    当然上面两表为一对一关系,那么如果表A和表B为一对多、多对一或多对多的时候,我们又该如何写连接SQL语句呢?
    其实两表一对多的SQL语句和一对一的SQL语句的写法都差不多,只是查询的结果不一样,当然两表也要略有改动。
    比如表1的列可以改为:
    Sno Name Cno
    表2的列可以改为:
    Cno CName
    这样两表就可以写一对多和多对一的SQL语句了,写法和上面的一对一SQL语句一样。
    下面介绍一下当两表为多对多的时候我们该如何建表以及些SQL语句。
    新建三表:

    表A:? student 截图如下:
    http://www.dedecms.com/uploads/allimg/120709/0923333108-7.jpg
    表B: course 截图如下
    http://www.dedecms.com/uploads/allimg/120709/0923331107-8.jpg
    表C: student_course 截图如下:
    http://www.dedecms.com/uploads/allimg/120709/0923332511-9.jpg

    一个学生可以选择多门课程,一门课程可以被多个学生选择,因此学生表student和课程表course之间是多对多的关系。
    当两表为多对多关系的时候,我们需要建立一个中间表student_course,中间表至少要有两表的主键,当然还可以有别的内容。
    SQL语句:select s.Name,C.Cname from student_course as sc left join student as s on s.Sno=sc.Sno left join course as c on c.Cno=sc.Cno
    执行结果:
    http://www.dedecms.com/uploads/allimg/120709/0923332406-10.jpg
    此条SQL执行的结果是学生选课的情况。

  • 相关阅读:
    hdu 2485 Destroying the bus stations 迭代加深搜索
    hdu 2487 Ugly Windows 模拟
    hdu 2492 Ping pong 线段树
    hdu 1059 Dividing 多重背包
    hdu 3315 My Brute 费用流,费用最小且代价最小
    第四天 下载网络图片显示
    第三天 单元测试和数据库操作
    第二天 布局文件
    第一天 安卓简介
    Android 获取存储空间
  • 原文地址:https://www.cnblogs.com/limou956259/p/10690106.html
Copyright © 2020-2023  润新知