数据库 (Database ,DB)
数据库管理系统(Database Managerment System, DBMS)
Oracle MySQL, SQL Server , DB2,Access
数据库应用程序( Database apply system ,DBAS)
应用数据库的程序,基本上都是,如qq
数据库管理员(DBA)
数据库管理系统(DBS)
数据库+数据库管理系统+数据库应用程序+数据库管理员+最终用户
安装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下可以命令行中运行来修改。
创建表
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;
主键约束:并不是只有一个字段组成,可以用多个字段组成联合主键
声明方法: 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);
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()
字符串函数
连接字符串 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点的毫秒数
分组 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 之后
-- 统计每个部门的人数,最高工资,最低工资,平均工资,平均值小于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;
外键约束的两种形式
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 ;
外连接(左外连接,右外连接,全连接)
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;
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 ;