数据库的一些基本概念
-
数据库 (Database ,DB)
-
数据库管理系统(Database Managerment System, DBMS)
Oracle MySQL, SQL Server , DB2,Access
-
数据库应用程序( Database apply system ,DBAS)
应用数据库的程序,基本上都是,如qq
-
数据库管理员(DBA)
-
数据库管理系统(DBS)
数据库+数据库管理系统+数据库应用程序+数据库管理员+最终用户
MySQL的安装
- linux 下安装MySQL:
安装mysql: yum -y install mysql-server
查看系统的服务: cd /etc/init.d
启动mysql服务: servicw mysqld start
随机启动mysql服务:chkconfig mysql on
查看随机启动的服务:chkconfig --list
查看系统的启动方式:more /etc/inittab
2.win 下安装mysql
包资源: MySQL官网下载(下载的是MSI的包资源,直接进行安装),另外一种安装包archives,在命令行里进行安装。具体安装百度即可。
安装后的配置
-
安装Navicat for mysql 进行连接服务
在连接上选择mysql数据库,设置主机地址,默认端口3306,密码进行远程连接mysql服务 -
MySQL默认的编码是希腊的,所以,首先修改编码:
vi /etc/my.cnf
添加代码:
default-character-set=utf-8
重启服务:
service mysqld restart
运行程序:
mysql -h -u -p
-h主机IP地址
-u用户名
-p回车后输入密码 -
默认远程不可以访问数据库,可以修改这个设置
在shell下输入:
mysql_secure_installation
进行root密码的修改,打开远程等操作(注意,默认情况下,没有密码,直接回车就可以了
按照提示进行修改,打开允许远程进行登录服务。
然后,进入msql :
mysql -uroot -p
输入密码
运行:
grant all on . to root @’%’ identified by '你设置的登录密码‘
赋予所有的可以登录的远程主机以root用户身份进行登录,并赋予所有的权限
win下可以命令行中运行来修改。SQL语句
- DQL(数据查询语言)
select - DML(数据操作语言)
insert,update,delete - DDL(数据库定义语言)
create, alter, drop - DCL(数据库控制语言)
grant, revoke - TCL(事物控制语言)
SAVEPOIONT, ROLLBACK, SET TRANSACTION , COMMIT
DDL
数据库操作:
- 创建数据库
create database 数据库名字 - 删除数据库
drop database 数据库名字 - 切换数据库
use 数据库名字 - 查看当前选择的数据库
select database()
数据的备份与恢复: - 备份:
进入C:\Program Files\MySQL\MySQL Server 8.0\bin下(配置了环境变量可以不用)
运行:mysqldum -uroot -p my_db > d:/my_db_backup.sql
选择将my_db这个数据库备份到d:/my_da_backuo.sql下 - 恢复:
mysql -uroot -p 数据库名字 < d:/my_db_backup.sql
也可以进入某个数据库之后,执行:
source d:/my_db_backup.sql
表操作
-
创建表
create table t_admin
(
id int primary key,
aname varchar(5) not null,
address varchar(255)
) -
删除表:
drop table t_admin;
注释:-- 注释内容 -
显示表的信息:desc t_student;
-
修改表:
alter table 表名 add|change|drop|modify 列名 类型; -
在t_student 表中添加一个新字段
alter TABLE t_student add sex int(1) DEFAULT 0;-- 在t_student 中修改一个新字段 ALTER TABLE t_student change sname name VARCHAR(300) not null; -- 全部字段插入 INSERT into t_student VALUES(1,'zhangsan','shanghai',1); -- 选择几个字段插入 INSERT into t_student (id ,name) VALUES (2,'lisi'); -- 某个字段是自增的 -- 给t_student的id修改为自增的选项 ALTER table t_student MODIFY id int auto_increment; -- 在自增的数据进行填写的时候,可以填入任意数据,会自增 INSERT into t_student VALUES (0,'wu','beijing',0); -- 修改某一个数据 update t_student set address='广州' where id=6; -- 删除 delete from t_student where id = 4;
- DQL(数据查询语言)
表的约束
主键约束:并不是只有一个字段组成,可以用多个字段组成联合主键
声明方法: id int primary key.
唯一约束: email varchar(255) unique
非空约束:name varchar(255) not null,
检查约束: age number(2) check (age>0 and age <100),
外键约束: foreign key (deptno) references dept(deptno): depto 这个字段是主表dept的deptno列的字段
约束的三种写法:
-
直接写在数据的类型面
-
写在创建表的下面
CONSTRAINT titles_ibfk_1 FOREIGN KEY (emp_no) REFERENCES employees (emp_no)
-
写在表创建完成之后
alter table t_department add constraint fk_id foreign key (parent_id) references t_department (id);
DQL
select
最简单的查询
use employees;
select * from dept_manager;
SELECT dept_no,emp_no FROM dept_manager;
-
使用算术表达式
SELECT emp_no,salary*12 FROM salaries LIMIT(100); -
使用别名 (as可以省略)
SELECT emp_no as 员工编号,salary 月薪 from salaries; -
去重 DISTINCT
使用DISTINCT可以使得查询的结果那列元素去除重复行,其作用范围是后面所有字段的组合条件
SELECT DISTINCT dept_no FROM dept_manager;
SELECT DISTINCT dept_no ,emp_no FROM dept_manager; -
排序 ORDER BY
使用order by 对自居查询结果进行排序
升序缺省(asc),降序(desc); -
取一定的范围 LIMIT
LIMIT 设置显示的数据,0表示从第一行,然后分页为10条,limit 1 则表示只取第一个元素
SELECT * from salaries ORDER BY salary desc LIMIT 0,10; -
条件查询 WHERE
SELECT * from salaries WHERE salary>30000;
SELECT * from salaries WHERE salary>30000 and salary <38000;
聚合函数
count() max(), min(), sum(),avg()
- count() 查询总数
SELECT COUNT(1) from employees;
SELECT COUNT(DISTINCT emp_no) FROM employees; - max()
SELECT max(salary) FROM salaries;
Mysql内置函数
-
字符串函数
-
连接字符串 concat
SELECT CONCAT(dept_no,‘对应的部门是’,dept_name) FROM departments; -
截取字符串 substring
SELECT SUBSTRING(‘abcdefg’,0,3) -
去除空格 rtrim
SELECT RTRIM(last_name) FROM employees WHERE emp_no = 10001;
-
-
日期函数 date
在数据类型里面,有date :日期,datetime:精确到秒,TIMESTAMP:精确的毫秒,当前时间到1970,1.1日0点的毫秒数- DATE_FORMAT(date,format)将日期变成字符串
SELECT DATE_FORMAT(current_date(),’%年%月%日’);
- DATE_FORMAT(date,format)将日期变成字符串
-
分组 GROUP BY
问题出现每的时候,就要分组-
SELECT column,group_function(column) from table [where condition ][group by group ][order by column]
SELECT dept_name ,salary FROM salaries GROUP BY dept_no ; -
存在group by 分组的select的子句,不能写group by没有的字段,除非用在聚合函数中
-- 统计每个部门的人数,最高工资,最低工资,平均工资 SELECT dept_no count(1),max(salary),min(salary),avg(salary) from salaries GROUP BY dept_no; -- 统计每个部门的人数,最高工资,最低工资,平均工资,除了部门8 SELECT dept_no count(1),max(salary),min(salary),avg(salary) from salaries where dept_no <> 10 GROUP BY dept_no;
-
-
having 等价于where这个条件语句,不过执行顺序在group by 之后
- sql 的执行顺序: from >where > group by >having >select> order by
-- 统计每个部门的人数,最高工资,最低工资,平均工资,平均值小于2000的不要 SELECT dept_no count(1),max(salary),min(salary),avg(salary) from salaries GROUP BY dept_no HAVING avg(sal) >2000 -- 在emp表中,列出每年的入职人数和最高工资 -- 在emp表中,列出工资最小值小于2000的职位 -- 在emp表中,统计人数小于4的部门的平均工资 -- 统计个部门的最高工资,排除最高工资小于3000的部门 SELECT count(1), year(hire_date) max(salary) emp GROUP BY year(hire_date) SELECT job, min(sal) from emp GROUP BY job HAVING min(sal) <2000; SELECT dep_no,avg(salary) FROM emp GROUP BY dept_no HAVING count(1) <4; SELECT dept_no,max(salary) FROM emp GROUP BY dept_no HAVING MAX(salary) <3000;
- sql 的执行顺序: from >where > group by >having >select> order by
表的约束
-
外键约束的两种形式
CREATE TABLE t_department ( id int PRIMARY KEY, tname VARCHAR(255) not null, department_count_max int CHECK (department_count_max >0 and department_count_max <50), parent_id int, foreign key (parent_id) references t_department (id) ); alter table t_department add constraint fk_id foreign key (parent_id) references t_department (id);
索引
增快查询速度
– 主键和唯一值会自动创建索引
– 手动创建索引
create index i_emp_ename on emp(ename);
drop INDEX i_emp_ename
视图
可以隐藏部分数据,是表查询之后的结果
SELECT empo,ename,job from emp;
CREATE VIEW v_emp as SELECT empo,ename,job from emp with read only ;
SELECT * from v_emp;
INSERT into v_emp VALUES (888,'za','clerk')
事务
是一个操作序列,要一整个要么一起成功要么一起失败,保证数据的完整性
采用三个关键字: begin commit rollback
CREATE TABLE t_account
(
id int PRIMARY key,
money DOUBLE
);
BEGIN;
UPDATE t_account set money = money-100 where id =1;
UPDATE t_account set money = money+100 where id =2;
COMMIT;
-- 操作失败,则选择rollback 回滚操作
关系
通过外键约束,进行建立表之间的关系
- 建立学生表,成绩表,课程表
CREATE TABLE t_student(
id int PRIMARY key,
name VARCHAR(23) not null,
age int
);
CREATE TABLE t_subject(
id int PRIMARY key,
name VARCHAR(25) not null
);
CREATE TABLE t_score(
id int PRIMARY KEY,
socre int,
s_id int, FOREIGN key (s_id) REFERENCES t_student (id),
sub_id int ,FOREIGN key (sub_id) REFERENCES t_subject (id)
);
- 一对一 的关联关系,只要想办法让外键字段同时又唯一约束,外键字段字任意的表中
- 一对多的关系,在多的那张表中增加一个外键字段
- 多对多 关系,找一个中间表,转化为两个一对多
-- 建立问题,分类,用户,回答之间的关系
CREATE TABLE custom(
id int PRIMARY key ,
name varchar(255)
)
CREATE question(
id int PRIMARY key ,
describle VARCHAR(2000),
qury_id int ,
type varchar(255),
CONSTRAINT fk_1 foreign key (qury_id) REFERENCES custom(id),
CONSTRAINT fk_type foreign key (type) REFERENCES classify(type)
)
create TABLE answer(
id int PRIMARY key,
answer_id int ,
question_id int,
content VARCHAR(5000) not null,
CONSTRAINT fk_2 foreign key (answer_id) REFERENCES custom(id),
CONSTRAINT fk_3 foreign key (question_id) REFERENCES question(id)
)
CREATE TABLE classify(
id int PRIMARY key ,
type VARCHAR(255)
)
表的连接
表的连接:内连接,两种写法
select emp_no,dept_name from departments,dept_emp,employees where dept_emp.dept_no = departments.dept_no limit 0,10;
select emp_no,dept_name from dept_emp inner join departments on dept_emp.dept_no =departments.dept_no LIMIT 0,10;
-
条件连接
SELECT emp_no,salary,grade FROM salaries,salary_rank where salaries.salary > salary_rank.min and salaries.salary <salary_rank.max LIMIT 0,100
-
同表数据查询
SELECT t1.empno ,t1.ename,t2.empo,t2.ename from emp as t1 join emp as t2 on t1.mgr = t2.empno ;
-
多表的数据查询
SELECT distinct t1.emp_no,concat(last_name,' ',first_name) full_name,title,salary, t1.dept_no,dept_name from dept_emp as t1 inner join salaries on t1.emp_no = salaries.emp_no inner join employees on t1.emp_no = employees.emp_no inner join titles on t1.emp_no = titles.emp_no inner join departments on t1.dept_no = departments.dept_no limit 0,100 ;
-
外连接(左外连接,右外连接,全连接)
- 左外连接:两个表连接过程中,除满足连接条件的行以外,还返回左表中不满足条件的行,在from 后面接left right full
- 查询所有部门的名字和该部门下的员工姓名,若该部门没有员工也要列出部门的名字
- using(字段) 连接的条件,且两个表之间的连接字段名字相同
SELECT DISTINCT departments.dept_name ,concat(last_name,' ',first_name) full_name FROM dept_emp join departments on dept_emp.dept_no=departments.dept_no -- 把 on开始的换成 USING(dept_no) 等效 JOIN employees on dept_emp.emp_no=employees.emp_no limit 0,100;
子查询
将查询的结果返回,再继续查询
可以在select from where 中,一般查询要两次以上结果才能完成
-
查询所有工资高于平均工资的雇员名字和工资
SELECT ename , sal FROM emp where sal >(SELECT avg(sal) as avg_sal from emp )
-
查询和SCOTT同一部门且比他工资低的雇员名字和工资
SELECT t1.ename, t1.sal FROM emp as t1 join (SELECT deptno,sal from emp where ename ='scott') as t2 on t1.deptno =t2.deptno and t1.sal <t2.sal
-
查询的结果试单行单列的可以直接进行<,>的比较
-
多行的时候,采用,all,any ,in 来比较
-
查询工资低于任何一个clerk工资的雇员信息
select * from emp where sal < all(SELECT sal FROM emp where job = 'clerk')
-
查询部分20中职务同部门10的雇员一样的雇员信息
select * from emp where job in (SELECT job from emp where deptno = 10) -
查询每个部分的详细信息平均工资和对应的等级
SELECT t3.*, t4.* FROM ( SELECT t2.*, avg( sal ) AS avg_sal FROM emp t1 RIGHT JOIN dept t2 USING ( deptno ) GROUP BY deptno ) AS t3 LEFT JOIN salgrade t4 ON t3.avg_sal BETWEEN t4.losal AND t4.hisal;
- 查询职务和SCOTT相同,比SCOTT雇佣时间早的雇员信息
select emp.* FROM empo JOIN(SELECT job ,hire_date empo where ename = 'SCOTT') as t1 on empo.job = t2.job and empo.hire_date <t2.hire_date; SELECT avg(sal) sal,depno FROM emp GROUP BY depno order by sal ; SELECT sal FROM enp where job = 'cleck' ORDER BY DESC sal ;
-