什么是数据库
存储数据的仓库. 其本质是一个文件系统,数据库按照特定的格式将数据存储起来,用户可以对数据库中的数据进 行增加,修改,删除及查询操作。
常见的数据库
- MYSQL:开源免费的数据库,小型的数据库.已经被Oracle收购了.MySQL6.x版本也开始收费。
- Oracle:收费的大 型数据库,Oracle公司的产品。Oracle收购SUN公司,收购MYSQL。
- DB2 :IBM公司的数据库产品,收费的。常应 用在银行系统中. SQLServer:MicroSoft 公司收费的中型的数据库。C#、.net等语言常使用。
- SyBase:已经淡出 历史舞台。提供了一个非常专业数据建模的工具PowerDesigner。
- SQLite: 嵌入式的小型数据库,应用在手机端。
SQL语句分类
- DDL(Data Definition Language)数据定义语言 用来定义数据库对象:数据库,表,列等。关键字:create, drop,alter等
- DML(Data Manipulation Language)数据操作语言 用来对数据库中表的数据进行增删改。关键字:insert, delete, update等
- DQL(Data Query Language) 数据查询语言 (掌握) DQL语言并不是属于MYSQL官方的分类,但是对数据库的操作最多就是查询,所以 我们的程序员把查询语句的语句称作为DQL语言
- DCL(Data Control Language)数据控制语言(了解) 用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT, REVOKE等
- TCL(Transaction Control Language) 事务控制语言 用于控制数据库的事务操作,关键字; COMMIT,SAVEPOINT,ROLLBACK等
常用SQL语句
1.查询所有数据库的名称:show databases;
2.查询数据库的字符集:show create database 数据库名称;
3.创建一个新的数据库:create database 数据库名称;
4.删除数据库:drop database 数据库名称;
5.查询当前正在使用的数据库:select databases();
6.使用指定名称的数据库:use 数据库名称;
7.查询正在使用的数据库中的所有表名称:show tables;
8.查询表结构:desc 表名称;
9.创建一个表:create table 表名称 (字段名称....)values(数据类型....);
10.删除一个表:drop table 表名称;
11.复制一个表:create table 表名称 like 原表名;
12.修改表名:alter table 表名称 rename to 新表名;
13.修改表的字符集:alter table 表名称 character set 字符集名称
14.添加新的列:alter table 表名称 add 列名 数据类型;
15.修改列名称:alter table 表名称 change 列名称 新列名称 新数据类型;
16.删除列名:alter table 表名称 drop 列名称;
17.添加数据:insert into 表名称(列名称...)values(值...);
18.删除数据:delete from 表名称 where 条件语句;
19.修改数据:update 表名称 set 列名称=值 ... where 条件语句;
20.显示表中的全部数据:select * from 表名称;
21.去除重复的结果集:select distinct 列名称 from 表名称;
22.分组查询:select from 表名称 group by 分组字段;
23.分页查询:select * from 表名称 limit
创建一个数据库表格
CREATE TABLE students(
id int,
name varchar(100),#姓名,可变长度
age int,#年龄
gender char(1),#性别。
address varchar(200),#地址
math int,#数学成绩
english int #英语成绩
);
INSERT INTO students (id,name,age,gender,address,math,english) VALUES (1,'令狐冲',28,'男','黑木崖',98,91);
INSERT INTO students (id,name,age,gender,address,math,english) VALUES (2,'杨过',28,'男','黑木崖',18,93);
INSERT INTO students (id,name,age,gender,address,math,english) VALUES (3,'小龙女',18,'女','黑木崖',28,80);
INSERT INTO students (id,name,age,gender,address,math,english) VALUES (4,'黄老邪',48,'男','黑木崖',88,70);
INSERT INTO students (id,name,age,gender,address,math,english) VALUES (5,'郭靖',20,'男','黑木崖',78,30);
查询math分数大于80分的学生:
select * from students where math>80;
查询english分数小于或等于80分的学生 :
select * from students where english <= 80;
查询age等于20岁的学生:
select * from students where age = 20;
查询age不等于20岁的学生:
select * from students where age != 20;
查询age大于35且性别为男的学生(两个条件同时满足):
select * from students where age > 35 and gender='男';
查询age大于35或性别为男的学生(两个条件其中一个满足):
select * from students where age > 35 or gender = '男';
查询id是1或3或5的学生 :
select * from students where id in (1,3,5);
查询id不是1或3或5的学生:in运算符
select * from students where id not in(1,3,5);
查询english成绩大于等于75,且小于等于90的学生:
select * from students where english between 75 and 90;
查询姓杨的学生:
select * from students where name like '杨%';
查询姓名中包含'女'字的学生:
select * from students where name like '%女%';
查询姓“黄”,且姓名有三个字的学生:
select * from students where name like '黄_ _';
查询所有数据,使用年龄降序排序:
select * from students order by age desc;
查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩降序排序:
select * from students order by age desc,math desc;
查询学生总数:
select count(*) from students;
查询年龄大于40的总数:
select count(*) from students where age>40;
查询数学成绩总分:
select sum(math) from students ;
查询数学成绩平均分:
select avg(math) from students;
查询数学成绩最高分:
select max(math) from students;
查询数学成绩最低分:
select min(math) from students;
按性别分组:
select gender,count(*) from students group by gender;
查询年龄大于25岁的人,按性别分组,统计每组的人数:
select gender,count(*) from students where age > 25 group by gender;
查询年龄大于17岁的人,按性别分组,统计每组的人数,并只显示性别人数大于2的数据:
select gender,count(*) from students where age > 17 group by gender having count(*)>2;
查询前3条记录:
select * from students limit 0,3;
数据库完整性约束
#创建表的时候直接设置主键id
#方式一:
create table students(
id int primary key; # 把id定为主键
name varchar(100)
);
#方式二:
create table students(
id int;
name varchar(100);
primary key(id)
);
#设置主键自动增长(mysql独有的)
careate table students(
id int PRIMARY KEY auto_increment,#自动增长的主键
name varchar(100)
);
多表查询:
隐式内连接查询(不使用连接关键字):
select * from dept,emp where dept.id=emp.dept_id;
显示内连接查询(使用连接关键字):
SELECT d.name,e.name,e.gender,e.salary FROM dept d JOIN emp e ON d.id=e.dept_id;
左外连接查询:
SELECT * FROM dept d LEFT JOIN emp e ON d.`id`=e.`dept_id`;
右外连接查询:
SELECT * FROM dept d RIGHT JOIN emp e ON d.`id`=e.`dept_id`;
事务的基本四个特性:
A:原子性:指处于同一个事务中的操作是不可分割的单位。要么全都成功,要么全都失败。(比喻手法)
C:一致性:指事务应该由一个一致性状态变为另外一个一致性状态。比如:aaa和bbb账户总额2000,执行转账操作,无论成功还是失败,aaa和bbb账户总和还是2000。
I:隔离性:指多线程环境下。一个事务不能被另外一个事务所打扰。(被打扰就不对,好比上厕所)
D:持久性:数据应该被持久化。即使DBMS坏掉了,数据应该还是完整的。
不考虑隔离级别会出现什么问题?
脏读:指一个事务读到了另外一个事务中未提交的数据。
不可重复度:指一个事务读到了另外一个事务提交的更新的数据,造成的是前后读到的内容不一致。
虚读(幻读):指一个事务读到了另外一个事物提交的插入(INSERT)的数据,造成前后读到的记录条数不一致。
事务的隔离级别
1 READ UNCOMMITTED:脏读、不可重复读、虚读都有可能发生。
2 READ COMMITTED:防止脏读,不可重复读、虚读都有可能发生。
4 REPEATABLE READ:防止脏读、不可重复读,虚读有可能发生。
8 SERIALIZABLE:防止脏读、不可重复读、虚读的发生。
小结:级别越高,数据越安全,但是效率最低(单线程)。
级别越低,数据越不安全,效率越高。
MySQL默认级别是REPEATABLE READ,Oracle默认级别READ COMMITTED。数据库产品不一定支持所有级别(最高和最低级别根本不支持)