1.数据以表格的形式出现
2.每行为各种记录名称
3.每列为记录名称所对应的数据域
4.许多的行和列组成一张表单
5.若干的表单组成database
常用数据库MySQL、Microsoft SQL Server、Oracle 都是一种关系型数据库管理系统(RDBMS);Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。
数据库: 数据库是一些关联表的集合。
数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
列: 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。
行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
主键:主键是唯一的(Primary Key)。一个数据表中只能包含一个主键。你可以使用主键来查询数据。(往往主键设置约束为自增长”auto_increment”)
外键:外键(foreign key)用于关联两个表。
复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
Mysql基本操作
1. Mysql安装与配置
官方下载MySQL(在以后的开发中,推荐在官方去下载相关资料)
下载地址:https://mysql/downloads/
参考百度MySQL5.7安装经验,地址:jingyan.baidu/article/7e440953d6f0702fc1e2ef61.html
进入服务器配置,可以选择3种服务器类型,选择哪种服务器将影响到MySQL Configuration Wizard(配置向导)对内存、硬盘和过程或使用的决策。
Developer Machine(开发机器):该选项代表典型个人用桌面工作站。假定机器上运行着多个桌面应用程序。将MySQL服务器配置成使用最少的系统资源。
Server Machine(服务器):该选项代表服务器,MySQL服务器可以同其它应用程序一起运行,例如FTP、email和web服务器。MySQL服务器配置成使用适当比例的系统资源。
Dedicated MySQL Server Machine(专用MySQL服务器):该选项代表只运行MySQL服务的服务器。假定运行没有运行其它应用程序。MySQL服务器配置成使用所有可用系统资源。
2. Mysql数据库常用命令
格式: mysql -h主机地址 -u用户名 -p用户密码
○1、连接到本机上的MYSQL。
首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户名前可以有空格也可以没有空格,但是密码前必须没有空格,否则让你重新输入密码。
如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是: mysql>
○2、连接到远程主机上的MYSQL。假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令:
mysql -h110.110.110.110 -u root -p 123;(注:u与root之间可以不用加空格,其它也一样)
格式:mysqladmin -u用户名 -p旧密码 password 新密码
○1、给root加个密码xiaoxiao 首先在DOS下进入目录mysql\bin,然后键入以下命令mysqladmin -u root -password xiaoxiao
注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。
○2、再将root的密码改为svse
mysqladmin -u root -p xiaoxiao password
注意:创建数据库之前要先连接Mysql服务器
命令:create database <数据库名>
例1:建立一个名为xhkdb的数据库
mysql> create database xhkdb;
例2:创建数据库并分配用户
② CREATE DATAbase 数据库名;
○3grant [权限] on 数据库.* to 用户名@登录主机 identified by "密码";
例如:grant select,update on testDB.* to test@localhost identified by '1234';
? 删除数据库—drop database 数据库名
? 显示数据库—show databases
? 使用某一个数据库—use 数据库名
? 查询当前登录的用户名—select current_user()
? 查询数据库系统当前时间—select now();
? 查看当前数据库— select database();
? 查看当前数据库版本— select version();
? 查看表结构—describe 表名
? 显示当前数据库下所有的表—show tables
? 退出命令行-exit或者Quit
MySQL数据类型
1. 数值型 SMALLINT(较小整数)、INT (标准整数) 、 BIGINT (大整数) 、 FLOAT(单精度浮点数)、 DOUBLE(双精度浮点数)、 DECIMAL(串浮点数,不存在精度损失,常用语银行账目计算)
2. (字符)串值CHAR(定长字符串)、 VARCHAR(可变长字符串)、 TEXT(小文本串)、 LONGTEXT(大文本串)
3. 日期和时间值 DATE(日期)、 TIME(时间)、 DATETIME( DATETIME )、 TIMESTAMP[(M)](自1970 年开始的时间)、 YEAR[(M)](年份)
4. NULL 值
1. 创建数据表格式
CREATE TABLE数据表名称 (
字段定义1,
字段定义2,
…
字段定义n(注意最后一个不能加逗号,其它每个字段结束都需要加逗号结束本字段定义)
);
字段定义格式:字段名称 字段类型 [not null] [default 默认值] [primary key] [auto_increment]
注意:字段名大小写不敏感
PRIMARY KEY(字段名称1, 字段名称2, …)
FOREIGN KEY(字段名称1,字段名称2, …)
UNIQUE(字段名称1,字段名称2, …)
INDEX (字段名称1,字段名称2, …)
CHECK(字段条件)
例如Employees 表初步规划如下
ID Name Address Tel Sex Birthday Salary MemoInt(4) Varchar(20) Varchar(200) Varchar(18) Int(4) Datetime Double text
Create table Employees(
Id int(4) primary key auto_increment,
Name varchar(20) not null,
Address varchar(200) not null,
Tel varchar(18),
Sex int(4) not null default 0,
Birthday datetime not null,
Salary double not null,
Memo text(200)
(如果有外键)foreign key(外键名) references 关联的表名(对应的字段名),
……
(如果有外键)foreign key(外键名) references 关联的表名(对应的字段名)
)auto_increment=1001;
3. 对数据表的增删该查操作(select, insert ,delete,update,drop等用法)
INSERT INTO 数据表名称 (字段1, 字段2, …) VALUES (值1, 值2, …);
如: Insert into card(CNO,Name,Cname) values (1,’xiaoxiao’,’D1701’);
UPDATE 数据表名称SET 字段1 = 值1, 字段2 = 值2, … WHERE 条件;
如:update card set CNAME=‘D1702’ where CNO=1;
===============================================================================
DELETE FROM 资料表名称WHERE 条件;
如:delete from card where cno=1;
===============================================================================
SELECT 字段1, 字段2, … FROM 数据表名称 [WHERE 条件];
如:
Select CNO,NAME,CNAME from card;
Select * from card;
Select * from cards where CNO=1;
ALTER 修改表结构的用法
1:删除列
ALTER TABLE 【表名字】 DROP 【列名称】
2:增加列
ALTER TABLE 【表名字】 ADD 【列名称】 INT NOT NULL COMMENT '注释说明'
3:修改列的类型信息
ALTER TABLE 【表名字】 CHANGE 【列名称】【新列名称(这里可以用和原来列同名即可)】 BIGINT NOT NULL COMMENT '注释说明'
4:重命名列
ALTER TABLE 【表名字】 CHANGE 【列名称】【新列名称】 BIGINT NOT NULL COMMENT '注释说明'
5:重命名表
ALTER TABLE 【表名字】 RENAME 【表新名字】
6:删除表中主键
Alter TABLE 【表名字】 drop primary key
7:添加主键
ALTER TABLE sj_resource_charges ADD ConSTRAINT PK_SJ_RESOURCE_CHARGES PRIMARY KEY (resid,resfromid)
8:添加索引
ALTER TABLE sj_resource_charges add index INDEX_NAME (name);
9: 添加唯一限制条件索引
ALTER TABLE sj_resource_charges add unique emp_name2(cardnumber);
10: 删除索引
alter table tablename drop index emp_name;
Mysql数据库中高级查询一(单表查询,模糊查询,子查询,聚合查询,多表联合查询)
模糊查询使用LIKE关键字进行:配合LIKE完成工作,还有两个通配符”%”和”_”;
%表示在出现它的位置匹配任意多个字符
_表示在出现它的位置匹配一个字符
如:select * from books where bname like ‘%java%’
LIKE 'Mc%' 将搜索以字母Mc 开头的所有字符串(如McBadden )。
LIKE '%inger' 将搜索以字母inger 结尾的所有字符串(如Ringer 或Stinger )。
LIKE '%en%' 将搜索热议位置包含字母en 的所有字符串(如Bennet、Green 和McBadden )。
LIKE '_heryl' 将搜索以字母heryl 结尾的所有6个字母的字符串(如Cheryl 和Sheryl)。
LIKE '[CK]ars[eo]n' 将搜索第一个字母是C 或 K,接下来是ars,第五个字母是e 或 o,第6个字母是n 的单词(如Carsen、Karsen、Carson 或 Karson)。
LIKE '[M-Z]inger' 将搜索以字母inger 结尾,以M~Z 中的任何单个字母开头的所有字符串(如Ringer )。
LIKE 'M[^C]%'将搜索以字母M 开头,并且第二个字母不是c 的所有字符串(如MacFeather )。
1.给字段取别名(as)
2. 使用表达式和函数(AVG()求平均值,COUNT()返回行数、MAX()最大值、MIN(),最小值、SUM()求和,ifnull(expre,expre2))
3. 对查询结果进行排序(order by )和分组(group by)
4.筛选having的使用
5. 限制返回结果的行数(limit 0,5)(注意后面不需要带括号,0代表从第一行开始,5代表取前5条信息)
6. 消除重复的行(distinct)
7.使用IN 和NOT IN 的子查询(IN 操作符是用来指定条件范围的)
8.使用EXISTS 和NOT EXISTS 的子查询(EXISTS 关键字是用于判断查询是否存在的关键字,如果查询存在则返回值为真)
===============================================================================
子查询(理解查询出来的结果可以当做一个新表 from后面的嵌套select语句)
多表联合查询
左外连接(left join on):以左表为主,保持左表的数据不变,右表的数据与之匹配
右处连接(right join on):以右表为主,保持右表的数据不变,左表的数据与之匹配
交叉连接(corss join on):与内连接的效果完全相同,在此不再赘述。
内联连接(inner join on):2张表只有相互匹配的数据才会查找出来
UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行。
UNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出所有的值。
注意:
1、UNION 结果集中的列名总是等于第一个 SELECT 语句中的列名
2、UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同
语法: SELECT 列名 FROM 表名UNION| UNION ALL SELECT列名 FROM表名 =
实战案例分享(2张表emp和dept)
提示:
emp员工表(empno员工号/ename员工姓名/job工作/mgr上级编号/hiredate受雇日期/sal薪金/comm佣金/deptno所属部门编号)
dept部门表(deptno部门编号/dname部门名称/loc地点)
工资 = 薪金 + 佣金
select * from dept where dept.deptno in(select distinct emp.deptno from emp);
select * from emp where sal>(select sal from emp where ename='SMITH');
select e.ename,e.mgr,m.ename from emp e inner join emp m on e.mgr=m.empno;
select e.* from emp e where e.hiredate <(select m.hiredate from emp m where e.mgr=m.empno);
select dname,emp.* from dept left join emp on emp.deptno=dept.deptno
select ename,job,dname from emp inner join dept on emp.deptno=dept.deptno where job='CLERK';
select job,min(sal) as t from emp group by job having t>1500;
select dname,ename from emp inner join dept on emp.deptno = dept.deptno where dname = 'SALES'
select * from emp e where sal>(select avg(sal) from emp m group by deptno having e.deptno=m.deptno)
select * from emp where sal>(select avg(sal) from emp );
select * from emp where job=(select job from emp where ename='SCOTT');
select ename,sal from emp where sal>(select max(sal) from emp where emp.deptno=30);
select emp.deptno ,count(*),avg(sal+IFNULL(COMM,0)),avg(TIMESTAMPDIFF(year,emp.hiredate,NOW())) from emp group by emp.deptno
select emp.ENAME as 员工姓名,dept.dname as 部门名称,(emp.SAL+IFNULL(COMM,0))as 工资 from emp left join dept on emp.deptno = dept.deptno;
select * from dept inner join (select deptno,count(*) as '部门人数' from emp group by emp.deptno) t on dept.deptno=t.deptno;
select job,min(sal) from emp group by job;
select * from emp where sal = (select min(sal) from emp where job= 'MANAGER')and job='MANAGER';
select ((emp.SAL+IFNULL(comm,0))*12) as 年薪 from emp order by 年薪 asc;