首页 > 技术文章 > 数据库

xiami-mj 2017-05-02 13:25 原文

 

数据库

数据文件

日志文件

DBMS(数据库管理文件)

四大常用的关系数据库

DB2

MYSQL

SQL Server

Oracle

SQL语言

SQL分类
    DDL语句:数据定义语言

        create(创建),
        drop(移除),
        alter(改变)等
    对数据库,表,索引等数据库对象进行定义

    DML语句:数据操作语言

        insert(添加)
        update(修改)
        delete(删除)
        select(查询)

    DCL语言:数据控制语言

        主要控制数据库,表,字段,用户的访问权限
        和安全级别grant,revoke

DDL语句

注意 : 每一条语句后面都需要跟分号(;)或\g结束
Ctrl+C 结束当前语句
1. 创建数据库 
    create database 数据库名称;  
    当提示Query OK, 1 row affected (0.04 sec)
数据库名称不可以重复.

2. 想查看系统都包含那些数据库?
    show databases;

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
| world              |
+--------------------+
6 rows in set (0.11 sec)

information_schema : 注意存储了数据中存储的数据库对象,比如
用户表,列的信息,权限信息,字符集信息

mysql : 存储系统的用户权限

world : 测试案列表
3. 选择数据库
    use 数据库名称;  进入创建的数据库里

mysql> use lanqiao
Database changed

4. 显示当前数据库中的所有表
    show tables;

5. 删除数据库
    drop database 数据库名称;

mysql> drop database lanqiao;
Query OK, 0 rows affected (0.59 sec)

6. 创建表
    create table 表名(
        列名1 列的类型,
        列名2 列的类型,
        列名3 列的类
    )

一个表相当于一个类,列名相等于类的属性

表名 : 等价于文件的名称可以为任意目录允许的字符.
列名 : 表头
列的类型 : int , char , varchar...

注意 : 创建表的时候需要选中数据库.
        就是指定将表创建到那个数据库中

mysql> create database lanqiao;
Query OK, 1 row affected (0.00 sec)

mysql> create table emp(
    -> ename varchar(10),
    -> ;
ERROR 1046 (3D000): No database selected
mysql> use lanqiao;
Database changed
mysql> create table emp(
    -> ename varchar(10),
    -> hiredate date,
    -> sal int,
    -> deptno int
    -> );
Query OK, 0 rows affected (0.60 sec)

7. desc : 显示表结构

mysql> desc emp;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| ename    | varchar(10) | YES  |     | NULL    |       |
| hiredate | date        | YES  |     | NULL    |       |
| sal      | int(11)     | YES  |     | NULL    |       |
| deptno   | int(11)     | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
4 rows in set (0.14 sec)

 注意 : show create table emp; 显示创建标的语法

8. 删除表
    drop table 表名;

9. 修改表
    alter table 表名 modify 列名 列的类型;

mysql> alter table emp modify ename varchar(20);
Query OK, 0 rows affected (0.19 sec)
Records: 0  Duplicates: 0  Warnings: 0  

10. 添加列
    alter table 表名 add 列名 列的类型;

mysql> alter table emp add age int(3);
Query OK, 0 rows affected (0.53 sec)
Records: 0  Duplicates: 0  Warnings: 0

11. 删除表的列(字段)
    alter table 表名 drop 列名;

mysql> alter table emp drop age;
Query OK, 0 rows affected (0.37 sec)
Records: 0  Duplicates: 0  Warnings: 0

12. 修改列的名称
    alter table 表名 change 原始名称 新的名称 列的类型;

mysql> alter table emp change ename name varchar(20);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

注意 : change 和 modify都可以修改表的定义
    change 后面都需要写两次列名,不方便
    但change的优点是可以修改列的名称,modify不能

13. 修改列的排列顺序
     alter table emp modify age int(3) first;

    alter table emp add birth date after ename;

14. 表改名
    alter table 表名 rename 新表名;

    rename table old_table_name to new_table_name

15. 从一个库将表移动到另外一个库
    (1) alter table database1.old_table_name rename 
    database2.new_table_name

    (2)rename table database1.old_table_name to 
    database2.new_table_name

mysql> alter table lq.sowhat rename lanqiao.sowhat;
Query OK, 0 rows affected (0.08 sec)

DML语句

DML是操作对数据库中表记录的操作.
主要表的操作记录有:
    1. 插入(insert)
        insert into tablename(列名1,列名2....列名n)
        values(值1,值2....值n);
        mysql> insert into emp(name,hiredate,sal,deptno)

        values('admin','1999-09-09',1500,1);
        Query OK, 1 row affected (0.13 sec)

        mysql> select * from emp;
        +-------+------------+------+--------+
        | name  | hiredate   | sal  | deptno |
        +-------+------------+------+--------+
        | admin | 1999-09-09 | 1500 |      1 |
        +-------+------------+------+--------+
        1 row in set (0.00 sec)

    注意 : 也可以不指定列名,但是values后面的顺序应该和字段的排列顺序一致.

    mysql> insert into emp values ('wuyu','2014-08-09',2000,2);
    Query OK, 1 row affected (0.04 sec)

    对于含可空列的,非空但是含有默认值的字段,自增字段,可以不用在insert后添加列名.values后面直接对应列的值就行了.

    mysql> insert into emp(name) values('aaa');
    Query OK, 1 row affected (0.04 sec)

    +------+
    | Null |
    +------+
    | YES  |
    | YES  |
    | YES  |
    | YES  |
    +------+

    insert into tablename (列名1,列名2...列名n)values
    (值1,值2....值n),
    (值1,值2....值n),
    (值1,值2....值n),
    (值1,值2....值n)

    练习 : 创建部门表(dept)列名(deptno,deptname);
        并且添加6条数据.
    mysql> create table dept(
    -> deptno int,
    -> deptname varchar(10)
    -> );
    Query OK, 0 rows affected (0.27 sec)

    mysql> insert into dept values
    ->  (1,'wuyu'),
    ->  (2,'admin'),
    ->  (3,'wuyu1'),
    ->  (4,'admin2'),
    ->  (5,'wuyu3'),
    ->  (6,'admin4');
    Query OK, 6 rows affected (0.06 sec)
    Records: 6  Duplicates: 0  Warnings: 0

    mysql> select * from dept;
    +--------+----------+
    | deptno | deptname |
    +--------+----------+
    |      1 | wuyu     |
    |      2 | admin    |
    |      3 | wuyu1    |
    |      4 | admin2   |
    |      5 | wuyu3    |
    |      6 | admin4   |
    +--------+----------+
    6 rows in set (0.00 sec)

    可一次插入多条记录,用逗号隔开 :
     insert into dept values (1,'tech'),(2,'sale'),
    (5,'fin');     

2. 更新(update)
     update sowhat set love=250 where name='露西';
    即将表中name为露西的love值从90改为250;

对表中的数据,可以通过update命令进行修改. update 表名 set 列名1 = 值1,列名2 = 值2,...列名n = 值n [where 条件];

    mysql> update dept set deptname = 'wuyu';
    Query OK, 5 rows affected (0.08 sec)
    Rows matched: 6  Changed: 5  Warnings: 0
    注意 : 上面语法会将dept表中的deptname全部改为wuyu;
        在做修改的时候一般全部都会加上where语句.
    mysql> select * from dept;
    +--------+----------+
    | deptno | deptname |
    +--------+----------+
    |      1 | wuyu     |
    |      2 | wuyu     |
    |      3 | wuyu     |
    |      4 | wuyu     |
    |      5 | wuyu     |
    |      6 | wuyu     |
    +--------+----------+
    6 rows in set (0.00 sec)

    注 : 下面语句 只修改了deptno =2的数据.
    mysql> update dept set deptname = 'admin' where deptno = 2;
    Query OK, 1 row affected (0.11 sec)
    Rows matched: 1  Changed: 1  Warnings: 0

    mysql> select * from dept;
    +--------+----------+
    | deptno | deptname |
    +--------+----------+
    |      1 | wuyu     |
    |      2 | admin    |
    |      3 | wuyu     |
    |      4 | wuyu     |
    |      5 | wuyu     |
    |      6 | wuyu     |
    +--------+----------+
    6 rows in set (0.00 sec)

    修改表中多列的数据:
        mysql> update emp set sal = 3000,deptno = 1 where name = 'aaa';
        Query OK, 1 row affected (0.04 sec)
        Rows matched: 1  Changed: 1  Warnings: 0

        mysql> select * from emp;
        +-------+------------+------+--------+
        | name  | hiredate   | sal  | deptno |
        +-------+------------+------+--------+
        | admin | 1999-09-09 | 1500 |      1 |
        | wuyu  | 2014-08-09 | 2000 |      2 |
        | aaa   | NULL       | 3000 |      1 |
        +-------+------------+------+--------+
        3 rows in set (0.00 sec)

    练习 : 将所有员工的工资增加500块钱.   

    mysql> update emp set sal = sal+500 where deptno = 1;
    Query OK, 2 rows affected (0.06 sec)
    Rows matched: 2  Changed: 2  Warnings: 0

    mysql> select * from emp;
    +-------+------------+------+--------+
    | name  | hiredate   | sal  | deptno |
    +-------+------------+------+--------+
    | admin | 1999-09-09 | 2000 |      1 |
    | wuyu  | 2014-08-09 | 2000 |      2 |
    | aaa   | NULL       | 3500 |      1 |
    +-------+------------+------+--------+
    3 rows in set (0.00 sec)

3. 删除(delete)
    delete from sowhat where name='dony';
    将name=dony的记录全部删除

    如果数据不再需要,可以用delete命令进行删除

    delete from tablename [where condition];

    mysql> delete from dept;
    Query OK, 6 rows affected (0.05 sec)

    mysql> select * from dept;
    Empty set (0.00 sec)

    注意 : 如果不加where条件将会把表中所有数据全部删除.

    mysql> select * from emp;
    +-------+------------+------+--------+
    | name  | hiredate   | sal  | deptno |
    +-------+------------+------+--------+
    | admin | 1999-09-09 | 2000 |      1 |
    | wuyu  | 2014-08-09 | 2000 |      2 |
    | aaa   | NULL       | 3500 |      1 |
    +-------+------------+------+--------+
    3 rows in set (0.00 sec)

    mysql> delete from emp where name = 'aaa';
    Query OK, 1 row affected (0.04 sec)

    mysql> select * from emp;
    +-------+------------+------+--------+
    | name  | hiredate   | sal  | deptno |
    +-------+------------+------+--------+
    | admin | 1999-09-09 | 2000 |      1 |
    | wuyu  | 2014-08-09 | 2000 |      2 |
    +-------+------------+------+--------+
    2 rows in set (0.00 sec)


4. 查询(select)
    select * form 表名;  //无条件将表中的记录全部选出
    (1) 查询不重复记录(distinct 去除重复.)
    //查询表中的列字段信息
        select 列名 from 表名; 

    //查询表emp中的列字段信息,并去掉表中的记录去掉重复后显视
    出来,关键字distinct
        select distinct 列名 from 表名;  

    (2) 条件查询(where关键字可以显示用户指定的数据)
         1.  =,>,<,>=,<=,!=,<>

    //限定条件查询,查询所有name为安琪拉 
        select * from 表名 where name='安琪拉';

     逻辑运算符(or,and)
    //多字段限定条件查询,查询name='露西'并sex='女'的记录
    select * from 表名 where name='露西' and sex='女';

    mysql> select * from dept where deptno = 1 or deptname = 'cc';
    +--------+----------+
    | deptno | deptname |
    +--------+----------+
    |      1 | aa       |
    |      4 | cc       |
    +--------+----------+
    2 rows in set (0.02 sec)

    mysql> select * from emp where name ='admin' and sal >1000;
    +-------+------------+------+--------+
    | name  | hiredate   | sal  | deptno |
    +-------+------------+------+--------+
    | admin | 1999-09-09 | 2000 |      1 |
    +-------+------------+------+--------+
    1 row in set (0.00 sec)

    (3) 排序和限制
    //按某一列字段排序去除表的记录,默认为增序,或在列名用asc
    select * from 表名 order by 列名;

    //降序,列名后加关键字desc
    select * from 表名 order by 列名 desc;

    //多个排序字段,首先按列名1排序,在列名1相同时,按列名2排序
    select * from 表名 order by 列名1,列名2 asc;

    //表按照列的升序排列,limit起始偏移量为0,显示行数为2
    select * from 表名 order by 列名 limit 2

mysql> select * from sowhat order by name limit 2;
+-----------+------+------+------+
| name      | sex  | ID   | love |
+-----------+------+------+------+
| 安琪拉    | 女   | 004  |  150 |
| 虾米      | 男   | 001  |  100 |
+-----------+------+------+------+

    //表按照列的升序排列,limit起始偏移量为1,显示行数为2
    select * from 表名 order by 列名 limit 1,2;

mysql> select * from sowhat order by name limit 1,2;
+--------+------+------+------+
| name   | sex  | ID   | love |
+--------+------+------+------+
| 虾米   | 男   | 001  |  100 |
| 露娜   | 女   | 003  |  190 |
+--------+------+------+------+
2 rows in set (0.00 sec)

(4) 聚合
常见的聚合函数有sum(求和)、count(*)(记录数)、max(列名)、
min(列名)
avg(列名) 获取劣种的最大值

//统计表中的记录数
select count(1) from 表名;

//在上述统计总记录数的基础上,统计各个列名的记录数,GROUP BY
关键字表示要进行分类聚合的字段
 select 列名,count(1) from 表名 group by 列名;

mysql> select sex,count(1) from sowhat group by sex;
+------+----------+
| sex  | count(1) |
+------+----------+
| 女   |        3 |
| 男   |        1 |
+------+----------+
2 rows in set (0.05 sec)    

 //统计人数大于1的sex,HAVING关键字表示对分类后的结果再进
行条件的过滤,和WHERE的区别在于HAVING是对聚合后的结果进行过
滤,而HAVING是在聚合前的过滤
 select 列名,count(1) from 表名 group by 列名 having 
count(1)>1;

mysql>  select sex,count(1) from sowhat group by sex
    -> having count(1)>1;
+------+----------+
| sex  | count(1) |
+------+----------+
| 女   |        3 |
+------+----------+
1 row in set (0.00 sec)

//统计所有列的和,最大的列,最小的列,表的记录的个数
select sum(列名),max(列名),min(列名),count(1) from 表名;

mysql> select sum(love),max(love),min(love),count(1)
    -> from sowhat;
+-----------+-----------+-----------+----------+
| sum(love) | max(love) | min(love) | count(1) |
+-----------+-----------+-----------+----------+
|       690 |       250 |       100 |        4 |
+-----------+-----------+-----------+----------+
1 row in set (0.00 sec)

(5) 表连接
表连接分为内连接和外连接两大类,
    内连接仅选出表中相互匹配的记录
    外连接还会选出其他不匹配的记录
注 : 笛卡尔积,需要了解

//内连接,查询出表xiami和表sowhat中sex相同的ename,name的
信息,并显示出来
select 列名1,列名2 from 表名1,表名2 where 
表名1.列名3=表名2.列名4;

mysql> select name,ename from sowhat,xiami
    -> where xiami.sex=sowhat.sex;
+-----------+--------+
| name      | ename  |
+-----------+--------+
| 虾米      | 李白   |
| 露西      | 妲己   |
| 露娜      | 妲己   |
| 安琪拉    | 妲己   |
+-----------+--------+
4 rows in set (0.00 sec)

外连接分为左连接和右连接,区别是左连接即包含所有的左边表中的记
录甚至右边表中没有和它匹配的记录,右连接则反之

//左连接
 select 列名1,列名2 from 表名1 left join 表名2 on 
表名1.列名3=表名2.列名4;

mysql> select name,ename from sowhat left join xiami
    ->  on xiami.sex=sowhat.sex;
+-----------+--------+
| name      | ename  |
+-----------+--------+
| 虾米      | 李白   |
| 露西      | 妲己   |
| 露娜      | 妲己   |
| 安琪拉    | 妲己   |
| 达摩      | NULL   |
+-----------+--------+
5 rows in set (0.00 sec)

//右连接

mysql> select ename,name from xiami right join sowhat
    ->  on xiami.sex=sowhat.sex;
+--------+-----------+
| ename  | name      |
+--------+-----------+
| 李白   | 虾米      |
| 妲己   | 露西      |
| 妲己   | 露娜      |
| 妲己   | 安琪拉    |
| NULL   | 达摩      |
+--------+-----------+
5 rows in set (0.00 sec)

(6) 别名
mysql> select name,count(love) money from sowhat;
+--------+-------+
| name   | money |
+--------+-------+
| 虾米   |     4 |
+--------+-------+
1 row in set (0.00 sec)

mysql> select name,count(love) as money from sowhat;
+--------+-------+
| name   | money |
+--------+-------+
| 虾米   |     4 |
+--------+-------+
1 row in set (0.00 sec)

(7) 子查询
当我们查询的时候需要的条件是另一个表中的select语句的结果,这个
时候需要子查询

关键字 : in,not in,=,!=,exists,no exists等

=只能查询,返回结果唯一的时候使用.
in 可以是唯一或不唯一都可以.    
mysql> select * from what w where w.deptno in (select deptno from dept);
+-----------+------------+------+--------+
| name      | hiredate   | sal  | deptno |
+-----------+------------+------+--------+
| 妲己      | 1997-02-01 | 4000 |      1 |
| 安琪拉    | 1992-01-06 | 5600 |      1 |
| 李白      | 1665-02-01 | 2100 |      3 |
| 貂蝉      | 1850-05-06 | 3500 |      1 |
| 达摩      | 1990-01-01 | 2000 |      2 |
+-----------+------------+------+--------+
(8) union和union all

6. 主键
    关系型数据库中一条记录有若干个属性,若其中某一个属性能唯一
  标记这条记录,则我们称这个属性为主键.
    主键不能重复,一个表只能有一个主键
     alter table 表名 add primary key(字段名);

mysql> create table student(
    -> stuId int primary key,
    -> name varchar(20),
    -> age int);

当重复插入:
mysql> insert into what values('安琪拉','1992-01-06',5600,1);
ERROR 1062 (23000): Duplicate entry '安琪拉' for key 'PRIMARY'

7. 外键
    外键用于另一张表的关联,是能确定另一张表记录的字段,用于保
  持数据的一致性
    alter table 需要家外键的表 add constraint 外键名 
    foreign key(需要加外键约束的字段名) references 关联表
    名(关联字段名)

DCL语句

1. 主要是DBA用来管理系统中的对象权限.
创建一个数据库用户,管理对数据库
mysql> grant select,insert on lq.* to 'xiami'@'localhost'
-> identified by 'root';

C:\Users\Administrator>mysql -uxiami -proot

数据类型

1. 数值类型
    1. integer   java int
    2. smallint  32767~65535
    3. decimal,dec(m,d) 和double范围相同   
    4. float
    5. real  
    6. double
    7. money
2. 字符类型
    1. char      0~255 之间的字符
    2. varchar   0~65535的字符
    3. text      0~65535
    4. longtext  0-4 294 967 295字节 极大文本数据
    5. VARBINARY(M) 可以储存多少M的字节
3. 日期和时间
    1. date      yyyy-mm-dd
    2. datetime  yyyy-dd-dd hh:mm:ss
    3. timestamp 时间戳
    4. time      hh:MM:ss
    5. year      yyyy

推荐阅读