SQL

连接数据库 mysql -u root -p

备份数据库 mysql -u root -p 要备份数据库名>文件位置和文件名

恢复数据库 方式1 mysql -u root -p DBName<文件位置和文件名

     方式2 在mysql命令下 source 文件位置和文件名(要恢复 恢复数据只能恢复数据本身,数据库无法恢复,需要先自己创建出数据库才能继续恢复数据)
一.数据库
    1.创建数据库
        create database [if not exists] db_name [character set xxx] [collate xxx]
        *创建一个名称为mydb1的数据库。
            create database mydb1;
        *创建一个使用utf8字符集的mydb2数据库。
            create database mydb2 character set utf8;
        *创建一个使用utf8字符集,并带校对规则的mydb3数据库。
            create database mydb3 character set utf8 collate utf8_bin ;
    2.查看数据库
        show databases;查看所有数据库
        show create database db_name; 查看数据库的创建方式
    3.修改数据库
        alter database db_name [character set xxx] [collate xxxx]
    4.删除数据库
        drop database [if exists] db_name;
    5.使用数据库
        切换数据库 use db_name;
        查看当前使用的数据库 select database();
--------------------------------------------------------------------------------------------------
二、表
    1.创建表
            create table tab_name(
                field1 type,
                field2 type,
                ...
                fieldn type
            )[character set xxx][collate xxx];
            
            ****java和mysql的数据类型比较
                String  ----------------------  char(n) varchar(n) 255  65535

      varchar更省空间,char更节省时间
                byte short int long float double -------------- tinyint  smallint int bigint float double
                boolean ------------------ bit 0/1
                Date ------------------ Date、Time、DateTime、timestamp
                FileInputStream FileReader  ------------------------------ Blob(二进制数据) Text(文本数据)
                
                *创建一个员工表employee
                create table employee(
                    id int primary key auto_increment ,
                    name varchar(20),
                    gender bit default 1,
                    birthday date,
                    entry_date date,
                    job varchar(20),
                    salary double,
                    resume text
                );
                
                约束:
                    primary key主键
                    unique唯一
                    not null非空
                    auto_increment自动增长  主键字段必须是数字类型。
                    外键约束
        2.查看表信息
            desc tab_name 查看表结构
            show tables 查看当前数据库中的所有的表
            show create table tab_name    查看当前数据库表建表语句
        3.修改表结构
                (1)增加一列
                    alter table tab_name add [column] 列名 类型;
                (2)修改一列类型
                    alter table tab_name modify 列名 类型;
                (3)修改列名
                    alter table tab_name change [column] 列名 新列名 类型;
                (4)删除一列
                    alter table tab_name drop [column] 列名;
                (5)修改表名
                    rename table 表名 to 新表名;
                (6)修该表所用的字符集            
                    alter table student character set utf8;
                    
            4.删除表
                drop table tab_name;
            
            
--------------------------------------------------------------------------------------------------
三、表记录
    1.增加一条记录insert
        insert into tab_name (field1,filed2,.......) values (value1,value2,.......);
        *插入的数据应与字段的数据类型相同。
        *数据的大小应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中。
        *在values中列出的数据位置必须与被加入的列的排列位置相对应。
        *字符和日期型数据应包含在单引号中'zhang' '2013-04-20'
        *插入空值:不指定某列的值或insert into table value(null),则该列取空值。
        *如果要插入所有字段可以省写列列表,直接按表中字段顺序写值列表insert into tab_name values(value1,value2,......);
        
        *练习:使用insert语句向表中插入三个员工的信息。
        insert into emp (name,birthday,entry_date,job,salary) values ('张飞','1990-09-09','2000-01-01','打手',999);
        insert into emp (name,birthday,entry_date,job,salary) values ('关羽','1989-08-08','2000-01-01','财神',9999);
        insert into emp (name,birthday,entry_date,job,salary) values ('赵云','1991-07-07','2000-01-02','保安',888);
        insert into emp values (7,'黄忠',1,'1970-05-05','2001-01-01','战神',1000,null);

    2.修改表记录
            update tab_name set field1=value1,field2=value2,......[where 语句]
            *UPDATE语法可以用新值更新原有表行中的各列。
            *SET子句指示要修改哪些列和要给予哪些值。
            *WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行。
            *实验:
                将所有员工薪水修改为5000元。
                update emp set salary=5000;
                将姓名为’zs’的员工薪水修改为3000元。
                update emp set salary=3000 where name='zs';
                将姓名为’ls’的员工薪水修改为4000元,job改为ccc。
                update emp set salary=4000,job='ccc' where name='zs';
                将wu的薪水在原有基础上增加1000元。    
                update emp set salar=salary+4000 where name='wu';
                
    3.删除表操作
            delete from tab_name [where ....]
            *如果不跟where语句则删除整张表中的数据
            *delete只能用来删除一行记录,不能值删除一行记录中的某一列值(这是update操作)。
            *delete语句只能删除表中的内容,不能删除表本身,想要删除表,用drop
            *同insert和update一样,从一个表中删除记录将引起其它表的参照完整性问题,在修改数据库数据时,头脑中应该始终不要忘记这个潜在的问题。
            *TRUNCATE TABLE也可以删除表中的所有数据,词语句首先摧毁表,再新建表。此种方式删除的数据不能在事务中恢复。
            *实验:
                删除表中名称为’zs’的记录。
                delete from emp where name='黄忠';
                删除表中所有记录。
                delete from emp;
                使用truncate删除表中记录。
                truncate table emp;
                    

        4.select操作
        (1)select [distinct] *|field1,field2,......   from tab_name 其中from指定从哪张表筛选,*表示查找所有列,也可以指定一个列列表明确指定要查找的列,distinct用来剔除重复行。
                *实验:
                    查询表中所有学生的信息。
                    select * from exam;
                    查询表中所有学生的姓名和对应的英语成绩。
                    select name,english from exam;
                    过滤表中重复数据。
                    select distinct english from exam;
        (2)select 也可以使用表达式,并且可以使用 as 别名
                    在所有学生分数上加10分特长分显示。
                    select name,english+10,chinese+10,math+10 from exam;
                    统计每个学生的总分。
                    select name,english+chinese+math from exam;
                    使用别名表示学生总分。
                    select name,english+chinese+math as 总成绩 from exam;
                    select name,english+chinese+math 总成绩 from exam;
                    select name english from exam;
        (3)使用where子句,进行过滤查询。
                    查询姓名为XXX的学生成绩
                    select * from exam where name='张飞';
                    查询英语成绩大于90分的同学
                    select name,english from exam where english>90;
                    查询总分大于200分的所有同学
                    select name,math+english+chinese as 总成绩 from exam where math+english+chinese>200 ;
                    *where字句中可以使用:
                            *比较运算符:    
                                        > < >= <= <>  
                                        between 10 and 20  值在10到20之间  
                                        in(10,20,3) 值是10或20或30
                                        like '张pattern' pattern可以是%或者_,如果是%则表示任意多字符,此例中张三丰 张飞 张abcd ,如果是_则表示一个字符张_,张飞符合。
                                        Is null
                            *逻辑运算符
                                在多个条件直接可以使用逻辑运算符 and or not
                    *实验
                        查询英语分数在 80-100之间的同学。
                         select name ,english from exam where english between 80 and 100;
                        查询数学分数为75,76,77的同学。
                        select name ,math from exam where math in (75,76,77);
                        查询所有姓张的学生成绩。
                        select * from exam where name like '张%';
                        查询数学分>70,语文分>80的同学。
                        select name from exam where math>70 and chinese >80;
                        查找缺考数学的学生的姓名
                        select name from exam where math is null;
        (4)Order by 指定排序的列,排序的列即可是表中的列名,也可以是select 语句后指定的别名。
                    Asc 升序、Desc 降序,其中asc为默认值
                    ORDER BY 子句应位于SELECT语句的结尾。
                *练习:
                    对数学成绩排序后输出。
                    select * from exam order by math;
                    对总分排序按从高到低的顺序输出
                    select name ,(ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0)) 总成绩 from exam order by 总成绩 desc;
                    对姓张的学生成绩排序输出
                    select name ,(ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0)) 总成绩 from exam where name like '张%' order by 总成绩 desc;
        (5)聚合函数:技巧,先不要管聚合函数要干嘛,先把要求的内容查出来再包上聚合函数即可。
                count(列名) 实际上是统计行数
                    统计一个班级共有多少学生?先查出所有的学生,再用count包上
                     select count(*) from exam;
                    统计数学成绩大于70的学生有多少个?
                     select count(math) from exam where math>70;
                    统计总分大于250的人数有多少?
                        select count(name) from exam where (ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0))>250;
                sum(列名)
                    统计一个班级数学总成绩?先查出所有的数学成绩,再用sum包上
                        select sum(math) from exam;
                    统计一个班级语文、英语、数学各科的总成绩
                        select sum(math),sum(english),sum(chinese) from exam;
                    统计一个班级语文、英语、数学的成绩总和
                        select sum(ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0)) as 总成绩 from exam;
                    统计一个班级语文成绩平均分
                            select sum(chinese)/count(*) from exam ;
                    注意:sum仅对数值起作用,否则会报错。
            AVG(列名):
                        求一个班级数学平均分?先查出所有的数学分,然后用avg包上。
                            select avg(ifnull(math,0)) from exam;
                        求一个班级总分平均分
                            select avg((ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0))) from exam ;
            Max、Min
                        求班级最高分和最低分(数值范围在统计中特别有用)
                        select Max((ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0))) from exam;
                        select Min((ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0))) from exam;
    
        (6)group by字句,其后可以接多个列名,也可以跟having子句对group by 的结果进行筛选。
                        练习:对订单表中商品归类后,显示每一类商品的总价
                            select product,sum(price) from orders group by product;
                        练习:查询购买了几类商品,并且每类总价大于100的商品
                                select product,sum(price) from orders group by product having sum(price)>100;
                !~having 和 where 的差别: where语句用在分组之前的筛选,having用在分组之后的筛选,having中可以用合计函数,where中就不行。使用where的地方可以用having替代。
                            练习:查询商品列表中除了橘子以外的商品,每一类商品的总价格大于500元的商品的名字
                                select product,sum(price) from orders where product<>'桔子'group by product having sum(price)>500;

        (7)重点:Select from where group by having order by

              书写顺序:select from where groupby having orderby
                        Mysql在执行sql语句时的执行顺序:from where select group by having order by
                *分析:        
                    select math+english+chinese as 总成绩 from exam where 总成绩 >250; ---- 不成功(因为where执行顺序在select之前,总成绩那里还没命名就被使用了,所以报错)
                    select math+english+chinese as 总成绩 from exam having 总成绩 >250; --- 成功
                    select math+english+chinese as 总成绩 from exam group by 总成绩 having 总成绩 >250; ----成功
                    select  math+english+chinese as 总成绩 from exam order by 总成绩;----成功
                    select * from exam as 成绩 where 成绩.math>85; ---- 成功
            
            
--------------------------------------------------------------------------------------------------
四、约束
        
    1.创建表时指定约束:
            create table tb(
                id int primary key auto_increment,
                name varchar(20) unique not null,
                ref_id int,
                 foreign key(ref_id) references tb2(id)
            );
            
            create table tb2(
                id int primary key auto_increment
            );
            

    2.外键约束:在使用表来存储数据时,可以明确的声明表和表之前的依赖关系,命令数据库来帮我们维护这种关系,这种约束就叫做外键约束
            (1)增加外键:
                可以明确指定外键的名称,如果不指定外键的名称,mysql会自动为你创建一个外键名称。
                RESTRICT : 只要本表格里面有指向主表的数据, 在主表里面就无法删除相关记录。
                CASCADE : 如果在foreign key 所指向的那个表里面删除一条记录,那么在此表里面的跟那个key一样的所有记录都会一同删掉。
                alter table book add [constraint FK_BOOK] foreign key(pubid) references pub_com(id) [on delete restrict] [on update restrict];
            
            (2)删除外键
                alter table 表名 drop foreign key 外键(区分大小写,外键名可以desc 表名查看);
                
                
    3.主键约束:
            (1)增加主键(自动增长,只有主键可以自动增长)
                Alter table tb add primary key(id) [auto_increment];
            (2)删除主键
                alter table 表名 drop primary key
            (3)增加自动增长
                Alter table employee modify id int auto_increment;
            (4)删除自动增长
                Alter table tb modify id int;        
    
    
    
--------------------------------------------------------------------------------------------------
五、多表设计
    一对一(311教室和20130405班级,两方都是一):在任意一方保存另一方的主键
    一对多、多对一(班级和学生,其中班级为1,学生为多):在多的一方保存一的一方的主键
    多对多(教师和学生,两方都是多):使用中间表,保存对应关系

--------------------------------------------------------------------------------------------------
六、多表查询
        create table tb (id int primary key,name varchar(20) );
        create table ta (
                id int primary key,
                name varchar(20),
                tb_id int
                                        );
        insert into tb values(1,'财务部');
        insert into tb values(2,'人事部');
        insert into tb values(3,'科技部');
        
        insert into ta values (1,'刘备',1);
        insert into ta values (2,'关羽',2);
        insert into ta values (3,'张飞',3);
        
        
        mysql> select * from ta;
            +----+------+-------+
            | id | name | tb_id |
            +----+------+-------+
            |  1 | aaa  |     1 |
            |  2 | bbb  |     2 |
            |  3 | bbb  |     4 |
            +----+------+-------+
        mysql> select * from tb;
            +----+------+
            | id | name |
            +----+------+
            |  1 | xxx  |
            |  2 | yyy  |
            |  3 | yyy  |
            +----+------+
    
        1.笛卡尔积查询:两张表中一条一条对应的记录,m条记录和n条记录查询,最后得到m*n条记录,其中很多错误数据
            select * from ta ,tb;
        
            mysql> select * from ta ,tb;
                +----+------+-------+----+------+
                | id | name | tb_id | id | name |
                +----+------+-------+----+------+
                |  1 | aaa  |     1 |  1 | xxx  |
                |  2 | bbb  |     2 |  1 | xxx  |
                |  3 | bbb  |     4 |  1 | xxx  |
                |  1 | aaa  |     1 |  2 | yyy  |
                |  2 | bbb  |     2 |  2 | yyy  |
                |  3 | bbb  |     4 |  2 | yyy  |
                |  1 | aaa  |     1 |  3 | yyy  |
                |  2 | bbb  |     2 |  3 | yyy  |
                |  3 | bbb  |     4 |  3 | yyy  |
                +----+------+-------+----+------+
        2.内连接:查询两张表中都有的关联数据,相当于利用条件从笛卡尔积结果中筛选出了正确的结果。
            select * from ta ,tb where ta.tb_id = tb.id;
            select * from ta inner join tb on ta.tb_id = tb.id;
        
            mysql> select * from ta inner join tb on ta.tb_id = tb.id;
                +----+------+-------+----+------+
                | id | name | tb_id | id | name |
                +----+------+-------+----+------+
                |  1 | aaa  |     1 |  1 | xxx  |
                |  2 | bbb  |     2 |  2 | yyy  |
                +----+------+-------+----+------+
        3.外连接
            (1)左外连接:在内连接的基础上增加左边有右边没有的结果
            select * from ta left join tb on ta.tb_id = tb.id;
            
            mysql> select * from ta left join tb on ta.tb_id = tb.id;
                +----+------+-------+------+------+
                | id | name | tb_id | id   | name |
                +----+------+-------+------+------+
                |  1 | aaa  |     1 |    1 | xxx  |
                |  2 | bbb  |     2 |    2 | yyy  |
                |  3 | bbb  |     4 | NULL | NULL |
                +----+------+-------+------+------+
            (2)右外连接:在内连接的基础上增加右边有左边没有的结果
                select * from ta right join tb on ta.tb_id = tb.id;
                
                mysql> select * from ta right join tb on ta.tb_id = tb.id;
                +------+------+-------+----+------+
                | id   | name | tb_id | id | name |
                +------+------+-------+----+------+
                |    1 | aaa  |     1 |  1 | xxx  |
                |    2 | bbb  |     2 |  2 | yyy  |
                | NULL | NULL |  NULL |  3 | yyy  |
                +------+------+-------+----+------+
                
            (3)全外连接:在内连接的基础上增加左边有右边没有的和右边有左边没有的结果
                select * from ta full join tb on ta.tb_id = tb.id; --mysql不支持全外连接
                select * from ta left join tb on ta.tb_id = tb.id
                union
                select * from ta right join tb on ta.tb_id = tb.id;
                
                mysql> select * from ta left join tb on ta.tb_id = tb.id
                    -> union
                    -> select * from ta right join tb on ta.tb_id = tb.id; --mysql可以使用此种方式间接实现全外连接
                +------+------+-------+------+------+
                | id   | name | tb_id | id   | name |
                +------+------+-------+------+------+
                |    1 | aaa  |     1 |    1 | xxx  |
                |    2 | bbb  |     2 |    2 | yyy  |
                |    3 | bbb  |     4 | NULL | NULL |
                | NULL | NULL |  NULL |    3 | yyy  |
                +------+------+-------+------+------+

最基本的mysql的更多相关文章

  1. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  2. mysql每秒最多能插入多少条数据 ? 死磕性能压测

    前段时间搞优化,最后瓶颈发现都在数据库单点上. 问DBA,给我的写入答案是在1W(机械硬盘)左右. 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高(SSD硬盘) 但这东西感 ...

  3. LINUX篇,设置MYSQL远程访问实用版

    每次设置root和远程访问都容易出现问题, 总结了个通用方法, 关键在于实用 step1: # mysql -u root mysql mysql> Grant all privileges o ...

  4. nodejs进阶(6)—连接MySQL数据库

    1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...

  5. MySQL高级知识- MySQL的架构介绍

    [TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...

  6. 闰秒导致MySQL服务器的CPU sys过高

    今天,有个哥们碰到一个问题,他有一个从库,只要是启动MySQL,CPU使用率就非常高,其中sys占比也比较高,具体可见下图. 注意:他的生产环境是物理机,单个CPU,4个Core. 于是,他抓取了CP ...

  7. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  8. Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制

    将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现.SQ ...

  9. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  10. 当忘记mysql数据库密码时如何进行修改

    因为长时间没有使用数据库了,或者把密码改完之后就忘了数据库密码,不能正常进入数据库,也无法修改密码,有一个简单的常用修改密码方式: 1.首先找到和打开mysql.exe和mysqld.exe所在的文件 ...

随机推荐

  1. JavaWeb(七)之详解JavaWeb路径

    前言 在我们的实际开发中,经常要写路径,不管是链接,重定向还是转发,这都是需要路径的.那这一篇我给大家详细的分享一下Web中的各种路径问题. 世界上一切东西都是相对的,对于这点而言,相信大家并不陌生, ...

  2. 从源码看 angular/material2 中 dialog模块 的实现

    本文将探讨material2中popup弹窗即其Dialog模块的实现. 使用方法 引入弹窗模块 自己准备作为模板的弹窗内容组件 在需要使用的组件内注入 MatDialog 服务 调用 open 方法 ...

  3. Windows 10新功能

    Windows 10 中面向开发人员的新增功能 Windows 10 及新增的开发人员工具将提供新通用 Windows 平台支持的工具.功能和体验.在 Windows 10 上安装完工具和 SDK后, ...

  4. JavaScript观察者模式

    观察者模式观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得 ...

  5. JS鼠标滚轮事件详解

    鼠标滚轮事件 //兼容性写法,该函数也是网上别人写的,不过找不到出处了,蛮好的,所有我也没有必要修改了 //判断鼠标滚轮滚动方向 if (window.addEventListener)//FF,火狐 ...

  6. (4.1)Spring MVC执行原理和基于Java的配置过程

    一.Spring MVC执行原理和基于Java配置的配置过程 (一)Spring MVC执行过程,大致为7步. 所有的请求都会经过Spring的一个单例的DispacherServlet. Dispa ...

  7. C#匹配标签正则,获取标签的值

    比如要获取: <color=#50cccc>头盔坐标:(-0.6, 1.0, 1.2)</color><color=#3d85c6>头盔方向(-0.2, 0.1, ...

  8. asp.net 第三方UI控件 Telerik KendoUI 之 TreeVIew 的用法记录

    一.前台显示 备注:一次性取出所有节点 function loadTreeData() { $.ajax({ type: 'POST', url: '@(Html.UrlHref("Scri ...

  9. C#设计模式之十一外观模式(Facade)【结构型】

    一.引言 快12点半了,要开始今天的写作了.很快,转眼设计模式已经写了十个了,今天我们要讲[结构型]设计模式的第五个模式,该模式是[外观模式],英文名称是:Facade Pattern.我们先从名字上 ...

  10. java语言编写杨辉三角

    package com.llh.demo; /** * 杨辉三角 * * @author llh * */ public class Test { /* * 杨辉三角 */ public static ...