一、数据库
1、 数据库(database简称 DB):存储数据的仓库
2、 大型数据库:Oracle(商业)、 DB2
3、 中型数据库:MySQL、SQLServer(T-SQL)
4、 小型数据库:Access
5、 MySQL:开源(免费),其它的数据库属于商业(付费)
6、 SQL:结构化查询语言
7、 图形用户界面工具(GUI工具)
SQLyog, Navicat
二、基本命令
1、 进入mysql客户端
mysql -uroot -p123456(最后一个字符串组合:-p密码)
2、 在linux中重启mysql
service mysqld restart
进入到mysql客户端,mysql的命令:
3、 查看mysql中有哪些数据库
show databases;(分号为英文状态)
4、 从mysql客户端退出到linux中
quit
5、 在mysql中清屏
Ctrl + l
6、 选择数据库
use 数据库名;
7、 查看当前数据库中包含的所有的表名
show tables;
查看指定数据库中包含的表名
show tables from 数据库名
8、 创建数据库
create database 数据库名;
9、 删除数据库
drop database 数据库名;
三、创建表
1、 创建表(表名最好是英文)
create table 表的名字
(
列名1 数据类型,
列名2 数据类型,
列名3 数据类型,
……
列名n 数据类型 (最后一行没有逗号)
);(分号在linux中必须有,在SQLyog中可有可无)
2、 数据类型
(1) 整形(整数):int
(2) 小数
浮点数(保存的是近似值):double
定点数(保存的是精确值):decimal(数字的个数,小数的个数)例5.32则(3,2)
(3) 字符串(字母,汉子,数字)
固定长度:char(长度) 默认长度是1
可变长度:varchar(长度) 默认长度是1
(4) 日期
日期(年月日):date
日期时间(年月日小时分钟秒):datetime
3、 注释:解释程序
(1)- -单行注释
(2)/*多行注释*/
4、字符集
支持中文的字符集
gbk:中文简体,繁体
gb2312:中文简体
utf8(有的是utf-8):包括全世界所有的语言
(2)修改表的字符集
create table 表名
(
……
)charset=utf8;
(3)修改数据库的字符集(数据库中所有的表默认都是utf8)
create database 数据库名 character set=utf8;
5、删除表
drop table 表名
6、查看表结构
desc 表名;
8、 查看建表的语句
show create tabe 表名;
9、 查看创建数据库的语句
show create database 数据库名;
四、插入数据
1、insert into 表名(列名1,列名2,……) values(值1,值2,……);
列名与值的顺序,数量,数据类型必须完全匹配
数字(整数,小数)不需要使用单引号,字符串和日期及其日期时间类型必须使用单引号。
2、当向表中所有列插入数据时,可以省略(列名,……)
Insert into 表名 values(值1,值2,……);
值的顺序与表中列的顺序一致
4、 通过一个语句向表中插入多行记录(数据)
insert into 表名(列名1、列名2、……)values(值1,值2,……),
(值1,值2,……),
(值1,值2,……),
……;
五、创建表设置复杂选项
1、列名中不允许有空值
create table 表名
(
列名 数据类型 not null,
……
);
空值:null
空字符串:’’(当数据类型为整形时,为0)
2、主键约束
(1)主键:用来唯一的标识表中的每一行记录
(2)特点:不能为空值(null),不能重复
(3)创建表时设置主键
create table 表名
(
列名 数据类型 primary key,
…………
);
(4)一个表最多只能有一个主键
3、自增列
(1)自增列必须有主键约束或唯一约束
(2)自增列默认是从1开始每次自增1的数字
(3)设置自增列
(4)一个表只能有一个自增列
create table 表名
(
列名 数据类型 primary key auto_increment,
……
);
Day02 MySQL
一、修改表结构(只有添加和删除列有column)
1、 向表中添加一个新列
alter table 表名 add column 列名 数据类型;(数据类型后还可加非空、主键等)
2、 修改表中列的数据类型
alter tabe 表名 modify 列名 数据类型;
3、 修改表中列的列名和数据类型
alter table 表名 change 原列名 新列名 数据类型;
4、 删除表中的列
alter table 表名 drop column 列名;
5、 向已有表中添加主键
alter table 表名 add primary key(列名);
6、 删除主键
alter table 表名 drop primary key;
练习
-- 在已有主键的基础上添加自增
ALTER TABLE s2 MODIFY id INT AUTO_INCREMENT;
INSERT INTO s2 VALUES(NULL,2,'白','男');
-- 添加自增列(没有主键的基础上)
ALTER TABLE s2 ADD COLUMN id1 INT PRIMARY KEY AUTO_INCREMENT;
-- 下面 删除不了自增列的主键
ALTER TABLE s2 DROP PRIMARY KEY;
-- 删除自增
ALTER TABLE s2 MODIFY id INT;
-- 没有自增表示自增删除
INSERT INTO s2 VALUES('',3,'白','男');
-- 删除主键
ALTER TABLE s2 DROP PRIMARY KEY;
二、约束(对表中数据的限制)
1、 主键约束:唯一标识表中每一行数据,限制数据不能重复,不能为空
2、 外键约束:限制两个表中主键列与外键列中数据的对应关系。外键列中的数据必须存在于主键列中,外键列中的数据可以重复。主键列中数据的修改和删除都会影响到外键列中的数据。
3、 唯一约束:限制数据不能重复,可以有空值(只能有一个空值)
4、 创建表时创建外键约束
create table 主键表名
(
主键列 数据类型 primary key,
……
)engine=innodb;
create table 外键表名
(
外建表的主键列 数据类型 primary key,
……
主键表中的主键列名 数据类型,
foreign key(主键表中的主键列) references 主键表表名(主键表中的主键列名)
)engine=innodb;
5、 使用外键约束时,表的存储引擎必须是INNODB。
6、 在已有表中新增外键约束
alter table 外建表的表名 add foreign key(外键列名) references 主键表表名(主键表中的主键列名);
7、 从已有的表中删除外键约束
alter table 外键表表名 drop foreign key 外键约束名;(外键约束名是创建外键约束时默认创建的一个名称)
三、删除表中的数据。
1、 删除表中所有的数据
delete from 表名
2、 删除满足条件的一行数据
delete from 表名 where 条件;
delete from student where id=10;
delete from student where id<5;
四、修改表中的数据
1、 修改某列所有的数据
update 表名 set 列名=新值;
2、 修改多个列中所有的数据
update 表名 set 列名1=新值,列名2=新值,……;
3、 修改满足条件的列中的数据
update 表名 set 列名1=新值1,列名2=新值2,…… where 条件;
4、 某一列所有内容值加1;
update 表名 set 列名=列名+1;
五、查询数据
1、 查询表中所有的数据
select * from 表名;
2、 查询部分列的数据
select 列名1,列名2,…… from 表名;
3、 查询满足条件的语句
select …… from …… where 条件;
4、 运算符
(1) 算数运算符:+、-、*、/。
(2) 比较运算符:=、>、<、!=不等于、>=、<=。
(3) 逻辑运算符
逻辑与(并且的两个条件都成立):and
条件1 and 条件2
逻辑或(两个条件只要有一个条件成立):or
条件1 或 条件2
逻辑非:not
MySQL day03
二、简单查询(关于where条件的查询)
1、去除重复值
select distinct 列名 from 表名 where 条件;
2、挑选出在……之间的数据 between …… and
select 列名1、列名2…… from 表名 where 列名 between 起始值 and 终止值;
select 列名1、列名2…… from 表名 where 列名>=起始值 and 列名<=终止值;
3.列名等于括号内任意一个值时:in ;(not in 不等于其中任意一个值时)
select …… from …… where 列名 in(值1,值2……);
select …… from …… where 列名 =值1 or 列名=值2……;
4、查询空值
select …… from …… where 列名 is null;(空格中是null)
select …… from …… where 列名 like ‘’;(空格中是空的字符串)
查询不是空值
select …… from …… where 列名 is not null;
select …… from …… where 列名 not like ‘’;(空格中是空的字符串)
5、如果列是空值,将其作为指定的数值进行运算:
update 表名 set 列名=列名+1
ifnull(列名,指定代替null运算的数值)
update 表名 set 列名=ifnull(列名,指定代替null运算的数值)+1;
6、模糊查询:like
通配符
(1)任意一个字符: _
(2)任意的0到多个字符: %
select …… from …… where 列名 like ‘……’;(注意写like不必写等号)
姓名以a结尾:
select …… from …… where 列名 like ‘%a’;
姓名第二位是a:
select …… from …… where 列名 like ‘_a%’;
四、限制查询 limit
1、limit n :显示前n行
2、limit m,n:跳过m行,显示n行
select …… from …… where 条件 limit ……;
练习:
-- 员工表中前三行
SELECT * FROM 职工 LIMIT 3;
-- 员工表中9到12行
SELECT * FROM 职工 LIMIT 8,4;
-- 男员工的前5人
SELECT * FROM 职工 WHERE 性别='男' LIMIT 5;
五、排序 order by
1、升序
select …… from…… where…… order by 列名 asc;(asc可有可无)
2、降序
select …… from …… where …… order by 列名 desc;
3、如果按照多个列来排序 order by 列名1,列名2, 那么先按照第一个列排序,当第一个列相同时再按照第二个列排序。
六、聚合函数
1、最大值:max(列名)
2、最小值:min(列名)
3、和:sum(列名)
4、平均值:avg(列名)
5、统计个数:count(列名)或count(*)
(1)count(列名):不统计列中空值的个数
(2)count(*):统计列中所有值的个数包括空值
七、查询结果显示的列名重命名
select 列名 as 显示的名字,…… from 表名;(as可以省略)
八、分组查询group by
select …… from …… where …… group by 列名…… limit ……;
day 04 mysql
一、分组条件:having
1、 select ……
form……
where 不包含聚合函数的条件
group by 列名
having 包含有聚合函数的条件
order by……
limit ……
二、子查询(嵌套查询)
1、在一条查询语句中还有另一条查询语句。
select …… from……
where ……
(select …… from …… where ……);
2、 如果子查询结果多于1个,外层查询的条件中不能直接使用=,!=,>,<,>=,<=,而是需要使用>all , <all, in, not in,
3、 all
(1)>all相当于 >max(列名)
(2)<all相当于 <min(列名)
4、any
(1)=any相当于in
(2)>any相当于>min(列名)
(3)<any相当于<max(列名)
三、多表连接查询
1、交叉联接:两个表中的任意两个数据组合成一行构成的结果集。
2、内联接:两个表中满足联接条件的数据
(1)select …… from 表1、表2 where 联接条件
联接条件一般的格式:主键表表名.主键列名=外键表名.外键列名
(2)内连接的关键字(inner可以省略):inner join
select …… form …… 表1 inner join 表2 on 联接条件;
(3)表名起别名:如果表名重新命名,在查询语句中必须使用表的别名,而不能再使用表原来的名字。在查询语句中如果两个表的列名相同,那么必须写成:表名或表的别名.列名
给表名起别名:表名 as 别名(as可以省略)
4、 外联接:
(1) 左外联接 left join
select …… from 左表 left join 右表 on 联接条件;
左表中所有的数据,右表中只显示满足联接条件的数据
(2) 右外联接 right join
select …… from 左表 reight join 右表 on 联接条件;
右表中所有的数据,左表中只显示满足联接条件的数据
四、备份和还原
1、备份(linux系统中操作)
mysqldump -u 用户名 -p密码 数据库名>文件名.sql
2、还原(linux系统中操作)
mysql -u用户名 -p密码 数据库名<文件名.sql
3、mysql命令还原(mysql系统中操作)
(1) 登陆 mysql:mysql -uroot -p密码
(2) 选择数据库:use 数据库名
(3) 执行sql文件:source 文件名.sql
-- 列出员工数超过三人的部门号和员工数
SELECT 所在部门,COUNT(*) FROM 职工 GROUP BY 所在部门 HAVING COUNT(*)>3;
-- 统计人数超过2个人的市
SELECT COUNT(*),籍贯 FROM 职工 GROUP BY 籍贯 HAVING COUNT(籍贯)>2;
-- 每种类型的图书的最低价格,最低价格大于50的
SELECT book_name,MIN(sale_price) FROM mybook
GROUP BY book_type HAVING MIN(sale_price)>50;
-- 除了小说的每种类型的图书的平均数量,平均数量小于500,只显示前三行
SELECT book_type,AVG(book_nums) FROM mybook
WHERE book_type!='小说' GROUP BY book_type
HAVING AVG(book_nums)<500 LIMIT 3;
-- 价格大于40的每种类型图书的价格和
SELECT book_type,SUM(sale_price) FROM mybook
WHERE sale_price>40 GROUP BY book_type;
-- 子查询(嵌套查询)
-- 查询与西游记是同一类型的图书
SELECT * FROM mybook
WHERE book_type=(SELECT book_type FROM mybook WHERE book_name='西游记');
-- 查询与中国通史是同一类型的图书,并且不显示中国通史
SELECT * FROM mybook
WHERE book_name!='中国通史'
AND book_type=(SELECT book_type FROM mybook WHERE book_name='中国通史');
-- 查询比白夜行价格低的图书
SELECT * FROM mybook WHERE sale_price<
(SELECT sale_price FROM mybook WHERE book_name='白夜行');
-- 查询比小说类图书价格高的
SELECT * FROM mybook WHERE sale_price>ALL
(SELECT sale_price FROM mybook WHERE book_type='小说');
-- 查询比计算机类图书价格低的且数量比文学类高的
SELECT * FROM mybook WHERE sale_price<ALL
(SELECT sale_price FROM mybook WHERE book_type='计算机')
AND
book_nums>ALL
(SELECT book_nums FROM mybook WHERE book_type='文学');
-- 查询价格小于50的同类型的图书
SELECT * FROM mybook WHERE book_type IN
(SELECT book_type FROM mybook WHERE sale_price<50);
-- 基本工资比员工编号小于10的任意员工工资低的
SELECT * FROM 工资 WHERE 基本工资<ANY
(SELECT 基本工资 FROM 工资 WHERE 职工号<10 );
-- 或
SELECT * FROM 工资 WHERE 基本工资<
(SELECT MAX(基本工资) FROM 工资 WHERE 职工号<10 );
-- 查询部门名称,员工姓名(两种写法)
SELECT 部门名,姓名 FROM 部门,职工 WHERE 部门.部门号=职工.所在部门;
SELECT 部门名,姓名 FROM 职工 INNER JOIN 部门 ON 部门.部门号=职工.所在部门;
-- 查询部门名称,员工姓名,基本工资(两种写法)
SELECT 部门名,姓名,基本工资 FROM 部门,工资,职工
WHERE 部门.部门号=职工.所在部门
AND 工资.职工号=职工.职工号;
-- 或
SELECT 部门名,姓名,基本工资 FROM 职工
INNER JOIN 部门 ON 职工.所在部门=部门.部门号
INNER JOIN 工资 ON 职工.职工号=工资.职工号;
-- 左外联接
-- 显示所有的员工姓名,及员工对应的基本工资
SELECT 姓名,基本工资 FROM 职工
LEFT JOIN 工资 ON 工资.职工号=职工.职工号;
-- 右表联接
SELECT 姓名,基本工资 FROM 工资
LEFT JOIN 职工 ON 工资.职工号=职工.职工号;