MySQL数据库基本指令(全)
数据库基本类型
CHAR 固定长度字符串 char(10) 存两位 占10位 查询有优势
VARCHAR 可变长度字符串 varchar(10) 存两位 占两位 存储有优势
枚举类型 只能取一个
set类型 能取多个
二进制类型 常用BLOB
一、避免创建数据库及表出现中文乱码和查看编码方法
#vim /etc/mysql/my.cnf 。(5.5以后系统)如下修改:
[client]
default-character-set=utf8
[mysqld]
default-storage-engine=INNODB
character-set-server=utf8
collation-server=utf8_general_ci
1、创建数据库的时候:
CREATE DATABASE `test`
CHARACTER SET 'utf8'
COLLATE 'utf8_general_ci';
2、建表的时候 CREATE TABLE `database_user` (
`ID` varchar(40) NOT NULL default '',
`UserID` varchar(40) NOT NULL default '',
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
代码练习数据:
create table `t_student` (
`id` double ,
`stuName` varchar (60),
`age` double ,
`sex` varchar (30),
`gradeName` varchar (60)
);
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('1','张三','23','男','一年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('2','张三丰','25','男','二年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('3','李四','23','男','一年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('4','王五','22','男','三年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('5','珍妮','21','女','一年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('6','李娜','26','女','二年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('7','王峰','20','男','三年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('8','梦娜','21','女','二年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('9','小黑','22','男','一年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('10','追风','25','男','二年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('11','小小张三','21',NULL,'二年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('12','小张三','23','男','二年级');
insert into `t_student` (`id`, `stuName`, `age`, `sex`, `gradeName`) values('13','张三锋小','24',NULL,'二年级');
查询
单表查询
in 语句
SELECT * FROM t_student WHERE age in (21,23);
not in 语句
SELECT * FROM t_student WHERE age not in (21,23);
between and
SELECT * FROM t_student WHERE age BETWEEN 21 and 24;
not between and
SELECT * FROM t_student WHERE age not BETWEEN 21 and 24;
like 模糊查询
% 代表任意字符
_ 代表单个字符
SELECT * FROM t_student WHERE stuName LIKE '张%';
SELECT * FROM t_student WHERE stuName LIKE '张_';
SELECT * FROM t_student WHERE stuName LIKE '张__';(两个下划线代表两个字符)
空值查询
SELECT * FROM t_student WHERE sex IS NULL;
SELECT * FROM t_student WHERE sex IS NOT NULL;
带And的条件查询
SELECT * FROM t_student WHERE gradeName='一年级' AND age=23;
带or的条件查询
SELECT * FROM t_student WHERE age=21 or age=23;
distinct 去重复查询
SELECT DISTINCT gradeName FROM t_student;
对查询结果排序
SELECT * from t_student ORDER BY age DESC;(降序)
SELECT * from t_student ORDER BY age ASC;(升序)
group by 分组查询
group by 属性 [HAVING 条件表达式][WITH ROLLUP]
1.单独使用没有意义
SELECT * from t_student GROUP BY gradeName;
1 张三 23 男 一年级
4 王五 22 男 三年级
2 张三丰 25 男 二年级
2.与 GROUP_CONCAT()函数一起使用
GROUP_CONCAT()会计算哪些行属于同一组,将属于同一组的列显示出来。
要返回哪些列,由函数参数(就是字段名)决定。
分组必须有个标准,就是根据group by指定的列进行分组。
SELECT gradeName,GROUP_CONCAT(stuName) from t_student GROUP BY gradeName;
1 一年级 张三,小黑,李四,珍妮
7 三年级 王峰,王五
6 二年级 李娜,梦娜,张三丰,追风,小小张三,小张三,张三锋小
3.与聚合函数一起使用
1 一年级 4
4 三年级 2
2 二年级 7
4.与HAVING一起使用(限制输出的结果)
SELECT
id,
gradeName,
COUNT(stuName)
FROM
t_student
GROUP BY
gradeName
HAVING
COUNT(stuName) > 3;
1 一年级 4
2 二年级 7
5.与 with rollup 一起使用(最后加入一个总和行)
SELECT gradeName,COUNT(stuName) FROM t_student GROUP BY gradeName with ROLLUP
1 一年级 4
7 三年级 2
6 二年级 7
6 13
SELECT id,gradeName,GROUP_CONCAT(stuName) FROM t_student GROUP BY gradeName with ROLLUP
1 一年级 张三,小黑,李四,珍妮
7 三年级 王峰,王五
6 二年级 李娜,梦娜,张三丰,追风,小小张三,小张三,张三锋小
6 张三,小黑,李四,珍妮,王峰,王五,李娜,梦娜,张三丰,追风,小小张三,小张三,张三锋小
6. LIMIT 分页查询
select 字段1,字段2 from 表名 limit 初始位置,每页大小;
SELECT * from t_student LIMIT 0,5;
SELECT * from t_student LIMIT 5,5;
SELECT * from t_student LIMIT 10,5;
1 张三 23 男 一年级
2 张三丰 25 男 二年级
3 李四 23 男 一年级
4 王五 22 男 三年级
5 珍妮 21 女 一年级
6 李娜 26 女 二年级
7 王峰 20 男 三年级
8 梦娜 21 女 二年级
9 小黑 22 男 一年级
10 追风 25 男 二年级
11 小小张三 21 二年级
12 小张三 23 男 二年级
13 张三锋小 24 二年级
使用聚合函数查询
create table `t_grade` (
`id` int ,
`stuName` varchar (60),
`course` varchar (60),
`score` int
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('1','张三','语文','91');
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('2','张三','数学','90');
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('3','张三','英语','87');
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('4','李四','语文','79');
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('5','李四','数学','95');
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('6','李四','英语','80');
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('7','王五','语文','77');
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('8','王五','数学','81');
insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('9','王五','英语','89');
1、count()函数
1)统计记录的条数
SELECT COUNT(*) AS total FROM t_grade;
2)与group by 函数一起使用。
SELECT stuName,COUNT(*) FROM t_grade GROUP BY stuName;
张三 3
李四 3
王五 3
2、sum() 函数
1)求和
SELECT stuName,SUM(score) FROM t_grade WHERE stuName="张三";
2)与group by 函数一起使用
SELECT stuName,SUM(score) FROM t_grade GROUP BY stuName;
张三 268
李四 254
王五 247
3、avg() 函数
1)求平均值
SELECT stuName,AVG(score) FROM t_grade WHERE stuName="张三";
2)与group by 函数一起使用
SELECT stuName,AVG(score) FROM t_grade GROUP BY stuName;
4、max()/min() 函数
1)求最大值
SELECT stuName,course,MAX(score) FROM t_grade WHERE stuName="张三";
2)与group by 函数一起使用,此处不能加course 因为有stuName
SELECT stuName,MAX(score) FROM t_grade GROUP BY stuName;
连接查询:将两个或两个以上的表,按照某个条件连接起来,从中选择需要的数据。
笛卡尔乘积
SELECT * FROM t_book,t_booktype;
1、内连接查询
内连接查询是一种最常用的连接查询。内连接查询可以查询两个或两个以上的表。
SELECT * from t_book,t_booktype WHERE t_book.bookTypeId=t_booktype.id;
别名:
SELECT tb.bookName,tb.author,tby.bookTypeName from t_book tb,t_booktype tby WHERE tb.bookTypeId=tby.id;
2、外链接查询
外链接可以查出某一张表的所有信息
SELECT 属性名列表 from 表名1 left/right join 表名2 on 表名1.属性名1=表名2.属性名2
2.1左连接查询
可以查询出“表名1”的所有记录,而“表名2”中,只能查询出匹配的记录。不匹配的用null
SELECT * FROM t_book LEFT JOIN t_booktype ON t_book.bookTypeId=t_booktype.id;
别名:
SELECT tb.bookName,tb.author,tby.bookTypeName FROM t_book tb LEFT JOIN t_booktype tby ON tb.bookTypeId=tby.id;
2.2右连接查询
可以查询出“表名2”的所有记录,而“表名1”中,只能查询出匹配的记录。
SELECT * FROM t_book right JOIN t_booktype ON t_book.bookTypeId=t_booktype.id;
SELECT tb.bookName,tb.author,tby.bookTypeName FROM t_book tb right JOIN t_booktype tby ON tb.bookTypeId=tby.id;
3、多条件连接查询
SELECT tb.bookName,tb.author,tby.bookTypeName from t_book tb,t_booktype tby WHERE tb.bookTypeId=tby.id and tb.price>70;
子查询
create table `t_pricelevel` (
`id` int ,
`priceLevel` int ,
`price` float ,
`description` varchar (300)
);
insert into `t_pricelevel` (`id`, `priceLevel`, `price`, `description`) values('1','1','80.00','价格贵的书');
insert into `t_pricelevel` (`id`, `priceLevel`, `price`, `description`) values('2','2','60.00','价格适中的书');
insert into `t_pricelevel` (`id`, `priceLevel`, `price`, `description`) values('3','3','40.00','价格便宜的书');
1、带in关键字的查询
一个查询语句的条件可能落在另一个SELECT 语句的查询结果中。
select * from t_book where bookTypeId in (select id from t_booktype);
select * from t_book where bookTypeId not in (select id from t_booktype);
2、带比较运算符的查询(单一)
子查询可以使用比较运算符,查询出来的结果要是能够进行比较判断的,不能是集合
select * from t_book where price>=(select price from t_pricelevel where priceLevel=1);
3、带Exists关键字的查询
假如子查询查询到记录,则执行外层查询,否则,不执行外层查询。
select * from t_book where exists(select * from t_booktype);
select * from t_book where not exists(select * from t_booktype);
4、带ANY关键字的子查询(集合)
ANY关键字表示满足其中任一条件
select * from t_book where price >=ANY(select price from t_pricelevel);
5、带ALL关键字的查询
ALL关键字表示满足所有条件
select * from t_book where price >=ALL(select price from t_pricelevel);
合并查询
1、UNION
数据库系统会将所有的查询结果合并到一起,然后去除掉相同的记录。
select id from t_book union select id from t_booktype;
2、UNION ALL
数据库系统会将所有的查询结果合并到一起,不会除掉相同的记录。
select id from t_book union all select id from t_booktyp;
为表和字段取别名:
1、为表取别名
格式:表名 表的别名
select * from t_book tb where tb.id=1;
2、为字段取别名
格式:属性名 [AS] 别名
select tb.bookName bName from t_book tb where tb.id=1;
select tb.bookName as bName from t_book tb where tb.id=1;
插入、更新、删除数据
1、插入数据
给表的所有字段插入数据
格式:INSERT INTO 表名 VALUES (V1,V2,V3,...,Vn);
INSERT into t_book values (null,'数据库',23,风诺依曼,1);
INSERT into t_book (id,bookName,price,author,bookTypeId) values (null,'数据库',23,风诺依曼,1);
给表指定字段插入数据
格式:INSERT INTO 表名(属性1,属性2,...,属性n) VALUES (V1,V2,...,Vn);
INSERT into t_book (bookName,author)values ('数据库',风诺依曼);
同时插入多条记录
INSERT into t_book (id,bookName,price,author,bookTypeId)
values (null,'数据库',23,风诺依曼,1),
(null,'数据库2',23,风诺依曼,1)
(null,'数据库3',23,风诺依曼,1);
在SQL中如何向指定的某一行的某一列插入值:insert 不支持 where 用 update
更新数据
update t_book set bookName='JAVA编程思想',price=120 where id =1;
update t_book set bookName='数据原来' where bookName like '%我爱我家%';
删除数据
delete from t_book where id = 5;
索引
索引的引入
索引定义:索引由数据库表中一列或者多列组合而成,其作用是
提高对表中数据的查询速度;类似于图书的目录,方便快速定位,寻
找指定的内容。
索引的优缺点
优点:提高查询数据速度
缺点:创建和维护索引的时间增加
// 2016/1/6 复习至此处
索引分类
1.普通索引
可以创建在任何数据类型中
2.唯一性索引
使用UNIQUE参数可以设置,在创建唯一性索引时,限制该索引的值必须
是唯一的,主键默认是UNIQUE索引
3.全文索引
使用FULLTEXT参数设置,只能创建在CHAR,VARCHAR,TEXT类型
的字段上。主要作用就是提高查询较大字符串类型的速度,Mysql
默认引擎不支持全文索引
4.单列索引
在表中可以给单个字段创建索引
5.多列索引
表在多个字段上创建的索引
6.空间索引
使用SPATIAL参数可以设置空间索引,空间索引只能建立在空间
数据类型上,这样可以提高系统获取空间数据的效率。MYSQL默认引擎不支持
创建索引
1.创建表的时候创建索引
CREATE TABLE 表名(
属性名数据类型[完整性约束条件],
属性名数据类型[完整性约束条件],
....
属性名数据类型
[UNIQUE | FULLTEXT | SPATIAL ] INDEX| KEY
[别名] (属性名1 [(长度)] [ASC | DESC])
);
CREATE TABLE t_user1 (
id INT (11),
userName VARCHAR (20),
PASSWORD VARCHAR (20),
INDEX (userName)
);
唯一性索引
CREATE TABLE t_user2 (
id INT (11),
userName VARCHAR (20),
PASSWORD VARCHAR (20),
UNIQUE INDEX (userName)
);
取别名
CREATE TABLE t_user2 (
id INT,
userName VARCHAR (20),
PASSWORD VARCHAR (20),
INDEX index_userName (userName)
);
多列索引
CREATE TABLE t_user3 (
id INT,
userName VARCHAR (20),
PASSWORD VARCHAR (20),
INDEX index_userName_password (userName, PASSWORD)
);
2.在已存在的表上创建索引
在t_user3上的userName创建索引
create index index_userName on t_user3(userName); // 要有索引名
在t_user3上的userName创建唯一索引
create unique index index_userName on t_user3(userName);
在t_user3创建多列索引
create index index_userName_password on t_user3(userName,password);
3.用 ALTER TABLE 语句创建索引
alter table t_user3 add index index_userName(userName);
alter table t_user3 add unique index index_userName(userName);
alter table t_user3 add index index_userName_password(userName,password);
删除索引
drop index index_userName on t_user3;
视图
1,视图是一种虚拟的表,是从数据库中一个或者多个表中导出来的表。
2,数据库中只存放了视图的定义,而并没有存放视图中的数据,这些数据存放在原来的表中。
3,使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。
视图的作用
1,使操作简便化;
2,增加数据的安全性;
3,提高表的逻辑独立性;
1.创建视图
CREATE [ ALGORITHM ={ UNDEFIEND | MERGE | TEMPTABLE }]
VIEW 视图名[ ( 属性清单) ]
AS SELECT 语句
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ];
2.单表创建视图
CREATE VIEW v1 AS SELECT * from t_book;
CREATE VIEW v2 AS SELECT bookName,price from t_book;
SELECT * FROM v1;//只能查视图中的数据,其他的查不到,保证了安全性
CREATE VIEW v2(b,p) AS SELECT bookName,price from t_book; // 换掉视图栏位上的名字
3.多表创建视图
create view v4 as select tb.bookName,tby.bookTypeName from t_book tb ,t_booktype tby where tb.bookTypeId=tby.id;
4.查看视图
desc v2; // 查看视图的基本信息
show TABLE STATUS like 'v2'; // 查看视图基本信息,与上面的不同
show TABLE STATUS like 't_book';
show CREATE VIEW v2; // 查看视图详细信息
5.修改视图
create or replace view 语句修改视图
CREATE OR REPLACE [ ALGORITHM ={ UNDEFINED | MERGE | TEMPTABLE }]
VIEW 视图名[( 属性清单)]
AS SELECT 语句
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ];
CREATE
OR REPLACE VIEW v1 (bookName, price) AS SELECT
bookName,
price
FROM
t_book;
ALTER 语句修改视图
ALTER [ ALGORITHM ={ UNDEFINED | MERGE | TEMPTABLE }]
VIEW 视图名[( 属性清单)]
AS SELECT 语句
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ];
ALTER VIEW v1 as SELECT * FROM t_book;
6.更新视图
更新视图是指通过视图来插入(INSERT)、更新(UPDATE)和删除(DELETE)表中的数据。因为视图是一个虚
拟的表,其中没有数据。通过视图更新时,都是转换基本表来更新。更新视图时,只能更新权限范围内的数据。
超出了范围,就不能更新。
插入数据
insert into v1 values(null,'java good',120,'fei',1);
更新数据
update v1 set bookName='java very good',price=200 where id=5;
删除数据
delete from v1 where id=5;
7.删除视图
删除视图是指删除数据库中已存在的视图。删除视图时,只能删除视图的定义,不会删除数据;
DROP VIEW [ IF EXISTS ] 视图名列表[ RESTRICT | CASCADE ]
drop view if exists v2;
触发器
触发器(TRIGGER)是由事件来触发某个操作。这些事件包括INSERT 语句、UPDATE 语句和DELETE 语句。
当数据库系统执行这些事件时,就会激活触发器执行相应的操作。
例子:在A表插入数据,触发B表插入数据
1.创建与使用触发器
创建只有一个执行语句的触发器
CREATE TRIGGER trig_book AFTER INSERT
ON t_book FOR EACH ROW
CREATE TRIGGER trig_book AFTER INSERT
ON t_book FOR EACH ROW
UPDATE t_booktype SET bookNum=bookNum+1 WHERE new.bookTypeId=t_booktype.id;
new 为过渡变量,代表插入后的新表
创建有多个执行语句的触发器
CREATE TRIGGER 触发器名BEFORE | AFTER 触发事件
ON 表名FOR EACH ROW
BEGIN
执行语句列表
END
CREATE TRIGGER trig_book2 AFTER DELETE
on t_book FOR EACH ROW
BEGIN
UPDATE t_booktype SET bookNum=bookNum-1 WHERE new.bookTypeId=t_booktype.id;
INSERT INTO t_log VALUES (null,'在t_book表中删除了一条数据');
DELETE FROM t_test WHERE old.bookTypeId=t_test.id;
END
// 下述语句在数据库中执行错误,且没有修改正确
delimiter |
CREATE TRIGGER trig_book2 AFTER DELETE
on t_book FOR EACH ROW
BEGIN
UPDATE t_booktype SET bookNum=bookNum-1 WHERE old.bookTypeId=t_booktype.id;
INSERT INTO t_log VALUES (null,NOW(),'在t_book表中删除了一条数据');
DELETE FROM t_test WHERE old.bookTypeId=t_test.id;
END
|
delimiter;
3.查看触发器
SHOW TRIGGERS 语句查看触发器信息 ==>所有触发器
4.删除触发器
DROP TRIGGER 触发器名;