数据库
数据库
数据文件
日志文件
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