Mysql数据库管理
1、基本信息的查看
mysql> select version();
mysql> select database();
mysql> show variables like '%character%';
mysql> set names utf8;
mysql> show engines;
mysql> show create table test;
mysql> show create database sxjy;
desc test;
2、创建数据库
mysql> create database sxjy default character set utf8;
mysql>set char set 'gpk';
mysql> show databases;
mysql> drop database sxjy;
3、创建数据表
mysql> use sxjy;
mysql> create table stu_info(id int,sno varchar(10),name varchar(30),sex enum('男','女'),age int,phone varchar(15),addr varchar(60));
mysql> show tables;
mysql> drop table stu_info;
mysql> create table stu_info(id int primary key auto_increment,sno varchar(10) not null,name varchar(30) not null,sex enum('男','女'),age int,phone varchar(15),addr varchar(60))auto_increment=1;
4、表的自增设置
mysql> show variables like 'auto_increment%';
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
auto_increment_increment 字段每次增加的值
auto_increment_offset 自增字段的起始值
5、mysql的数据类型
(1)日期时间类型
date 3字节,格式:年-月-日,2015-07-15
time 3字节,格式:时:分:秒,21:30:20
datetime 8字节,格式:年-月-日 时:分:秒 2015-07-15 21:30:20
timestamp 4字节,自动存储记录修改时间
year 1字节,存储年份
例:创建一个数据表,包含上述字段类型
mysql> create table test(id int primary key,name varchar(30),birthday date,birthtime time,birthdt datetime,birthyear year,record timestamp);
(2)整数型
tinyint 1字节,范围(-128-->127)
smallint 2字节,范围(-32768-->32767)
mediumint 3字节,范围(-8388608-->8388607)
int 4字节,范围(-2147483648-->2147483647)
bigint 8字节,范围(+-9.22*10的18次方)
如果声明为unsigned类型,则数值为0-->2的n(字段长度)次方-1
(3)浮点型
float(n,m) 4字节,单精度浮点型(n表示总数位数,m表示小数位数)
double(n,m) 8字节,双精度浮点型(n表示总数位数,m表示小数位数)
decimal(n,m) 存储为字符串的浮点数
练习:创建一个表,包含a1,a2,a3三个列,分别声明为上述3种类型,指定n值为5,m值为3,然后插入123.45678,然后使用select查询显示的值为多少?
(4)字符串数据类型
char(n) 固定长度,最多255个字符
varchar(n) 可变长度,最多65565个字符
tinytext 可变长度,最多255个字符
text 可变长度,最多65535个字符
mediumtext 可变长度,最多2的24次方-1个字符
longtext 可变长度,最多2的32次方-1个字符
(5)blog数据类型(以二进制存储类型)
tinyblob 最大255字节
blob 最大65K字节
mediumblob 最大16M字节
longblob 最大4GB
(6)其它类型
enum 枚举类型,enum('man','woman')
set 为列举数据中的零个或多个可选值,最多可有64个成员,favorate('篮球','足球','乒乓球','棒球')
(7)数据类型的属性
auto_increment
binary 只用于char和varchar列,以启用大小写的方式进行排序
default 设置默认值,且列必须是常量;enum ('man','woman') not null default 'man'
index 索引,index 索引名(列名)=====有四种索引
primary key 主键索引,值必须唯一且不能为空,一个表只能有一个主键列
not null 不允许为空值
unique 唯一索引,可以允许为空值,可设置多个列
练习:创建一个数据表,包含一个主键,一个唯一索引,一个set类型的列,not null列
insert into test(name) values('李四');
select * from test
set @@auto_increment_increment=5;
6、修改表alter table
(1)增加列
mysql> alter table add column age int; =====alter table test add column cnum int(2) zerofill;
默认在最后面添加
mysql> desc test;
mysql> alter table test add column sex enum('man','woman') not null default 'man' after name;
alter table test add column phone varchar(15) not null after name;
mysql> alter table test add column sno varchar(10) first;
(2)删除列
mysql> alter table test drop id;
mysql> alter table test drop column age;
alter table test drop phone;
(3)修改列
mysql> alter table test modify age tinyint not null; =====修改列的类型
alter table test modify cnum tinyint;
alter table test modify cnum tinyint(1) zerofill unsigned;
mysql> alter table test change name sname varchar(30) not null;
alter table test change cnum cnumber tinyint(1) zerofill unsigned not null;
===============
Invalid use of NULL value
(4)重命名表
mysql> alter table test rename to mytest;
mysql> rename table mytest to test;
7、约束
(1)主键约束(primary key)
(2)唯一约束(unique)
(3)非空约束(not null)
(4)外键约束
mysql> create table sinfo(id int primary key auto_increment,sno varchar(10) not null unique,name varchar(20) not null,cno varchar(10),age tinyint unsigned,addr varchar(60),foreign key (cno) references class(cno))auto_increment=1,engine=innodb;
mysql> alter table stu_info add constraint CNO_FK foreign key(cno) references class(cno) on delete restrict on update restrict;
on delete cascade:级联更新和删除
on delete set null:更新或删除时将子表的相应记录设置为null
on delete restrict:如果子表有匹配的记录则不允许进行delete/update操作
mysql> alter table sinfo drop foreign key sinfo_ibfk_1;
8、mysql语句类型
(1)DDL语句
create database
drop database
create table
alter table
drop table
create index
drop index
(2)DML语句
insert(插入数据)
mysql> insert into sinfo values(2,'s000002','赵芳','c0002',33,'湖南省长沙市');
mysql> insert into sinfo set id=3,sno='s000003',name='张因',cno='c0003',age=36,addr="湖南省长沙市定王台";
mysql> insert into sinfo select id,sno,name,cno,age,addr from stu_info;
update(更新数据)
mysql> update sinfo set age=48 where id=4;
delete(删除数据)
mysql> delete from sinfo where id>4;
tuncate(清空表)
mysql> truncate sinfo;
select(数据查询)
where条件表达式:
and 逻辑与 salary > 5000 and salary<10000
or 逻辑或 salary < 5000 or salary>10000
not 逻辑非 not sex="man"
between salary between 5000 and 10000
= 等于
> 大于
< 小于
>= 大于等于
<= 小于等于
!= 不等于
<> 不等于
+,-,*,/ 加、减、乘、除
is null 值为空
like 字符匹配 name like '%apple%'
group by和having 分组和条件设置
limit 指定记录的输出个数
order by 字段名 ASC | DESC
mysql -u root -paixocm < employees.sql
mysql -uroot -p123456
use books
source D:/bookorama.sql
select * from salaries where salary>=60000 and salary<=70000;
select * from salaries where salary between 60000 and 70000;
select * from employees where first_name like '%Mary%';
select * from employees where first_name is not null;
select * from salaries where salary in (50000,60000,70000);
= 等于
mysql> select * from salaries where salary in (50000,60000,70000) order by emp_no ASC;
mysql> select * from salaries where salary in (50000,60000,70000) order by emp_no desc;
练习:在employees表中统计从1960年(包括1960)后每一年出生的员工数
mysql> select year(birth_date) as 出生年份,count(year(birth_date)) as 人数 from employees group by 出生年份 having 出生年份>=1960;
mysql> select year(birth_date) as 出生年份,count(year(birth_date)) as 人数 from employees group by 出生年份 having not 出生年份>=1960;
函数 =====http://10.0.0.254/functions.html#func-op-summary-ref
例:求员工的平均工资,大于平均工资和小于平均工资的人数
mysql> select avg(salary) as 平均工资 from salaries;
select count(*) as 小于平均工资人数,avg(salary) as 平均工资 from salaries where salary<(select avg(salary) from salaries);
http://blog.youkuaiyun.com/wwxtu24/article/details/3974444
9、多表查询
查询所有学生的编号、姓名、成绩和住址
mysql> select infoa.sno,infoa.name,infoa.score,infob.addr from infoa,infob where infoa.sno=infob.sno;
inner join:取所有查询表的交集
select infoa.sno,infoa.name,infoa.score,infob.addr from infoa inner join,infob where infoa.sno=infob.sno;
where=====
on=======
left join: 取左边表的所有记录和右边表的交集
right join:取右边边表的所有记录和左边表的交集
练习:查询所有住在长沙市的学生编号、姓名、成绩和住址
mysql> select infoa.sno,infoa.name,infoa.score,infob.addr from infoa left join infob on infoa.sno=infob.sno where addr="湖南省长沙市";
mysql> select a.sno,a.name,a.score,b.addr from infoa as a left join infob as b on a.sno=b.sno where addr="湖南省长沙市";
练习:查询employees数据库中每个部门的员工人数,然后给出部门的名称和人数
练习:查询男女员工的人数
mysql> select gender 性别,count(*) as 人数 from employees group by gender;
练习:查询男女员工的平均工资
mysql> select employees.gender,avg(salaries.salary) from employees,salaries where employees.emp_no=salaries.emp_no group by gender;
练习:列出各部门的平均工资,按照降序进行排列
mysql> select dept_emp.dept_no as 部门编号,avg(salaries.salary) as 平均工资 from dept_emp inner join salaries on dept_emp.emp_no=salaries.emp_no group by dept_no order by 平均工资 desc;
mysql> select a.dept_name,b.dept_no,avg(c.salary) as 平均工资 from departments a,dept_emp b,salaries c where a.dept_no=b.dept_no and b.emp_no=c.emp_no group by dept_no order by 平均工资 desc;
mysql> select a.dept_name as 部门名称,b.dept_no as 部门编号,avg(c.salary) as 平均工资 from departments a,dept_emp b,salaries c where a.dept_no=b.dept_no and b.emp_no=c.emp_no group by b.dept_no order by 平均工资 desc;
mysql> select a.dept_name as 部门名称,b.dept_no as 部门编号,avg(c.salary) as 平均工资,max(c.salary) as 最高工资,min(c.salary) as 最低工资 from departments a,dept_emp b,salaries c where a.dept_no=b.dept_no and b.emp_no=c.emp_no group by b.dept_no order by 平均工资 desc;
练习:列出每个部门的部门名称名称、部门编号、部门的管理者姓名(包括first_name和last_name)和性别
mysql> select a.dept_no as 部门编号,a.dept_name as 部门名称,concat(c.first_name,' ',c.last_name) as 部门管理者,c.gender as 性别 from departments a,dept_manager b,employees c where a.dept_no=b.dept_no and b.emp_no=c.emp_no order by 部门编号;
练习:将员工编号、员工姓名(first_name+last_name)、所属部门、1990年后加入公司的员工及薪水等信息
建立一个新表einfo。
mysql> create table einfo(select employees.emp_no,concat(employees.first_name,' ',employees.last_name) as 员工姓名,employees.hire_date,departments.dept_name,salaries.salary from employees left join (departments,salaries,dept_emp) on employees.emp_no=salaries.emp_no and dept_emp.dept_no=departments.dept_no and employees.emp_no=dept_emp.emp_no where year(employees.hire_date)>=1990);
转载于:https://blog.51cto.com/kenasel/1839490