var slideIndex = 1; showSlides(slideIndex); function plusSlides(n) { showSlides(slideIndex += n); } function currentSlide(n) { showSlides(slideIndex = n); } function showSlides(n) { var i; var slides = document.getElementsByClassName("mySlides"); var dots = document.getElementsByClassName("dot"); if (n > slides.length) {slideIndex = 1} if (n < 1) {slideIndex = slides.length} for (i = 0; i < slides.length; i++) { slides[i].style.display = "none"; } for (i = 0; i < dots.length; i++) { dots[i].className = dots[i].className.replace(" active", ""); } slides[slideIndex-1].style.display = "block"; dots[slideIndex-1].className += " active"; }

操作数据库

一、操作数据库

(1) 创建数据库

CREATE  DATABASE  [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] 
    create_specification:    
        [DEFAULT] CHARACTER SET charset_name  |  [DEFAULT] COLLATE collation_name 
~创建一个名称为mydb1的数据库。
    create database mydb1;
~创建一个使用gbk字符集的mydb2数据库。
    create database mydb2 character set gbk;
~创建一个使用utf8字符集,并带校对规则的mydb3数据库。
    create database mydb3 character set utf-8 collate utf8_bin;

(2) 查看数据库

    显示数据库语句:
        SHOW DATABASES
    显示数据库创建语句:
        SHOW CREATE DATABASE db_name

    ~查看当前数据库服务器中的所有数据库 
        show databases;
    ~查看前面创建的mydb2数据库的定义信息
        show create database mydb3;

(3)修改数据库

    ALTER  DATABASE  [IF NOT EXISTS] db_name  [alter_specification [, alter_specification] ...] 
        alter_specification:    
            [DEFAULT] CHARACTER SET charset_name  |   [DEFAULT] COLLATE collation_name

    ~查看服务器中的数据库,并把其中mydb2字符集修改为utf8
        alter database mydb2 character set utf8;

(4)删除数据库

    DROP DATABASE  [IF EXISTS]  db_name         
    ~删除前面创建的mydb1数据库 drop database mydb1;
        drop database mydb1;

(5)选择数据库

    进入数据库:use db_name;
    查看当前所选的数据库: select database();

二、操作表

(1)创建表

CREATE TABLE table_name
    (
        fie ld1  datatype,
        field2  datatype,
        field3  datatype,
    )[character set 字符集] [collate 校对规则]
    field:指定列名 datatype:指定列类型

    ~创建一个员工表employee 
        create table employee(
            id int primary key auto_increment,
            name varchar(20) unique,
            gender bit not null,
            birthday date,
            entry_date date,
            job varchar(40),
            salary double,
            resume text
        );

(2)查看表

    查看表结构:desc tabName
    查看当前数据库中所有表:show tables
    查看当前数据库表建表语句 show create table tabName;
    查看表的相关信息:SHOW TABLE STATUS
    ~显示employee表的信息
    show table status like 'employee' \G;

(3)修改表

ALTER TABLE table  ADD/MODIFY/DROP/CHARACTER SET/CHANGE  (column datatype [DEFAULT expr][, column datatype]...);
    *修改表的名称:rename table 表名 to 新表名;

    ~在上面员工表的基本上增加一个image列。
        alter table employee add image blob;
    ~修改job列,使其长度为60。
        alter table employee modify job varchar(60);
    ~删除gender列。
        alter table employee drop gender;
    ~表名改为user。
        rename table employee to user;
    ~修改表的字符集为gbk
        alter table user character set gbk;
    ~列名name修改为username
        alter table user change name username varchar(20);

(4)删除表

        DROP TABLE tab_name;
    ~删除user表
        drop table user;
```

# 三、操作表记录CRUD
(1) INSERT

```
INSERT INTO table [(column [, column...])] VALUES (value [, value...]);
```
    插入的数据应与字段的数据类型相同。
    数据的大小应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中。
    在values中列出的数据位置必须与被加入的列的排列位置相对应。
    字符和日期型数据应包含在单引号中。
    插入空值:不指定或insert into table value(null)
    如果要插入所有字段可以省写列列表,直接按表中字段顺序写值列表
```
    ~使用insert语句向表中插入三个员工的信息
    insert into employee (id,name,gender,birthday,entry_date,job,salary,resume)values (null,'张飞',1,'1999-09-09','1999-10-01','打手',998.0,'老大的三弟,真的很能打');
        insert into employee values (null,'关羽',1,'1998-08-08','1998-10-`这里写代码片`01','财神爷',9999999.00,'老大的二弟,公司挣钱都指着他了');
        insert into employee values (null,'刘备',0,'1990-01-01','1991-01-01','ceo',100000.0,'公司的老大'),(null,'赵云',1,'2000-01-01','2001-01-01','保镖',1000.0,'老大贴身人');
```

## (2) UPDATE

```SQL
UPDATE  tbl_name SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition]  

UPDATE语法可以用新值更新原有表行中的各列。
SET子句指示要修改哪些列和要给予哪些值。
WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行

~将所有员工薪水修改为5000元。
        update employee set salary = 5000;
    ~将姓名为’张飞’的员工薪水修改为3000元。
        update employee set salary = 3000 where name='张飞';
    ~将姓名为’关羽’的员工薪水修改为4000元,job改为ccc。
        update employee set salary=4000,job='ccc' where name='关羽';
    ~将刘备的薪水在原有基础上增加1000元。  
        update employee set salary=salary+1000 where name='刘备';
```

## (3) DELETE

    如果不使用where子句,将删除表中所有数据。 
    Delete语句不能删除某一列的值(可使用update) 
    使用delete语句仅删除记录,不删除表本身。如要删除表,使用drop table语句。 
    同insert和update一样,从一个表中删除记录将引起其它表的参照完整性问题,在修改数据库数据时,头脑中应该始终不要忘记这个潜在的问题。 
    外键约束 
    删除表中数据也可使用TRUNCATE TABLE 语句,它和delete有所不同,参看mysql文档。

```SQL
    delete from tbl_name [WHERE where_definition]    
    ~删除表中名称为’张飞’的记录。
        delete from employee where name='张飞';
    ~删除表中所有记录。
        delete from employee;
    ~使用truncate删除表中记录。
        truncate table employee;
```

## (4)SELECT

~1.基本查询

```SQL
    SELECT [DISTINCT] *|{column1, column2. column3..} FROM  table;

    ~查询表中所有学生的信息。
        select * from exam;
    ~查询表中所有学生的姓名和对应的英语成绩。
        select name,english from exam;
    ~过滤表中重复数据
        select distinct english from exam;
    ~在所有学生分数上加10分特长分显示。
        select name , math+10,english+10,chinese+10 from exam;
    ~统计每个学生的总分。
        select name ,english+math+chinese from exam;
            使用别名表示学生总分。
        select name as 姓名 ,english+math+chinese as 总成绩 from exam;
        select name 姓名 ,english+math+chinese 总成绩 from exam;
        select name english from exam;
```

~2.使用where子句进行过滤查询

```SQL
~查询姓名为张飞的学生成绩
        select * from exam where name='张飞';
    ~查询英语成绩大于90分的同学
        select * from exam where english > 90;
    ~查询总分大于230分的所有同学
        select name 姓名,math+english+chinese 总分 from exam where math+english+chinese>230;
    ~查询英语分数在 80-100之间的同学。
        select * from exam where english between 80 and 100;
    ~查询数学分数为75,76,77的同学。
        select * from exam where math in(75,76,77);
    ~查询所有姓张的学生成绩。
        select * from exam where name like '张%';
        select * from exam where name like '张__';
    ~查询数学分>70,语文分>80的同学。
        select * from exam where math>70 and chinese>80;
```

~3.使用order by关键字对查询结果进行排序操作

```SQL
    SELECT column1, column2. column3.. FROM table where... order by column asc|desc;
    asc 升序 -- 默认就是升序  desc 降序
    ~对语文成绩排序后输出。
        select name,chinese from exam order by chinese desc;
    ~对总分排序按从高到低的顺序输出
        select name 姓名,chinese+math+english 总成绩 from exam order by 总成绩 desc;
    ~对姓张的学生成绩排序输出
        select name 姓名,chinese+math+english 总成绩 from exam where name like '张%' order by 总成绩 desc;
```

~4.聚合函数
(1)Count -- 用来统计符合条件的行的个数

```SQL
~统计一个班级共有多少学生?
        select count(*) from exam;
    ~统计数学成绩大于90的学生有多少个?
        select count(*) from exam where math>70;
    ~统计总分大于230的人数有多少?
        select count(*)from exam where math+english+chinese > 230;
```

(2)SUM -- 用来将符合条件的记录的指定列进行求和操作

```SQL
~统计一个班级数学总成绩?
        select sum(math) from exam;
    ~统计一个班级语文、英语、数学各科的总成绩
        select sum(math),sum(english),sum(chinese) from exam;
    ~统计一个班级语文、英语、数学的成绩总和
        select sum(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;
```

    在执行计算时,只要有null参与计算,整个计算的结构都是null
    此时可以用ifnull函数进行处理

```SQL
~统计一个班级语文成绩平均分
        select sum(chinese)/count(*) 语文平均分 from exam;
```

(3)AVG -- 用来计算符合条件的记录的指定列的值的平均值

```SQL
~求一个班级数学平均分?
        select avg(math) from exam;
    ~求一个班级总分平均分?
        select avg(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;
```

(4)MAX/MIN -- 用来获取符合条件的所有记录指定列的最大值和最小值

```SQL
~求班级最高分和最低分
        select max(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;
        select min(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;
```

~5.分组查询

```SQL
~对订单表中商品归类后,显示每一类商品的总价
        select product,sum(price) from orders group by product;
    ~询购买了几类商品,并且每类总价大于100的商品
        select product 商品名,sum(price)商品总价 from orders group by product having sum(price)>100;
```

## where子句和having子句的区别:
    where子句在分组之前进行过滤having子句在分组之后进行过滤
    having子句中可以使用聚合函数,where子句中不能使用
    很多情况下使用where子句的地方可以使用having子句进行替代

```SQL
~查询单价小于100而总价大于150的商品的名称
        select product from orders where price<100 group by product having sum(price)>150;          

    ~~sql语句书写顺序: 
        select from where groupby having orderby
    ~~sql语句执行顺序:
        from where select group by having order by 
```

~~备份恢复数据库
> 备份: 在cmd窗口下 mysqldump -u root -p dbName>c:/1.sql
> 恢复: 方式1:在cmd窗口下 mysql -u root -p dbName<c:/1.sql
      方式2:在mysql命令下, source c:/1.sql
        要注意恢复数据只能恢复数据本身,数据库没法恢复,需要先自己创建出数据后才能进行恢复.

##(6)replace语句

     INSERT和REPLACE语句的功能都是向表中插入新的数据。这两条语句的语法类似。它们的主要区别是如何处理重复的数据。 我们在使用数据库时可能会经常遇到这种情况。如果一个表在一个字段上建立了唯一索引,当我们再向这个表中使用已经存在的键值插入一条记录,那将会抛出一个主键冲突的错误。当然,我们可能想用新记录的值来覆盖原来的记录值。如果使用传统的做法,必须先使用 DELETE语句删除原先的记录,然后再使用INSERT插入新的记录。而在MySQL中为我们提供了一种新的解决方案,这就是REPLACE语句。使用 REPLACE插入一条记录时,如果不重复,REPLACE就和INSERT的功能一样,如果有重复记录,REPLACE就使用新记录的值来替换原来的记录值。

    使用REPLACE的最大好处就是可以将DELETE和INSERT合二为一,形成一个原子操作。这样就可以不必考虑在同时使用DELETE和INSERT时添加事务等复杂操作了。

    在使用REPLACE时,表中必须有唯一索引,而且这个索引所在的字段不能允许空值,否则REPLACE就和INSERT完全一样的。在执行REPLACE后,系统返回了所影响的行数。

    如果返回1,说明在表中并没有重复的记录,如果返回2,说明有一条重复记录,系统自动先调用了DELETE删除这条记录,然后再记录用INSERT来插入这条记录。
    如果返回的值大于2,那说明有多个唯一索引,有多条记录被删除和插入。
posted @ 2018-08-10 14:33  Solomon_xm  阅读(229)  评论(0编辑  收藏  举报