数据库服务器:运行数据管理软件的计算机mysql
数据库:顾名思义数据仓库,是一个文件夹、存储多个文件(数据表)linux
数据表:对应一个文件,存储在数据库下程序员
数据:对应文件中的每一行,描述事物特征的符号redis
关系型:须要有表结构(mysql,sqlserver,db2,oracle)sql
非关系型:key-value结构(redis,mongodb)mongodb
安装为系统服务:mysqld --install
数据库
mysqladmin -uroot -proot password "root"
mysql -uroot -proot
net start mysql56
中止:net stop mysql56
安全
mysqld --skip-grant-tables
update mysql.user set password=password("密码") where user="root" and host="localhost";
flush privileges;
杀:taskkill /F /PID ....
服务器
查看登录用户:select user();
网络
mysql_safe --skip-grant-tables
# 修改配置文件 [mysqld] default-character-set=utf8 [client] default-character-set=utf8 [mysql] default-character-set=utf8 #mysql5.5以上:修改方式有所改动 [mysqld] character-set-server=utf8 collation-server=utf8_general_ci [client] default-character-set=utf8 [mysql] default-character-set=utf8 # 这样在控制台输入mysql能够直接登陆 user='root' password='root'
切换文件夹:use db1;
create database db1 charset utf8;
建库语句:show create database db1;
全部数据库:show databases;
查看当前所在数据库:select database();
alter database db1 charset gbk;
删除:drop database db1;
增:create table t1(id int,name char) engine=innodb;
删除:drop table t1;
清空表结构:truncate table t1;
修改表字段类型:alter table t1 modify name char(6);
修改表字段名称:alter table t1 change name Name varchar(8);
查看建表语句:show create table t1;
show tables;
查看表结构:desc t1;
增:insert into t1(id,name) values(1,'egon'),(2,'egon'),(3,'alex');
delete from t1
; 自增加并无改变,不是1,因此尽可能与where搭配。
delete from t1 where id=1;
update t1 set name='sb';
update t1 set name='alex' where id=2;
select * from t1;
select id,name from t1;
DDL语句:数据库定义语言,create drop alter
DML语句:数据库操做语言,insert update delete select
DCL语句:数据库控制语言,grant revoke
现实生活中咱们用来存储数据的文件有不一样的类型,每种文件类型对应各自不一样的处理机制:好比处理文本用txt类型,处理表格用excel,处理图片用png等
数据库中的表也应该有不一样的类型,表的类型不一样,会对应mysql不一样的存取机制,表类型又称为存储引擎
。
存储引擎说白了就是如何存储数据、如何为存储的数据创建索引和如何更新、查询数据等技术的实现方法。由于在关系数据库中数据的存储是以表的形式存储的,因此存储引擎也能够称为表类型(即存储和操做此表的类型)
show engines;
create table 表名( 字段名1 类型[(宽度) 约束条件], 字段名2 类型[(宽度) 约束条件], 字段名3 类型[(宽度) 约束条件] );
注意:
desc table1
show create table table1
修改表名: ALTER TABLE 表名 RENAME 新表名;
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…], ADD 字段名 数据类型 [完整性约束条件…];
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] FIRST;
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名;
删除字段:ALTER TABLE 表名 DROP 字段名;
修改字段
sql ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…]; ALTER TABLE 表名 CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…]; ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
create tale t1 select host,user from mysql.user;
复制表结构:
-- 条件不成立,空记录 create table t2 select host,user from mysql.user where 1>5; create table t3 like mysql.user;
drop table t3;
create table student( id int, name char(6), born_year year, birth_date date, class_time time, reg_time datetime ); insert into student values(1,'egon',now(),now(),now(),now()); insert into student values(2,'alex','1997','1996-10-19','12:12:12','2018-09-13 12:12:12');
datetime与timestamp的区别
'''
'''
char定长(0-255):简单粗暴,浪费空间(以空格来填充),存取速度快
varchar变长(0-65535):省内存,可是查询速度慢
'''
create table consumer( id int, name char(4), sex enum('male','female','other'), level enum('vip1','vip2','svip'), hobbies set('game','music','run') ); insert into consumer values(1,'egon','male','svip','music,game'); -- 不在范围内就为空 insert into consumer values(1,'egon','xx','svip','music,game');
create table t1( id int not null , name char(4), sex enum('male','female') not null default 'male' ); insert into t1(id,name) values('1','alex');
不为空和默认值
惟一约束
单列惟一
create table dpt( id int, name char(10) unique ); insert into dpt values(1,"IT"); insert into dpt values(2,"IT"); -- 方式一 create table dpt( id int unique, name char(10) unique ); -- 方式二 create table dpt( id int, name char(10), unique(id), unique(name) );
联合惟一
--ip和端口联合惟一 create table services( id int , ip char(15), port int, unique(ip,port), unique(id) ); insert into services values (1,'127.0.0.1',80), (2,'127.0.0.1',81), (3,'118.25.126.94',80);
主键
单列主键
create table t1( id int primary key, name char(16), );
复合主键
create table services1( ip char(15), port int, primary key(ip,port) );
自增
create table t3( id int primary key auto_increment, name char(4) ); insert into t3(name) values ('egon'), ('alex'), ('wpq'); insert into t3(id,name) values('5','jw')
查看:show variables like 'auto_inc%';
步长:auto_increment_increment
起始偏移量:auto_increment_offset
设置步长:
set session auto_increment_increment=3;
set gloable auto_increment_increment=3;
设置偏移量:
set gloable auto_increment_offset=3;
注意
delete from student;
:清空表,可是自增按照删除前的位置继续自增truncate table t1;
:清空表,且自增也初始化。用来创建表与表之间的关系
-- 先建立dep表 create table dep( id int primary key auto_increment, name char(16), comment char(50) ); -- 插入数据 insert into dep(name,comment) values('CEO','一群吹牛的部门'), ('IT','技术通常的部门'), ('财务','花钱特别多的部门'), ('销售','不会卖东西的部门'); -- 再建立关联的emp表 create table emp( id int primary key, name char(10), sex enum('male','female'), dep_id int, constraint fk_dep foreign key(dep_id) references dep(id) on delete cascade on update cascade ) -- 插入数据 insert into emp(name,sex,dep_id) values ('alex','male',1), ('egon','male',2), ('yuanhao','female',3), ('wupeiqi','male',4);
1. 插入完整数据(顺序插入) 语法一: INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n); 语法二: INSERT INTO 表名 VALUES (值1,值2,值3…值n); 2. 指定字段插入数据 语法: INSERT INTO 表名(字段1,字段2,字段3…) VALUES (值1,值2,值3…); 3. 插入多条记录 语法: INSERT INTO 表名 VALUES (值1,值2,值3…值n), (值1,值2,值3…值n), (值1,值2,值3…值n); 4. 插入查询结果 语法: INSERT INTO 表名(字段1,字段2,字段3…字段n) SELECT (字段1,字段2,字段3…字段n) FROM 表2 WHERE …;
语法: UPDATE 表名 SET 字段1=值1, 字段2=值2, WHERE CONDITION; 示例: UPDATE mysql.user SET password=password(‘123’) where user=’root’ and host=’localhost’;
语法: DELETE FROM 表名 WHERE CONITION; 示例: DELETE FROM mysql.user WHERE password=’’;
--单表查询 -- select distanct 字段1,字段2,字段3 from 库.表 where 条件 group by 分组条件 having 过滤 order by 排序字段 limit n; -- 优先级 where group distinct order by -- 建立表 create table emp( id int primary key auto_increment, name varchar(20) not null, sex enum('male','female') not null default 'male', age int not null default 21, hire_date date not null, post varchar(50), post_comment varchar(100), salary double(15,2), office int, depart_id int ); -- 插入记录 -- 三个部门:教学,销售,运营 insert into emp(name,sex,age,hire_date,post,salary,office,depart_id) values -- 如下是教学部 ('egon','male',18,'20170301','老男孩驻沙河办事处外交大使',7300.33,401,1), ('alex','male',78,'20150302','teacher',1000000.31,401,1), ('wupeiqi','male',81,'20130305','teacher',8300,401,1), ('yuanhao','male',73,'20140701','teacher',3500,401,1), ('liwenzhou','male',28,'20121101','teacher',2100,401,1), ('jingliyang','female',18,'20110211','teacher',9000,401,1), ('jinxin','male',18,'19000301','teacher',30000,401,1), ('成龙','male',48,'20101111','teacher',10000,401,1), -- 如下是销售部门 ('歪歪','female',48,'20150311','sale',3000.13,402,2), ('丫丫','female',38,'20101101','sale',2000.35,402,2), ('丁丁','female',18,'20110312','sale',1000.37,402,2), ('星星','female',18,'20160513','sale',3000.29,402,2), ('格格','female',28,'20170127','sale',4000.33,402,2), -- 如下是运营部门 ('张野','male',28,'20160311','operation',10000.13,403,3), ('程咬金','male',18,'19970312','operation',20000,403,3), ('程咬银','female',18,'20130311','operation',19000,403,3), ('程咬铜','male',18,'20150411','operation',18000,403,3), ('程咬铁','female',18,'20140512','operation',17000,403,3); -- 查询 -- 字段查询 select id,name from emp; -- 去重 select distinct post from emp; -- 别名 select name,salary*12 as 年薪 from emp; -- 字符串拼接 select concat('<姓名:',name ,'>',' <性别:',sex,'>') as info from emp; -- where条件查询 select id,name,age from emp where id>7; select name from emp where post='teacher' and salary > 8000; select name,salary from emp where salary between 20000 and 30000; select name,salary from emp where salary in (20000,30000); select name,salary from emp where salary not in (20000,30000); -- 不能用等于 select name from emp where post_comment is NULL ; -- 模糊匹配 -- 任意字符 select name from emp where name like "jin%"; -- 一个字符 select name from emp where name like "jin___"; --group by 分组查询 select sex from emp group by sex; -- 只能查分组的字段,以及聚合 select sex,count(sex) from emp group by sex; -- 统计男女性别数目 select post,count(post) from emp group by post;-- 每一个职位有多少员工 select post,avg(salary) from emp group by post; select post,group_concat(name) from emp group by post;-- 每一个职位下全部员工的姓名 --having 分组后过滤 可使用聚合函数过滤 --查询各岗位包含的员工个数小于2的岗位名,岗位内包含的员工名字、个数 select post,group_concat(name),count(post) from emp group by post having count(id)<2; --查询各岗位平均薪资大于1万的岗位名、平均工资 select post,avg(salary) from emp group by post having avg(salary)>10000; --查询各岗位平均薪资大于1万且小于2万的岗位名、平均工资 select post,avg(salary) from emp group by post having avg(salary) between 10000 and 20000; --order by排序 select id,age from emp order by age asc; --年龄从小到大升序 select id,age from emp order by age desc; --年龄从小到大降序 select id,age from emp order by age desc ,id asc; --年龄从小到大降序,id升序 -- limit n分页 select * from emp limit 3; -- 查询工资最高的那我的的信息 select * from emp order by salary desc limit 1;--第一条 select * from emp limit 0,5; --取五条数据 ,从1开始 -- 注意:并非那么简单,性能问题 --总结: -- 语法顺序: -- 执行上顺序: --from 表--where条件--group分组--hanving过滤--distinct--order by排序--limit 分页-- -- 正则 select * from emp where name regexp '^jin.*g$'; select * from emp where name regexp '^jin.*(g|n)$';
-- 建表 create table dep( id int, name varchar(20) ); create table emp( id int primary key auto_increment, name varchar(20), sex enum('male','female') not null default 'male', age int, dep_id int ); -- 插入数据 insert into dep values (200,'技术'), (201,'人力资源'), (202,'销售'), (203,'运营'); insert into emp(name,sex,age,dep_id) values ('egon','male',18,200), ('alex','female',48,201), ('wupeiqi','male',38,201), ('yuanhao','female',28,202), ('liwenzhou','male',18,200), ('jingliyang','female',18,204) ; --内链接:两个表的共同部分 select * from dep d inner join emp e on e.dep_id=d.id; --左链接:保留左表,右表没有的以null填充 select * from dep d left join emp e on e.dep_id=d.id; --右链接:保留右表,左表没有的以null填充 select * from dep d right join emp e on e.dep_id=d.id; --全链接 select * from dep d left join emp e on e.dep_id=d.id union select * from dep d right join emp e on e.dep_id=d.id; --查询平均年龄大于30岁的员工的部门名 select d.name,avg(age) from emp e inner join dep d on d.id=e.dep_id group by d.name having avg(age)>30; -- { -- "server":"0.0.0.0", -- "port_password":{ -- "8383":"wgx123456", -- "8384":"jw123456" -- }, -- "timeout":300, -- "method":"aes-256-cfb", -- "fast_open":false -- -- }
触发器(trigger)是提供给程序员和数据分析员来保证数据完整性的一种方法,是一种特殊类型的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发。
事务用于将某些操做的多个SQL做为原子性操做,一旦有某一个出现错误,便可回滚到原来的状态,从而保证数据库数据完整性。
存储在服务器,一组tsql语句。经过调用它的名字能够执行其内部的一堆sql
优势
提升程序的通用性和可移植性
提升数据库的运行速度
减轻网络带宽,减小网络流量
安全性高,可设定只有某些用户才具备对指定存储过程的使用权
加速查询速率
普通索引INDEX:加速查找