• mysql基本使用


    mysql的使用

    mysql产品

        mysql百科

            瑞典MySQL AB公司开发,目前属于Oracle公司。

            MySQL是一种关联数据库管理系统 由于其体积小、速度快、总体拥有成本低

            MySQL软件采用了双授权政策(本词条"授权政策"),它分为社区版和商业版    

            LDAP

    mysql产品的版本

        搜索关键字    MySQL各版本的区别

        Community版本

        Enterprise版本

            MySQL标准版     

            MySQL企业版

            MySQL集群版

        下载Community版本, 免费..... OK

        Enterprise版本 30天试用期

        http://www.mysql.com/

    Community完全够用了。Enterprise收费的,有问题mysql官方可以支持。

    mysql产品下载

        版本细节

            linux(32 64) win(32 64)

    请到如下网站

    https://www.mysql.com/

    官方文档上有关MySQL安装文件类型说明:

      Linux supports anumber of different solutions for installing MySQL. The recommended method isto use one of the distributions from Oracle. If you choose this method, thereare three options available:

      (1)Installingfrom a generic binary package in .tar.gz format. See Section 2.2,"Installing MySQL from Generic Binaries on Unix/Linux" for moreinformation.

      (2)Extractingand compiling MySQL from a source distribution. For detailed instructions,see Section 2.9, "InstallingMySQL from Source".

      (3)Installingusing a pre-compiled RPM package. For more information on using the RPMsolution, see Section 2.5.1,"Installing MySQL from RPM Packages on Linux".

    --这里讲了3种方式来安装MySQL数据库:

    第一种,二进制包

    第二种,源码包

    第三种,rpm包

    MySQL Community Server--------mysql的社区版本,开源、免费

    MySQL Enterprise Edition---------mysql企业版,非免费

    MySQL Cluster-----------------------mysql集群版本,开源、免费

    MySQL各个版本区别

        http://www.admin10000.com/Document/62.html

    SQL structed query language

    Sql语言的组成部分

    DDL

    DML

    完整性定义语言:DDL的一部分功能

    试图定义:

    事物控制:

    嵌入式SQL和动态SQL:

    授权:DCL

    使用程序设计语言如果跟RDBMS交互

    嵌入式SQL:与动态SQL类似,但其语言必须程序编译时完全确定下来

    ODBC

    动态SQL: 程序设计语言使用函数(mysql_connect())或者方法与RDBMS服务建立连接,并进行交互:通过建立连接向SQL服务器发送查询语句,并将结果保存至变量中而后进行处理

    mysql的引擎

    MyiSAM 不支持事物,性能好

    查询比较多,修改比较少,比如仓库

    InnoDB 支持事物

    在线交易,比如淘宝,经常修改

     数据库中的存储引擎其实是对使用了该引擎的表进行某种设置

    MyISAM:

    每表三个文件:

    .frm:表结构

    .idb:表数据

    .MYI:表索引

    InnoDB:

    所有表共享的一个表空间文件:

    建议:每表一个独立的表空间:

    .frm:表结构

    .ibd:表空间(表数据和表索引)

    //查看引擎

    mysql> SHOW ENGINES;

    客户端工具

    mysql 客户端工具

    mysql

    mysqldump

    mysqladmin

    mysqlcheck

    mysqlport

    MySQL非客户端工具

    myisamchk

    myisampack

    DML

    DML:数据操作语言 增、删、查、改

    INSERT

    DELETE

    SELECT

    UPDATE

    DLL

    DDL:数据定义语言 创建、删除、修改

    CREATE

    DROP

    ALTER

    DCL

    DCL:数据控制语言

    GRANT

    REVOKE

    是用来设置或更改数据库用户或角色权限的语句

    数据库的操作

    连接MYSQL服务器:mysql -uroot -proot

        mysql -uroot -p --default_character_set=gbk; (影响数据的输入和输出)

        show variables like 'character%';

    数据库的操作:创建,查看,修改,删除

        *创建:

            创建一个名称为mydb1的数据库。

                create database mydb1;

            创建一个使用utf-8字符集的mydb2数据库。

                create database mydb2 character set utf8;

            创建一个使用utf-8字符集,并带校对规则的mydb3数据库。

                create database mydb3 character set utf8 collate utf8_general_ci;

        *查看:

            显示所有数据库

                show databases;

            显示创建数据库的语句信息

                show create database mydb2;

        *修改:

            修改mydb1的字符集为gbk(不能修改数据库名)

                alter database mydb1 character set utf8;    

        *删除:

            删除数据库mydb2

                drop database mydb1;

    表的操作

    表的操作:创建,查看,修改,删除

        *创建:

            根据实体类Person创建表person

                Person {

                    int id;

                    String name;

                }

                create table person(

                    id int,

                    name varchar(20)

                );

    数据类型

    mysql中的数据类型:

    bit 1位 但可以指定位数,如:bit<3>

    int 2字节 可以指定最大位数,如:int<4> 最大为4位的整数

    float 2个字节 可以指定最大的位数和最大的小数位数,如:float<5,2> 最大为一个5位的数,小数位最多2位

    double 4个字节 可以指定最大的位数和最大的小数位数,如:float<6,4> 最大为一个6位的数,小数位最多4位

    char 必须指定字符数,如char(5) 为不可变字符 即使存储的内容为'ab',也是用5个字符的空间存储这个数据

    varchar 必须指定字符数,如varchar(5) 为可变字符 如果存储的内容为'ab',占用2个字符的空间;如果为'abc',则占用3个字符的空间

    text: 大文本(大字符串)

    blob:二进制大数据 如图片,音频文件,视频文件

    date: 日期 如:'1921-01-02'

    datetime: 日期时间 如:'1921-01-02 12:23:43'

    timeStamp: 时间戳,自动赋值为当前日期时间

    表的基本操作

            创建一个员工表

                create table employee(id int,name varchar(20),sex bit,birthday date,salary double,entry_date date,resume text);

        *查看

            查看所有的表:

                show tables;

            查看指定表的创建语句

                show create table employee;

                mysql表 名称区分大小写

            显示指定表的结构:

                desc employee;

        *删除

            删除employee表

            drop table employee;

        *修改表

            增加一个字段:alter table worker add column height double;

            修改一个字段:alter table worker modify column height float;

            删除一个字段:alter table worker drop column height;

            更改表名:rename table employee to worker;

            修改表的字符集:alter table worker character set gbk;

        

    表数据的CRUD

        *C(create增加数据) Insert语句

            新建Employee表并表中添加一些记录

                create table employee(

                    id int,

                    name varchar(20),

                    sex bit,

                    birthday date,

                    salary double,

                    entry_date date,

                    resume text

                );

                create table employee(id int, name varchar(20),sex bit,birthday date,salary double,entry_date date,resume text);

    插入数据

                insert into employee(id,name,sex,birthday,salary,entry_date,resume) values(1,'张三',1,'1983-09-21',15000,'2012-06-24','一个大牛');

                insert into employee(id,name,sex,birthday,salary,entry_date,resume) values(2,'李四',1,'1984-09-21',10000,'2012-07-24','一个中牛');

                insert into employee(id,name,sex,birthday,salary,entry_date,resume) values(3,'王五',0,'1985-09-21',7000,'2012-08-24','一个小牛');

                delete from employee where id=1

                create table employee(    id int,name varchar(20),sex bit,birthday date,salary double,entry_date date,resume text);

        

    修改数据    

    *U(update更新数据) Update语句

            将所有员工薪水都增加500元。

                update employee set salary=salary+500;

            将王五的员工薪水修改为10000元,resume改为也是一个中牛

                update employee set salary=10000,resume='也是一个中牛' where name='王五';

    删除数据

        *D(drop删除数据) Delete语句

            删除表中姓名为王五的记录。

                delete from employee where name='王五';

            删除表中所有记录。

                delete from employee; --可以有条件,但删除所有记录差了一点

            使用truncate删除表中记录。

                truncate employee;--无条件 效率高

        

        *R(Retrieve查找数据) Select语句    

            准备环境:

                create table student(

                id int,

                name varchar(20),

                chinese int,

                english int,

                math int

                );

                insert into student(id,name,chinese,english,math) values(1,'何东',80,85,90);

                insert into student(id,name,chinese,english,math) values(2,'权筝',90,95,95);

                insert into student(id,name,chinese,english,math) values(3,'何南',80,96,96);

                insert into student(id,name,chinese,english,math) values(4,'叶坦',81,97,85);

                insert into student(id,name,chinese,english,math) values(5,'何西',85,84,90);

                insert into student(id,name,chinese,english,math) values(6,'丁香',92,85,87);

                insert into student(id,name,chinese,english,math) values(7,'何北',75,81,80);

                insert into student(id,name,chinese,english,math) values(8,'唐娇',77,80,79);

                insert into student(id,name,chinese,english,math) values(9,'任知了',95,85,85);

                insert into student(id,name,chinese,english,math) values(10,'王越',94,85,84);

            查询表中所有学生的信息。

                select * from student;

            查询表中所有学生的姓名和对应的英语成绩。

                select name,english from student;

    内置函数练习

    重复

            过滤表中重复数据。

                select english from student;

                select DISTINCT english from student;

                select DISTINCT english,name from student;

                select english+chinese+math from student;

                select english+chinese+math as 总分 from student;

                select name,english+chinese+math as 总分 from student;

            在所有学生英语分数上加10分特长分。

                select name,english+10 from student;

            统计每个学生的总分。

                select english+chinese+math from student;

    别名

            使用别名表示学生分数

                select name,english+chinese+math as 总分 from student;

                select name,english+chinese+math 总分 from student;

            查询姓名为何东的学生成绩

                select * from student where name='何东';

            查询英语成绩大于90分的同学

                select * from student where english>90;

            查询总分大于250分的所有同学

                select * from student where english+chinese+math>250;

    范围匹配

            查询英语分数在 85-95之间的同学。

                select * from student where english>=85 and english<=95;

                select * from student where english between 85 and 95;

    or

            查询数学分数为84,90,91的同学。

                select * from student where math=84 or math=90 or math=91;

    in

                select * from student where math in(84,90,91);

            查询所有姓何的学生成绩。

    模糊查询

                select * from student where name like '何%';

    and

            查询数学分>85,语文分>90的同学。

                select * from student where math>85 and chinese>90;

    oder by [asc/desc]

            对数学成绩排序后输出。

                select * from student order by math;

            对总分排序后输出,然后再按从高到低的顺序输出

                select * from student order by math+chinese+english desc;

            对姓何的学生成绩排序输出

                select * from student where name like '何%' order by math+chinese+english desc;

                select name, math+chinese+english from student where name like '何%' order by math+chinese+english desc;

    count

            统计一个班级共有多少学生?

                select count(*) from student;

            统计数学成绩大于90的学生有多少个?

                select count(*) from student where math>90;

            统计总分大于250的人数有多少?

                select count(*) from student where math+chinese+english>250;

    sum

            统计一个班级数学总成绩?

                select sum(math) from student;

            统计一个班级语文、英语、数学各科的总成绩

                select sum(math), sum(chinese), sum(english) from student;

            统计一个班级语文、英语、数学的成绩总和

                select sum(math+chinese+english)from student;

                select sum(math)+sum(chinese)+sum(english) from student;

    avg

            求一个班级数学平均分?

                select avg(math) from student;

            求一个班级总分平均分

                select avg(math+chinese+english)from student;

                select avg(math)+avg(chinese)+avg(english) from student;

    maxAndmin

            求班级最高分和最低分

                select max(math+chinese+english),min(math+chinese+english) from student;

        

    group by

            综合性练习:为学生表,增加一个班级列,然后训练分组查询

            查出各个班的总分,最高分

                准备环境

                    给表添加一个字段:alter table student add column class_id int;

                    更新表:

                        update student set class_id=1 where id<=5;

                        update student set class_id=2 where id>5;

                select sum(math+chinese+english),max(math+chinese+english) from student group by class_id;

            查询出班级总分大于1300分的班级ID

                select class_id from student group by class_id having sum(math+chinese+english)>1300;

                select class_id from student where sum(math+chinese+english)>1300 group by class_id ;

            note:where和group区别: 在wehre子句中不能使用分组函数

            

            

    时间和日期

            mysql> select year (now()), month(now()), day(now()) , date(now());

            +--------------+--------------+------------+-------------+

            | year (now()) | month(now()) | day(now()) | date(now()) |

            +--------------+--------------+------------+-------------+

            | 2014 | 9 | 7 | 2014-09-07 |

            +--------------+--------------+------------+-------------+

          

            select date_add(now(), INTERVAL 2 year) from dual;//增加两年

            select charset('name') employee;

            select date_add(now(), INTERVAL -1 day) 昨天, now() 今天, date_add(now(), INTERVAL +1 day) 明天;

    字符串相关函数

        select concat( charset('name'), 'aaaa') 自定义 from dual;

    约束

    表的约束  

        *定义主键约束 primary key:不允许为空,不允许重复

        *定义主键自动增长 auto_increment

        *定义唯一约束 unique

        *定义非空约束 not null

        *定义外键约束 constraint ordersid_FK foreign key(ordersid) references orders(id)

        *删除主键:alter table tablename drop primary key ;

        create table myclass

        (

            id INT(11) primary key auto_increment,

            name varchar(20) unique

        );

        

        create table student(

            id INT(11) primary key auto_increment,

            name varchar(20) unique,

            passwd varchar(15) not null,

            classid INT(11), #注意这个地方不要少逗号

            constraint stu_classid_FK foreign key(classid) references myclass(id)

        );

          

            +-------+-------+------+------------------------+

    连接查询

    使用SQL99标准的连接查询(JOIN..ON..)

        内连接

            只返回满足连接条件的数据(两边都有的才显示)。

    select e.*, d.*

    from emp e

    inner join dept d

    on e.deptno=d.deptno

            -- 也可以省略inner关键字。

        select e.*, d.*

        from emp e inner join dept d

        on e.deptno=d.deptno

            

        左外连接

            左边有值才显示。

    select e.empno, e.ename, e.sal, d.dname

    from emp e

    left outer join dept d

    on e.deptno=d.deptno

            -- 也可以省略outer关键字

              

         右外连接

            右边边有值才显示。

            select e.*, d.*

            from emp e        

            right outer join dept d

            on e.deptno=d.deptno

            -- 也可以省略outer关键字

          

         满外联接

         mysql 不支持full所以需要left right union

            任一边有值就会显示。

            //select e.*, d.*

            from emp e

            full outer join dept d        

            on e.deptno=d.deptno

            -- 也可以省略outer关键字

    mysql> select e.*,d.* from emp e left join dept d on (e.deptno=d.deptno) union select e.*,d.* from emp e right join dept d on (e.deptno=d.deptno)

             交叉连接

            叉集,就是笛卡尔积

            select e.*, d.*

            from emp e

            cross join dept d

            -- 没有连接条件

    ====================================================

    eg:查询员工信息,员工号,姓名,月薪,部门名称

        select e.empno, e.ename, e.sal, d.dname

        from emp e, dept d

        where e.deptno=d.deptno

        select e.empno, e.ename, e.sal, d.dname

        from emp e inner join dept d -- 逗号join

        on e.deptno=d.deptno -- where on

    //显示所有部门信息

    //显示各个部门的部门人数

        select d.deptno 部门号, d.dname 部门名称,count(e.empno) 人数

        from emp e, dept d

        where e.deptno(+)=d.deptno

        group by d.deptno, d.dname

        select d.deptno 部门号, d.dname 部门名称,count(e.empno) 人数

        from emp e right outer join dept d

        on e.deptno=d.deptno

        group by d.deptno, d.dname

    自连接

    -- 查询员工信息 ,老板信息

        显示: ****的老板是****

    select e.ename , b.ename

        from emp e, emp b

        where e.mgr=b.empno

    select concat ( concat(e.ename, '的老板是'), b.ename)

        from emp e, emp b

        where e.mgr=b.empno

    select e.ename, ifnull(b.ename,'他自己')

        from emp e left outer join emp b

        on e.mgr=b.empno

    select concat ( concat(e.ename, '的老板是'), ifnull(b.ename,'他自己'))

        from emp e left outer join emp b

        on e.mgr=b.empno

    +------------------------------------------------------------------------+

    | concat ( concat(e.ename, '的老板是'), ifnull(b.ename,'他自己')) |

    +------------------------------------------------------------------------+

    | SMITH的老板是FORD |

    | ALLEN的老板是BLAKE |

    | WARD的老板是BLAKE |

    | JONES的老板是KING |

    | MARTIN的老板是BLAKE |

    | BLAKE的老板是KING |

    | CLARK的老板是KING |

    | SCOTT的老板是JONES |

    | KING的老板是他自己 |

    | TURNER的老板是BLAKE |

    | ADAMS的老板是SCOTT |

    | JAMES的老板是BLAKE |

    | FORD的老板是JONES |

    | MILLER的老板是CLARK |

    +------------------------------------------------------------------------+

    aaaaddd ccccbbbbbb

    aaaaddd ccccbbbbbb

    aaaaddd ccccbbbbbb

    aaaaddd ccccbbbbbb

    方法:按住alt键以后,鼠标拖动,选中一个矩形区域

          

          

                    

    mysql的常用命令

    mysql安装完之后,登陆后发现只有两个数据库:mysql> show databases;

    +--------------------+

    | Database |

    +--------------------+

    | information_schema |

    | test |

    +--------------------+

    ,mysql> use mysql

    ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql'

    访问被拒绝,原因就是在删除数据库时(rpm -e mysql*)没有删除干净,需要把/var/lib/mysql的目录全部删除干净,然后再重新安装即可。

    顺便记一下一些常用的命令:

    连接MYSQL

    格式: mysql -h主机地址 -u用户名 -p用户密码

    1、连接到本机上的MYSQL。

    # mysql -u root -p

    回车后提示你输密码,注意用户名前可以有空格也可以没有空格,但是密码前必须没有空格,否则让你重新输入密码。

    如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是: mysql>

    2、连接到远程主机上的MYSQL。假设远程主机的IP为:192.168.2.2,用户名为root,密码为123456。则键入以下命令:

    # mysql -h192.168.2.2 -uroot -p123456

    3、退出MYSQL命令:

    # exit (回车)

    修改密码

    格式:mysqladmin -u用户名 -p旧密码 password 新密码

    1、给root加个密码123456。键入以下命令:

    # mysqladmin -u root -password 123456

    2、再将root的密码改为56789。

    # mysqladmin -u root -p123456 password 56789

    增加新用户

    格式:grant select on 数据库.* to 用户名@登录主机 identified by "密码"

    1、增加一个用户test1密码为abc,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用root用户连入MYSQL,然后键入以下命令:

    mysql>grant select,insert,update,delete on *.* to test1@"%" Identified by "abc";

    mysql>flush privileges; 使之生效

    2、增加一个用户test2密码为abc,让他只可以在localhost上登录,并可以对数据库mydb进行查询、插入、修改、删除的操作(localhost指本地主机,即MYSQL数据库所在的那台主机),这样用户即使用知道test2的密码,他也无法从internet上直接访问数据库,只能通过MYSQL主机上的web页来访问了。

    mysql>grant select,insert,update,delete on mydb.* to test2@localhost identified by "abc";

    mysql>flush privileges; 使之生效

    如果你不想test2有密码,可以再打一个命令将密码消掉。

    mysql>grant select,insert,update,delete on mydb.* to test2@localhost identified by "";

    mysql>flush privileges; 使之生效

    操作技巧

    1、如果你打命令时,回车后发现忘记加分号,你无须重打一遍命令,只要打个分号回车就可以了。也就是说你可以把一个完整的命令分成几行来打,完后用分号作结束标志就OK。

    2、你可以使用光标上下键调出以前的命令。

    查询、创建、删除、更新命令

    1、显示当前数据库服务器中的数据库列表:

    mysql>show databases;

    注意:mysql库里面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。

    2、显示数据库中的数据表:

    mysql>use 库名;

    mysql>show tables;

    3、显示数据表的结构:

    mysql>describe 表名;

    4、建立数据库:

    mysql>create database 库名;

    5、建立数据表:

    mysql>use 库名;

    mysql>create table 表名 (字段名 varchar(20), 字段名 char(1));

    6、删除数据库:

    mysql>drop database 库名;

    7、删除数据表:

    mysql>drop table 表名;

    8、将表中记录清空:

    mysql>delete from 表名;

    9、显示表中的记录:

    mysql>select * from 表名;

    10、往表中插入记录:

    mysql>insert into 表名 values ("123","b");

    11、更新表中数据:

    mysql>update 表名 set 字段名1='a',字段名2='b' where 字段名3='c';

    12、用文本方式将数据装入数据表中:

    mysql>load data local infile "/root/mysql.txt" into table 表名;

    13、导入.sql文件命令:

    mysql>use 数据库名;

    mysql>source /root/mysql.sql;

    14、命令行修改root密码:

    mysql>update mysql.user set password=PASSWORD('新密码') where user='root';

    mysql>flush privileges;

    15、显示use的数据库名:

    mysql>select database();

    16、显示当前的user:

    mysql>select user();

    备份数据库

    1.导出整个数据库,导出文件默认是存在当前操作目录下

    # mysqldump -u 用户名 -p 数据库名 > 导出的文件名

    # mysqldump -u user_name -p123456 database_name > outfile_name.sql

    2.导出一个表

    # mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名

    # mysqldump -u user_name -p database_name table_name > outfile_name.sql

    3.导出一个数据库结构

    # mysqldump -u user_name -p -d –add-drop-table database_name > outfile_name.sql

    -d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table

    4.带语言参数导出

    # mysqldump -uroot -p –default-character-set=latin1 –set-charset=gbk –skip-opt database_name > outfile_name.sql

    connect mysql error

    查看不到mysql数据库的解决办法:

    1.去/var/lib/mysql目录下去查看,发现mysql以及mysql.sock目录都在,还好还好,应该还有希望恢复;

    2.停掉mysqld服务——"service mysqld stop"

    3.查看mysqld进程是否还在跑——"ps -aux | grep mysqld",如果还有在跑得进程,可以直接杀之"killall -TERM mysqld"

    4.安全模式启动mysql;"mysqld_safe --user=mysql --skip-grant-tables --skip-networking &"

    5.另起终端,输入"mysql -u root -p",进入mysql数据库

    6.show databases;看到mysql库又出现了

    7.更改root用户密码:use mysql;update user set password=PASSWORD("new-passwd")where user='root';

    8.FLUSH PRIVILEGES;

  • 相关阅读:
    Java之修改文件内容:字符串逐行替换
    Java之"instanceof"和"isInstance"代码举例
    spring之跨模块引用配置文件
    Java之相对路径找不到文件问题解决方法
    html 页面模块的常用命名
    移动端资源集锦
    手机web不同屏幕字体大小高度自适应
    meta标签整理
    css文字超出自动显示省略号
    display:inline、block、inline-block的区别
  • 原文地址:https://www.cnblogs.com/XiaoGuanYu/p/8734792.html
Copyright © 2020-2023  润新知