• mysql使用笔记(二)


    一、启动和关闭mysql服务

    windows下 
    启动 
    (方法1)管理员权限进入cmd,执行 net start mysql 
    (方法2)管理员权限进入cmd,执行 mysqld -uroot --console 
    (方法3)在计算机——服务——mysql,通过图形界面的方式启动 
    关闭 
    (方法1)管理员权限进入cmd,执行 net stop mysql 
    (方法2)管理员权限进入cmd,执行 mysqladmin -uroot shutdown 
    (方法3)在计算机——服务——mysql,通过图形界面关闭

    linux下 
    启动 
    (方法1)终端下执行 cd mysql可执行文件目录,比如cd /usr/bin,执行 
    ./mysqld_safe & 
    (方法2)终端下执行 service mysql start (这种方法需要RPM方式安装的mysql才行)

    关闭 
    (方法1)终端下执行 mysqladmin -uroot shutdown 
    (方法2)service stop mysql (这种方法需要RPM方式安装的mysql才行)

    常见的异常 
        启动时候失败,提示 [ERROR] InnoDB: .ibdata1 can't be opened in read-write mode。解决方案: 
    (1)打开任务管理器,终止mysqld.exe 
    (2)打开mysql安装目录的data文件夹,删除 ib_logfile0, ib_logfile1 
    (3)重启mysql

    二、 连接数据库

    (方法1)通过mysql workbench图形界面的方式连接 
    (方法2)在命令行下,执行 mysql -u 用户名 -p 密码 -h 主机ip,如 
    mysql -u root -p,回车后输入密码,不写 -h 表示使用本机ip地址。

    三、 SQL语句分类

        mysql支持标准sql语句,同时有自己的拓展语句。SQL语句可以分为三类: 
    (1)DDL(Data Definition Language) 数据定义语句,定义了不同的数据段、数据库、表、列、索引等数据库对象。常用的语句关键字主要包含create、drop、alter等。 
    (2)DML(Data Manipulation Language) 
    数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性。常用的语句关键字主要包括insert、delete、update、select。 
    (3)DCL(Data Control Language) 
    数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别,主要的语句关键字包含grant、revoke等。

        DML语句只是对数据库表内的数据进行操作,而DDL语句可以对表定义、结构进行修改。 
        在mysql命令行下,语句以;作为结束,每个语句之后跟;,然后回车,才会被执行。

    四、 DDL语句操作

    (4.1)创建数据库 
    create database dbname; 
    (4.2)显示当前数据库 
    show databases; 
        在安装mysql时,会自动创建4个数据库: 
    (a)information_schema: 主要保存了系统中的一些数据库对象信息,比如用户表信息、列信息、权限信息、字符集信息、分区信息。 
    (b)cluster: 存储了系统的集群信息 
    (c)mysql: 存储了系统的用户权限信息 
    (d)test: 系统自动创建的测试数据库,任何用户都可以使用

    (4.3)选择数据库 
    use dbname; 
    之后的操作,都是在选择的数据库下的操作。比如,show tables;,显示该数据库下的所有表。

    (4.4)查看当前信息 
    status,显示当前connection的信息,比如使用的数据库、用户、数据库的字符集等。

    (4.5)删除数据库 
    drop database dbname; 
    在mysql中,drop语句的操作结果均显示'0 rows affected'

    (4.6)创建表 
    create table tbname( 
    column1_name column1_constraints, 
    column2_name column2_constraints, 
    ... 

        例如,创建一个emp表,表中包括 ename(姓名)、hiredate(雇佣日期)、sal(薪水)、deptno部门编号三个字段,字段类型分别为varchar(10), date, decimal(10,2), int(2) 
    create table emp( 
    ename varchar(10), 
    hiredate date, 
    sal decimal(10, 2), 
    deptno int(2)) 

    (4.6) 查看表定义 
    desc tbname;,desc 可以查看表定义,但是输出信息不够全面,可以通过 show create table tbname G;来查看更加详细的信息,比如存储引擎,字符集等。"G"选项是使得记录能够按照字段竖向排列,以便更好的显示内容较长的记录。

    (4.7)删除表 
    drop table tbname;

    (4.8)修改表 
        大多数情况下,表结构的修改都通过alter table语句,常用的操作包括: 
    <1> 修改字段 
    alter table tbname modify column_name column_definition [first|after col_name] 
    比如 alter table emp modify ename varchar(20); #将enmae列类型修改为varchar(20) 
    <2> 增加字段 
    alter table tbname add column_name column_definition [first|after col_name] 
    比如 alter table emp add age int(3) #在emp表中添加列age 
    <3> 删除字段 
    alter table tbname drop column_name 
    比如 alter table emp drop age; 
    <4> 字段改名 
    alter table tbname change old_col_name new col_name [new_col_definition] [first|after col_name]#[]表示其包含的内容可有可无 
    比如 alter table emp change age age1 int(4);#将age字段改名为age1,同时修改字段类型为int(4) 
        change和modify都可以修改表的定义,不同的是change后面需要写两次列明,但是change可以修改列名称,而modify不能。 
    <5> 修改字段排列顺序 
    上面的add/change/modify操作语句中都有 [first|after col_name]选项,用来修改字段在表中的位置,add新加的字段默认是加在表的最后位置,而change/modify默认都不会改变字段的位置。 
    比如 alter table emp add birth date after ename; #将新增的birth字段加在ename之后 
    alter table emp modify age int(3) first; #将字段age放在最前面 
    <6> 更改表名 
    alter table tbname rename new_name

    五、 DML语句

    (5.1)插入记录 
    insert into tbname (field1, field2, ...fieldn) values (val1, val2, ...valn) 
    也可以不用指定字段名称,但是values后面的顺序应该和表中字段顺序一致,含可控字段、非空但是含有默认值的字段、自增字段,可以不用在insert后的字段列表里面出现,values后面只写对应字段名称的value。 
        insert语句可以一次性插入多条记录,格式为: 

    insert into tbname (field1, field2, ...fieldn) values 
    (val11, val12, ... val1n), 
    (val21, val22, ... val2n), 
    .... 
    (valk1, valk2, ... valkn)

    (5.2)更新记录 
    update tbname set col1 = val1, col2 = val2 .. [where condition] 
        在mysql中,update命令可以同时更新多个表中的数据,格式如下: 
    update t1, t2, ...tn set t1.field1=expr1, ... tn.fieldn=exprn [where condition] 
    比如 udpate emp a, dept b set a.sal=b.sal*b.deptno, b.deptname=a.ename where a.deptno=b.deptno;#emp表(记为a)和dept表(记为b),a中存放雇员信息,包括雇员薪水和其所在的部门号;b中存放部门信息,包括部门号和部门名称。对于给出a的一条雇员信息记录,通过其部门号deptno,从b中找到该deptno对应的deptname.....

    (5.3)删除记录 
        如果记录不再需要,可以用delete命令删除 
    delete from tbname [where condition] 
    在mysql中可以一次删除多一个表中的数据,格式如下: 
    delete t1,t2....tn from t1,t2...tn [where condition] 如果from后面的表名为别名,则delete后面也要用相应的别名,否则会提示语法错误。 
    无论是单表还是多表,如果不加where条件,会将表的所有记录删除。

    (5.4)查询记录 
    select field1, field2,....fieldn from tbname [where condition] 
    <1> 普通查询 
    比如: 
    select age, deptno from emp where sal > 1000 and deptno = 1; 
    select * from emp; 
    <2> 查询不重复的记录 
    有时候需要将表中重复的记录去掉后显示出来,可以用distnict关键字来实现: 
    select distinct deptno from emp; 
    <3> 排序和限制 
    如果需要返回按照某个字段排序后的结果集,可以使用order by实现: 
    select * from tbname [where condition] order by field1 [desc|asc], 
    field2 [desc|asc] ... fieldn[desc|asc]
     
    排序规则默认为asc(升序排序)

    (5.4)聚合 
        对数据进行汇总操作,group by 
    select [field1, field2 ... fieldn] fun_name from tbname [where where_condition] 
    [group by field1, field2....fieldn] [with rollup] [having where_condition]

    fun_name 表示要做的聚合操作,即聚合函数,常用的有sum,count,max,min,avg等 
    group by关键字表示要进行分类聚合的字段,比如要按照部门分类统计员工数量,部门就应该写在group by后面 
    with rollup 可选语法,表明是否对分类聚合后的结果进行再汇总 
    having 关键字表示对分类后的结果再进行条件的过滤 
    having和where的区别:having是对聚合后的结果进行条件的过滤,而where是在聚合前就对记录进行过滤,如果逻辑允许,尽可能使用where先过滤记录,这样减少结果集,提高效率。

    比如: 
    select count(1) from emp; 统计公司雇员人数 
    select deptno, count(1) from emp group by deptno; 统计各个部门的人数 
    select deptno, count(1) from emp group by deptno with rollup;统计各部门人数,最后进行汇总 
    select deptno, count(1) from emp group by deptno having count(1) > 1;统计部门人数大于1的各个部门以及该部门的人数 
    select max(val), min(val), sum(val) from emp; 统计所有的雇员中的最大、最小、总薪水值

    (5.5)表连接 
        当需要同时显示多个表中的字段,需要用到表连接。表连接分为内连接外连接,之间的主要区别是,内连接仅选出两张表中互相匹配的记录,外连接会选出其他不匹配的记录,常用内连接。 
    比如: 
    内连接select ename, deptname from emp, dept where emp.deptno = dept.deptno; 
    外连接分为左连接和右连接,左连接是指包含所有的左边的表中的记录,即使有些记录在右边的表中没有与之相匹配的记录; 
    右连接是指包含所有的右边表中的记录,即使有些左边表中没有与之匹配的记录。 
    比如: 
    select ename, deptname from emp left join dept on emp.deptno=dept.deptno;emp表左连接dept表,连接后的结果中包含emp表中的所有的ename,即使该ename对应的员工的deptno在dept表中不存在。

    (5.6)子查询 
        某些情况下,当进行查询的时候,需要的条件就是另外一个select的结果,这个时候需要用到子查询。用于子查询的关键字主要包括 in, not in, =, !=, exists, not exists等。 
    比如: 
    select * from emp where deptno in (select deptno from dept);只查找deptno在dept表中存在的那些deptno的emp中的记录。 
        如果子查询记录数唯一,还可以用 = 代替 in。 
        某些情况下,子查询可以转化为表连接,例如: 
    select * from emp where deptno in (select deptno from dept); 
    转化为表连接之后,为 select emp.* from emp, dept where emp.deptno=dept.deptno;

    (5.7)记录联合 
        如果需要将两个表的数据按照一定的查询条件查询出来以后,将结果合并到一起显示出来,此时需要用union和union all关键字来实现这样的功能: 
    select * from t1 union|union all 
    select * from t2 union|union all 
    .... 
    select * from tn; 

        union和union all的区别在于:union all是把结果集直接合并在一起,而union是将union all的结果进行一次distinct,去除重复记录后的结果。

        比如,将emp和dept表中的部门编号的集合显示出来: 
    select deptno from emp union all select deptno from dept;这样将显示所有的在emp表和deptno表中出现的deptno,去掉重复:select deptno from emp union select deptno from dept;

    六、DCL语句

        DCL语句主要是DBA用来管理系统中的对象使用权限时使用,一般的开发人员很少使用。 
        比如创建一个数据库用户zl,具有对sakila数据库中所有表的select/insert权限: 
    mysql -u root -p 
    grant select,insert on sakila.* to 'zl'@'localhost' identified by '123';此时,数据库sakila多了一个新的用户zl,密码为123,且具有select,insert权限。 
        由于权限变更,需要将zl的权限修改,收回insert,只能对数据进行select操作: 
    mysql -u root -p 
    revoke insert on sakila.* from 'zl'@'localhost';

    七、 查询元数据信息

        msql 5.5之后,提供了新的数据库information_schema,用来记录mysql中的元数据信息。元数据指数据的数据,比如表名、列名、列类型、索引名等表的各种属性名称。该数据库是一个虚拟的数据库,物理上不存在相关的目录和文件,通过show tables显示的并不是实际存在的表,全部是视图。 
        一些比较常用的视图: 
    schemata:提供了当前mysql示例中的所有数据库的信息,show databases的结果来自于该表; 
    tables:提供了关于数据库中的表的信息(包括视图),详细表述了某个表属于哪个schema、表类型、表引擎、创建时间等信息。show tables from schemaname的结果来自该表; 
    colunms:提供了表中的列信息,详细表述了某张表的所有列以及每个列的信息,show columns from schemaname.tablename的结果取自该表; 
    statistics:该表提供了关于表索引的信息

        利用数据库元信息进行一些操作,比如删除数据库 test1 下所有前缀为tmp的表: 
    select concat('drop table test1.', table_name, ';') from tables where table_schema='test1' and table_name like 'tmp%';

  • 相关阅读:
    点餐网站学习(EF+MVC)SEO站内结构
    点餐网站学习(EF+MVC)EF工具,自动创建模型并建立数据库映射关系
    个性化定制cms介绍
    EasyUI Munubutton 二级菜单
    程序员也是文艺青年
    EasyUI combobox加入请选择 [.net后台代码]
    LVS配置记录
    查询MYSQL库表使用空间
    python django 数据库操作
    Nginx修改版本信息或隐藏版本号
  • 原文地址:https://www.cnblogs.com/gtarcoder/p/4980735.html
Copyright © 2020-2023  润新知