Mysql
MySql介绍
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。
MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
mysql数据类型
数据库操作
--查看搜索引擎
show variables like '%storage_engine%';
show engines;
--创建数据库[指定字符集] create database db_name [character set utf8] --查看数据库 show databases;查看所有数据库 show create database db_name;查看数据库的创建方式 select database();查看当前数据库 --修改数据库 alter database db_name [character set utf8] --删除数据库 drop database db_name; --使用数据库 use db_name;
数据表操作
--创建表 create table tab_name( field1 type [完整性约束条件], ... field2 type )[character set utf8]; 示例: create table emp( id int primary key auto_increment, name varcher(20) unique, gender bit default 1, birthday date, salary double(8,2) unsigned ) 查看表信息: desc tab_name; 查看表结构 show columns from tab_name; 查看表结构 show tables; 查看当前数据库中的所有表 show create table tab_name; 查看当前数据库表建表语句 修改表结构 --增加列 alter table tab_name add 列名 类型 约束 [first|after 字段] 示例: alter table emp add addr varchar(20), add age int first); --修改一列类型 alter table tab_name modify 列名 类型 [约束] [first|after 字段] --修改列名 alter table tab_name change 列名 新列名 类型 [约束] [first|after 字段] --删除一列 alter table tab_name drop 列名; rename table 表名 to 新表名; --修改表的字符集 alter table tab_name character set utf8; --删除表 drop table tab_name;
表准备
+----+-----------+--------+------+-----------+-----------+----------+ | 1 | yuan | male | 24 | 教学部 | 河北省 | 8000.00 | | 2 | egon | male | 34 | 保安部 | 山东省 | 8000.00 | | 3 | alex | male | 28 | 保洁部 | 山东省 | 10000.00 | | 4 | 景丽阳 | female | 22 | 教学部 | 北京 | 9000.00 | | 5 | 张三 | male | 24 | 教学部 | 河北省 | 6000.00 | | 6 | 李四 | male | 32 | 保安部 | 北京 | 12000.00 | | 7 | 王五 | male | 38 | 教学部 | 河北省 | 7000.00 | | 8 | 赵六 | male | 19 | 保安部 | 河北省 | 9000.00 | | 9 | 猪七 | female | 24 | 保洁部 | 北京 | 9000.00 | +----+-----------+--------+------+-----------+-----------+----------+
表记录操作
--插入一条记录 insert table_name (fielf1,filed2...) values(value1,value2...); --插入多条记录 insert table_name (fielf1,filed2...) values(value1,value2...), values(value1,value2...); 修改表记录 update tab_name set field1=value1,field2=value2.... where [条件语句]; --示例 update employee_new set birthday="1989-10-24" WHERE id=1; update employee_new set salary=salary+4000 where name='yuan'; 删除表记录 --1 delete from tab_name [where ...] --2 truncate table emp;--delete 是删除记录,truncate删除表,重建表结构
查询表记录
--语法 SELECT *|field1,filed2 ... FROM tab_name WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 --where 条件语句 --where 字句中可以使用 --比较运算符 > < >= <= <> != between 80 and 100 like 'yuan%' --逻辑运算符 在多个条件直接可以使用逻辑运算符 and or not 示例 --查询年龄大于22的人的姓名 select name from emp where age > 22; --查询男生人数 select count(*) from emp where gender = 'male'; --排序 语法: select * |field1,field2... from tab_name order by field [asc|desc] --asc 升序(默认)、desc 降序 示例: --按年龄从高到低排序 select * from emp order by age desc; --按工资从低到高进行排序 select * from emp order by salary;
--排序 语法: select * |field1,field2... from tab_name order by field [asc|desc] --asc 升序(默认)、desc 降序 示例: --按年龄从高到低排序 select * from emp order by age desc; --按工资从低到高进行排序 select * from emp order by salary; 分组查询,group by GROUP BY 语句根据某个列对结果集进行分组。在分组的列上我们可以使用 COUNT, SUM, AVG等函数进行相关查询。 --查询男员工女员工各多少人 select gender,count(*) from emp group by gender; --查询每个部门最大年龄 select dep,max(age) from emp group by dep; --limit记录条数限制 select * from ExamResult limit 1; select * from ExamResult limit 2,5; --正则表达式 select * from employee where emp_name regexp '^wa'; SELECT * FROM employee WHERE emp_name REGEXP 'yun$'; SELECT * FROM employee WHERE emp_name REGEXP 'm{2}';
多表查询
emp表 +----+--------+----------+--------+ | id | name | salary | dep_id | +----+--------+----------+--------+ | 1 | 张三 | 8000.00 | 2 | | 2 | 李四 | 12000.00 | 1 | | 3 | 王五 | 5000.00 | 2 | | 4 | 赵六 | 8000.00 | 3 | | 5 | 猪七 | 9000.00 | 1 | | 6 | 周八 | 7000.00 | 4 | | 7 | 蔡九 | 7000.00 | 2 | +----+--------+----------+--------+ dep表 +----+-----------+ | id | name | +----+-----------+ | 1 | 教学部 | | 2 | 销售部 | | 3 | 人事部 | +----+-----------+ --内连接查询 select * from emp,dep where emp.dep_id = dep.id; or select * from emp inner join dep on emp.dep_id = dep.id; --外连接查询(包含所有左表的记录,即使与右边无关联字段) select * from emp left join dep on dep.id = emp.dep_id; --右连接 SELECT * FROM emp RIGHT JOIN dep ON dep.id=emp.dep_id;
完整性约束
完整性约束是对字段进行限制,从而符合该字段达到我们期望的效果比如字段含有默认值,不能是NULL等 。直观点说:如果插入的数据不满足限制要求,数据库管理系统就拒绝执行操作
--唯一约束 唯一约束可以有多个但索引列的值必须唯一,索引列的值允许有空值。 如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该使用关键字UNIQUE。 create table emp( id int, name varchar(20) unique, /*在列级定义主码*/ primary key(id), unique key UK_emp_name(name)/*在表级定义主码*/ ); --建表后添加约束: alter table emp add constraint UK_emp_name unique(name); --删除约束 alter table emp drop index UK_emp_name; --自增约束 mysql中每个表只能有一个自动增长的字段,这个字段通常为主键但是请注意将自动增长字段当做非主键使用时必须必须为其添加唯一索引,否则系统将会报错。 create table emp( id int auto_increment paimary key, name varchar(20), );
主键约束
设置表的主键 主键:主键的特性为唯一且非空,在一个没有设置主键的表中,其中唯一且非空的字段系统默认设置为主键, 当存在主键的情况下,唯一非空的字段便不会成为主键,我们也可以设置两个字段为主键,即两个字段合起来均唯一非空。 示例 create table emp( id int primary key, name varchar(20) salary double(8,2)); 多字段主键 create table emp( id int, name varchar(20), score float, primary key(id,course_id) ); 添加主键和删除主键 alter table tab_name add primary key (字段名) alter table tab_name drop primary key; 当主键是自增字段,需要这样删除 alter table tab_name modify id int; alter table tab_name drop primary key;
参照完整性
关系模型的参照完整性在create table 中用foreign key短语定义哪些列为外键,用references短语指明这些外键参照 哪些表的主键。 例如,关系表sc表示学生选修某门课程的成绩,sno,cno是分别参照sudent表和course表的主键。 定义sc表中的参照完整性 create table sc ( sno varchar(10) not null, cno varchar(10) not null, grade smallint, primary key(sno,cno), CONSTRAINT sc_fk_stu foreign key (sno) references student(sno), CONSTRAINT sc_fk_cou foreign key (cno) references course(cno)); 参照完整性将两个表中的相应元组联系起来了,因此,对被参照表和参照表进行增删改操作有可能破坏参照完整性, 必须进行检查以保证这两个表的相容性。 例如, 1、sc表增加一条记录,该记录的sno属性在表student中找不到对应的记录。 2、sc表修改一条记录,该记录的sno属性在表student中找不到对应的记录。 3、从student表中删除一条记录,造成sc表中某些记录的sno属性值在表student中找不到记录。 4、修改student表中的sno属性,造成sc表中的某些记录sno属性值在student中找不到记录。 修改外键: ALTER TABLE sc ADD CONSTRAINT sc_fk_stu FOREIGN KEY (sno) REFERENCES student(sno);