数据库(DataBase,DB):指长期保存在计算机的存储设备上,按照一定规则组织起来,可以被各种用户或应用共享的数据集合。(文件系统)
数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中的数据。
数据库软件应该为数据库管理系统,数据库是通过数据库管理系统创建和操作的。
数据库:存储、维护和管理数据的集合。
SQL:Structure Query Language。(结构化查询语言)
SQL被美国国家标准局(ANSI)确定为关系型数据库语言的美国标准,后来被国际化标准组织(ISO)采纳为关系数据库语言的国际标准。
各数据库厂商都支持ISO的SQL标准。(普通话)
各数据库厂商在标准的基础上做了自己的扩展。(方言)
Data Definition Language:数据定义语言,用来定义数据库对象:库、表、列等;
使用的关键字:CREATE、 ALTER、 DROP
创建名称为mydatabase的数据库
create database mydatabase; //创建数据库
查看当前数据库服务器中所有的数据库
show databases;
删除mydatabase数据库
drop database mydatabase;
查看当前使用的数据库
select database();
切换数据库
use mydatabase;
* 创建表语法:
create table 表名(
字段1 字段类型 长度,
字段2 字段类型 长度,
...
字段n 字段类型 长度
);
* MySql常用数据类型:
int |
整型 |
double/float |
浮点型,例如double(5,2)表示最多5位,其中必须有2位小数 |
char |
固定长度字符串类型char(10) 'abc ' |
varchar |
可变长度字符串类型;varchar(10) 'abc' |
text |
大文本类型 |
blob |
字节类型,多用于存储图片 |
date |
日期类型,格式为:yyyy-MM-dd |
time |
时间类型,格式为:hh:mm:ss |
timestamp |
时间戳类型 yyyy-MM-dd hh:mm:ss 会自动赋值 |
datetime |
日期时间类型 yyyy-MM-dd hh:mm:ss |
修改表结构
ALTER TABLE table_name ADD column_name datatype
ALTER TABLE table_name DROP COLUMN column_name
ALTER TABLE table_name change COLUMN column_name datatype
查看表的字段信息
desc emp;
为emp表添加“age”字段(int类型,长度为5):
alter table emp add age int(5) ;
删除emp表中age字段:
alter table emp drop age;
修改emp表中name字段的名称为rname,类型改为字符串,长度15;
alter table emp change name rname varchar(15);
修改emp表的名称为emp2:
rename table emp to emp2;
删除表
drop table emp2 ;
数据操纵语言;
DML是对表中的数据进行增、删、改的操作。
INSERT 、UPDATE、 DELETE
小知识:
在mysql中,字符串类型和日期类型都要用单引号括起来。'tom' '2015-09-04'
空值:null
语法: INSERT INTO 表名(列名1,列名2 ...)VALUES(列值1,列值2...);
注意: 1.列名与列值的类型、个数、顺序要一一对应。
2.值不要超出列定义的长度。
3.如果插入空值,使用null
4.插入的日期和字符一样,都使用引号括起来。
Ø 逐条插入:
INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)
VALUES(1,'zhangsan','female','1990-5-10',10000,'2015-5-5-','good girl');
Ø 批量插入:
INSERT INTO emp VALUES
(2,'zs','m','2015-09-01',10000,'2015-09-01',NULL),
(3,'li','m','2015-09-01',10000,'2015-09-01',NULL),
Ø 语法:UPDATE 表名 SET 列名1=列值1,列名2=列值2 …… WHERE 列名=值
注:如果没有where条件,那么将会对所有行进行修改
练习:在修改上面创建的emp员工表
将所有员工薪水修改为5000元。
UPDATE emp SET salary=5000
将姓名为’tom’的员工薪水修改为3000元。
UPDATE emp SET salary=3000 WHERE name=’ tom’;
将姓名为 ’lili’ 的员工薪水修改为4000元,job改为’HR’。
UPDATE emp SET salary=4000,job=’HR’WHERE name='lili';
将tom的薪水在原有基础上增加1000元。
UPDATE emp SET salary=salary+1000 WHERE name='tom';
语法 : delete from 表名 【WHERE 列名=值】
练习 :
删除表中名称为’zs’的记录。
delete from emp where name=‘zs’;
删除表中所有记录。
delete from emp;
注:不加where条件,会将表中所有数据删除
DQL(Data Query Language):数据查询语言,用来查询表中记录(数据)。使用SELECT命令;数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。查询返回的结果集是一张虚拟表。
语法: SELECT 列名1, 列名2…列名n from表名
【WHERE --> GROUP BY -->HAVING--> ORDER BY】
解析:
SELECT column1, column1…columnN /*要查询的列名称*/
FROM tablename /*要查询的表名称*/
WHERE condition /*行条件*/
GROUP BY grouping_columns /*对结果分组*/
HAVING condition /*分组后的行条件*/
ORDER BY sorting_columns /*对结果排序*/
LIMIT offset_start, row_count /*结果限定*/
SELECT * FROM stu;
SELECT sid, sname, age FROM stu;
条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字:
Ø =、!=、<>、<、<=、>、>=;
Ø BETWEEN…AND;
Ø IN(….);
Ø IS NULL; IS NOT NULL
Ø AND;
Ø OR;
Ø NOT;
SELECT * FROM stu
WHERE gender='female' AND age<50;
SELECT * FROM stu
WHERE sid ='S_1001' OR sname='liSi';
SELECT * FROM stu
WHERE sid IN ('S_1001','S_1002','S_1003');
SELECT * FROM tab_student
WHERE s_number NOT IN ('S_1001','S_1002','S_1003');
SELECT * FROM stu
WHERE age IS NULL;
SELECT *
FROM stu
WHERE sname IS NOT NULL;
或者
SELECT *
FROM stu
WHERE NOT sname IS NULL;
SELECT *
FROM stu
WHERE age>=20 AND age<=40;
或者
SELECT *
FROM stu
WHERE age BETWEEN 20 AND 40;
当想查询姓名中包含a字母的学生时,需要使用模糊查询。
关键字:LIKE。
通配符:
l _: (下划线)代表任意一个字符
l %: (百分号)代表任意0 ~ n个字符
SELECT *
FROM stu
WHERE sname LIKE '_ _ _ _ _';(5个下划线)
模糊查询必须使用LIKE关键字。其中 “_”匹配任意一个字母,5个“_”表示5个任意字母。
SELECT *
FROM stu
WHERE sname LIKE '_ _ _ _ i';
SELECT *
FROM stu
WHERE sname LIKE 'z%';
其中“%”匹配0~n个任何字母。
SELECT *
FROM stu
WHERE sname LIKE '_i%';
SELECT *
FROM stu WHERE sname LIKE '%a%';
如果需要找出表中的某一列有哪些不同的值,可以使用DISTINCT关键字(去重复值)
Select distinct 列名称 from 表名称
Ø 查看雇员的月薪与佣金之和
如果表中的两列字段的类型都是数值类型,可以做算数运算。
SELECT *,sal+comm FROM emp;
如果相加的两列中的其中一列值为null,相加后得出的结果还是为null,因为任何数值与NULL相加结果还是NULL,所以结算结果可能会出现NULL需要使用ifnull()函数把NULL转换成数值0:
SELECT *,sal+IFNULL(comm,0) FROM emp;
在上面查询结果中,出现列名为sal+IFNULL(comm,0),这很不美观,现在我们给这一列给出一个别名,为total:
SELECT *, sal+IFNULL(comm,0) as total FROM emp;(as可以省略)
Select s.sid,s.sname,s.* from t_student s;
为表添加别名,直接在表明后添加即可;这样就可以通过别名的方式调用表中的字段。
order by 列名 asc(默认- 升序) / desc(降序)
SELECT * FROM stu ORDER BY sage asc ; (asc可以省略)
SELECT * FROM stu ORDER BY age desc ;
SELECT * FROM emp ORDER BY sal DESC , empno ASC;
sum()、 avg()、 max()、 min() 、count()
聚合函数是用来做纵向运算的函数:
l COUNT():统计指定列不为NULL的记录行数;
l MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
l MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
l SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
l AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
l 查询emp表中记录数:
SELECT COUNT(*) AS cnt FROM emp;
或
SELECT COUNT(1) AS cnt FROM emp;(效率更高,推荐使用)
l 查询emp表中有佣金的人数:
SELECT COUNT(comm) cnt FROM emp;
注意,因为count()函数中给出的是comm列,那么只统计comm列非NULL的行数。
l 查询emp表中月薪大于2500的人数:
SELECT OUNT(*) ROM emp WHERE sal > 2500;
l 统计月薪与佣金之和大于2500元的人数:
SELECT COUNT(*) AS cnt FROM emp WHERE sal+IFNULL(comm,0) > 2500;
当需要纵向求和时使用sum()函数。
l 查询所有雇员月薪和:
SELECT SUM(sal) FROM emp;
l 统计所有员工平均工资:
SELECT AVG(sal) FROM emp;
l 查询最高工资和最低工资:
SELECT MAX(sal), MIN(sal) FROM emp;
当需要分组查询时需要使用GROUP BY子句;
例如查询每个部门的工资和(部门,工资),这说明要使用部门来分组,对每个部门的工资求和;
select deptno,sum(sal) from emp group by deptno;
注:凡和聚合函数同时出现的列名,一定要写在group by 之后作为分组维度。
l 查询每个部门的部门编号和每个部门的工资和:
SELECT deptno, SUM(sal) FROM emp GROUP BY deptno;
l 查询每个部门的部门编号以及每个部门的人数:
SELECT deptno,COUNT(*) FROM emp GROUP BY deptno;
l 查询每个部门的部门编号以及每个部门工资大于1500的人数:
SELECT deptno,COUNT(*)
FROM emp
WHERE sal>1500
GROUP BY deptno;
l 查询工资总和大于90000的部门编号以及工资和:
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno
HAVING SUM(sal) > 90000;
注:having与where的区别:
1. having是在分组后对数据进行过滤.
where是在分组前对数据进行过滤
2. having后面可以使用聚合函数(统计函数)
where后面不可以使用聚合函数。
LIMIT用来限定查询结果的起始行,以及要显示的总行数。
SELECT * FROM emp LIMIT 0, 5;
注意,起始行从0开始,即第一行开始!
SELECT * FROM emp LIMIT 3, 10;
如果一页记录为10条,希望查看第3页记录应该怎么查呢?
l 第一页记录起始行为0, 一共查询10行;
l 第二页记录起始行为10,一共查询10行;
l 第三页记录起始行为20,一共查询10行;
DCL(Data Control Language):是数据库控制功能;
用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL
保证用户输入的数据保存到数据库中是正确的,确保数据的完整性就是在创建表时给表中添加约束。
完整性的分类:
> 实体完整性
> 域完整性
> 引用完整性
实体:即表中的一行(一条记录)代表一个实体对象(entity)
实体完整性:指表中行的完整性。要求表中的所有行都有唯一的标识符,称为主关键字。
约束类型: 主键约束(primary key) 唯一约束(unique) 自动增长列(auto_increment)
特点:数据唯一,且不能为null
Ø 第一种添加方式:
CREATE TABLE student(
Id int primary key not null,
Name varchar(50)
);
Ø 第二种添加方式
CREATE TABLE student(
id int,
Name varchar(50),
Primary key(id)
);
此种方式优势在于,可以创建联合主键(多个字段组合起来做为一个表的主键)
CREATE TABLE student(
id int,
Name varchar(50),
Primary key(id,name)
);
Ø 第三种添加方式:
CREATE TABLE student(
Id int,
Name varchar(50)
);
ALTER TABLE student
ADD PRIMARY KEY (id);
添加唯一约束
方式1:
CREATE TABLE student(
Id int primary key,
Name varchar(50) unique
);
方式2:
CREATE TABLE student(
Id int primary key,
Name varchar(50)
);
ALTER TABLE emp2
ADD UNIQUE (name);
使用场景:新浪微博校验用户名唯一
给主键添加自动增长的数值,列只能是整数类型,但是如果删除之前增长的序号,后面再添加的时候序号不会重新开始,而是会接着被删除的那一列的序号
CREATE TABLE student(
Id int primary key auto_increment,
Name varchar(50)
);
INSERT INTO student(name) values(‘tom’);
域完整性指列的值域的完整性,保证表中某些列不能输入无效的值。
包括:数值类型、日期类型、字符串类型…
例如:如果属性类型是整数,那么它就不能是101.5或任何非整数。
CREATE TABLE student(
Id int pirmary key,
Name varchar(50) not null,
Sex varchar(10)
);
INSERT INTO student values(1,’tom’,null);
CREATE TABLE student(
Id int pirmary key,
Name varchar(50) not null,
Sex varchar(10) default ‘男’
);
insert into student1 values(1,'tom','女');
insert into student1 values(2,'jerry',default);
例如t_person表和t_card表,即公民表和身份证表。这种情况需要找出主从关系,即谁是主表,谁是从表。人可以没有身份证(黑户),但每一张身份证必须要有对应的公民,所以人是主表,而身份证是从表。
设计从表可以有两种方案:
1、在t_card表中添加“外键列”(指向t_person表主键)并且给外键添加唯一约束
2、给t_card表的主键添加外键约束(相对t_person表),即t_card表的主键也是外键
例如班级与学生的关系(t_class和t_student)从t_class的角度来看是一对多,从t_student的角度来看就是多对一
处理方式:在多方表中创建外键字段(class_id),指向一方表的主键(cid)
例如t_stu和t_teacher表,即一个学生可以有多个老师,而一个老师也可以有多个学生。这种情况通常需要创建中间表来处理多对多关系。例如再创建一张表t_stu_tea表,给出两个外键,一个相对t_stu表的外键,另一个相对t_teacher表的外键。
引用完整性又称参照完整性。引用完整性用来保证主表和从表之间的数据一致性,它通过主键(PRIMARY KEY)约束和外键(FOREIGN KEY)约束来实现。
多表查询有如下几种:
l 合并结果集(联合查询):UNION 、UNION ALL(纵向拼接)
l 连接查询
Ø 内连接 [INNER] JOIN ON
Ø 外连接 OUTER JOIN ON
² 左外连接 LEFT [OUTER] JOIN
² 右外连接 RIGHT [OUTER] JOIN
² 全外连接(MySQL不支持)FULL JOIN
Ø 自然连接 NATURAL JOIN
l 子查询
a) 合并结果集就是把两个select语句的查询结果合并到一起(纵向拼接)
b) 合并结果集有两种方式:
l UNION:去除重复记录,例如:SELECT * FROM t1 UNION SELECT * FROM t2
l UNION ALL:不去除重复记录,例如:SELECT * FROM t1 UNION ALL SELECT * FROM t2