@hainingwyx
2017-11-06T09:17:25.000000Z
字数 15397
阅读 1431
未分类
系统数据库:mysql、test
SHOW databases;# 创建数据库,制定数据库的字符集create DATABASE database_name character SET character_name;# 修改数据库使用的字符集(只能对字符集进行修改)ALTER DATABASE database_name character SET character_name;# 删除数据库DROP DATABASE database_name;
数据类型
数值类型
- 整数:int、tinyint、smallint、bigint
- 小数:decimal、float、double
字符串类型
char、varchar、binary、varbinary、blob(tinyblob、blob、mediumblob、longblob)、text(tinytext、text、mediumtext、longtext)日期类型
datetime、date、timestamp、time枚举类型:enum
集合类型:set
位类型:bit、bool
创建数据表
# 创建数据表语法规则create TABLE table_name(column_name datatype,column_name datatype,);
修改数据表
# 修改表名称alter table table_name rename table_new_name;# 修改数据表语法ALTER TABLE table_name ADD column_name datatype; --增加列ALTER TABLE table_name MODIFY column_name datatype;--修改列ALTER TABLE table_name DROP COLUMN column_name; --删除列# 修改表中字段的名字ALTER TABLE table_name CHANGE old_colname new_colname datatype;ALTER TABLE product_info MODIFY proname varchar(30);ALTER TABLE product_info CHANGE proname pronamenew varchar(30);# 修改字段顺序ALTER TABLE 表名 MODIFY 字段名1 数据类型 FIRST | AFTER 字段名2;
删除数据表
DROP TABLE table_name;
主键约束:唯一标识表中的一个列,只能有一个主键约束,但是可以包含多列。
create TABLE table_name{column_name1 datatype PRIMARY KEY,column_name2 datatype,};#联合主键create TABLE table_name{column_name1 datatype,column_name2 datatype,[CONSTRAINT constraint_name] PRIMARY KEY(column_name1, column_name2)};#添加主键约束ALTER TABLE table_name ADD CONSTRAINT pk_name PRIMARY KEY(column_name);#添加联合主键约束ALTER TABLE table_name ADD CONSTRAINT pk_name PRIMARY KEY(column_name1, column_name2);#删除主键约束,因为只有一个,所以不需要指定ALTER TABLE table_name DROP PRIMARY KEY;
外键约束
确保数据的正确性。两个表之间的关系,如果表A中的某列数据出现在表B中,那么A表称为父表,B表称为子表,A中的列要设置成主键约束,B表中与之相同的列才能设置为外键约束。
create TABLE table_name{column_name1 datatype,column_name2 datatype,CONSTRAINT fk_name foreign key(column_name1) reference table_name1(column_name2)};#添加外键约束ALTER TABLE table_name ADD CONSTRAINT fk_name foreign key(column_name1) reference table_name2(column_name2);#删除外键约束ALTER TABLE table_name DROP foreign key fk_name;
默认值约束
create TABLE table_name(column_name1 datatype DEFAULT default_value);#修改默认值约束ALTER TABLE table_name ALTER column_name SET DEFAULT default_value;#删除默认值约束ALTER TABLE table_name ALTER col_name DROP default;
非空约束
create TABLE table_name{column_name datatype NOT NULL,column_name datatype};#添加非空约束ALTER TABLE table_name MODIFY column_name datatype NOT NULL;
检查约束
检查字段有效性,检查约束在表中是不生效的,仍然可以插入不符合条件的数据。
create TABLE table_name{column_name datatype CHECK(expression),column_name datatype};#添加表级约束ALTER TABLE table_name ADD CONSTRAINT ch_name CHECK(expression);
唯一约束
确保列的唯一性,可以有多个唯一约束,允许有空值,但是只能有一个空值。
create TABLE table_name{column_name datatype UNIQUE,column_name2 datatype};create TABLE table_name{column_name datatype,column_name2 datatype,[CONSTRAINT constraint_name] UNIQUE (column_name1, column_name2)};#修改时添加约束ALTER TABLE table_name ADD CONSTRAINT uq_name UNIQUE (column_name1, column_name2);#删除唯一约束DROP INDEX column_name and table_name;
DML:数据操作语言,主要包括数据表数据的增删改查。
添加数据:INSERT
# 语法INSERT [INTO] table_name [(col_name, ...)] VALUES (col_value,...);#指定字段插值INSERT [INTO] table_name SET col_name = col_value,...;#插入查询结果INSERT [INTO] table_name [(column_name1, column_nam2,..)] select * from table_name2;#为表添加多条数据INSERT INTO table_name VALUES (value_list1),...,(value_listn);
修改数据:UPDATE
#指定修改符合修改条件的修改顺序,限制修改行数UPDATE table_nameSET col_name1 = value1,col_name2 = value2,...[where 条件][order by col_name1 DESC/ASC, col_name2,DESC/ASC][LIMIT row_count];#修改表中的全部数据UPDATE table_name SET col_name1 = value1,col_name2 = value2,...;
删除数据:DELETE
DELETE from table_name{[where 条件][order by ...][LIMIT row_count]}#另一种删除全部数据,不会返回删除数据的行数TRUNCATE TABLE tablename;
运算符
#查询信息,修改查询结果selcect name, expensive+5, expensive-5,subject, tel from examinfo;#修改信息UPDATE examinfo SET expense = expense +5 where name = '张三';# 乘除法select name, expensive*id, expensive/2,subject, tel from examinfo;select name, expensive%5,,subject, tel from examinfo;# 比较运算符select 5>10, 5+6>=10;select 5=10, 5<>10;# IS NULL 运算符select 10 IS NULL, NULL IS NULL;#BETWEEN 判断是否在某一范围内select 10 BETWEEN 1 and 10, 10 BETWEEN 11 and 100;#LEAST 用来得到一组数中的最小值select LEAST(5, 2,20), LEAST('a','b','c');# 逻辑运算符,逻辑非,NOT优先级非常低select NOT 10, NOT 0, NOT NULL;select !10, !0 ,!NULL;# 逻辑与select 2 and 3, 1 and 0 , NULL and 1;select 2 && 3, 1 && 0 , NULL && 1;# 逻辑或select 1 OR 2, 10 OR 0, NULL OR 2, 0 OR 0;select 1 || 2, 10 || 0, NULL || 2, 0 || 0;select 1 XOR 3, 2 XOR 2, NULL XOR 2, 0 XOR 1;#位运算符
简单查询
select [* | DISTINCT | DISTINCTROW| col_name] #去除查询结果中相同的行[from table_name][where condition][group by col_name];#分组[having condition] #分组条件语句,只能用在分组查询中,在group by后面[order by col_name [ASC|DESC]][LIMIT [offset,] rowcount]select name subject from Examinfo;#使用别名select col_name1 AS 别名1, col_name2 AS 别名2...#单一条件查询数据select subject from examinfo where expense >100;#模糊查询,查询含有英语的信息select * from examinfo where subject LIKE '%英语%';# 多个条件查询select * from examinfo where name = '张三' OR subject ='英语口语';#查询结果排序select * from examinfo order by expense DESC;
聚合函数
select MAX(expense) from examinfo;select subject, MIN(expense) form examinfo;select AVG(expense) form examinfo;select SUM(expense) AS '总费用' from examinfo;select count(*) AS '报名总数' from examinfo;
子查询
查询语句中的查询语句。
常用操作符
| 操作符 | 说明 |
|---|---|
| IN | 表示在某一个范围内 |
| EXISTS | 表示是否至少返回一行数据,返回则为True,否则False |
| ANY(SOME) | 是否至少有一条记录和ANY前面的值匹配,匹配返回True,否则False |
| NOT IN | |
| NOT EXISTS |
select col_name1, col_name2, ... from table_namewhere col_name in (select ...);select * from examinfo where subject in ('数学', '英语');select * from examinfo where subjuect in (select name from subjectinfo);select name, expense from examinfo where exists(select * from subjectinfo where name = '数学');#true,查询examinfo全部数据!!select * from examinfo where subject = any(select name form subjectinfo);
分组查询:group by
# 单列分组查询select subject, count(*) from studentinfo group by subject;# 使用having的分组查询# where查询效率更高,因为where先过滤,再分组select subject, AVG(score) from studentinfo group by subject having subject = '英语';select subject, AVG(score) from studentinfo where subject = '英语';# 多列分组查询select subject,techer, AVG(score) from studentinfo group by subject, teacher;# 分组查询后排序, order by 在所有子句后面select teacher,sum(score) from studentinfo group by teacher order by SUM(score) DESC;
多表查询
# 等值连接:将多个表之间的相同字段作为条件查询数据,一般是主键、外键select newsstudentinfo.name,subjectinfo.subjectname from newstudentinfo, subjectinfo where newstudentinfo.subjectid = subjectinfo.id;select newsstudentinfo.name,subjectinfo.subjectname teacherinfo.teachername from newstudentinfo, subjectinfo, teacherinfo where newstudentinfo.subjectid = subjectinfo.id and newstudentinfo.teacherid = teacherinfo.id;# 笛卡尔积:所有列的和以及行的积,没有上面的等值连接,一般没有意义select * from newstudentinfo, subjectinfo;# 左外链接:返回表中符合条件的记录和左表中剩下的全部记录select colname1, colname2from table_name1 left/right outer join table_name2on 条件# 左外连接,subjectname列可能出现nullselect newstudentinfo.name,subjectinfo.subjectname from newstudentinfo, subjectinfo left outer join subjectinfo on newstudentinfo.subjectid = subjectinfo.id;# 右外连接, name列可能出现nullselect newstudentinfo.name,subjectinfo.subjectname from newstudentinfo, subjectinfo right outer join subjectinfo on newstudentinfo.subjectid = subjectinfo.id;# 内连接:类似等值连接,都是符合条件的结果;好处是更好地明确数据表的连接方式select colname1, colname2...from table_name1 inner join table_name2on 条件select newstudentinfo.name,subjectinfo.subjectname,teacherinfo.teachernamefrom newstudentinfo subjectinfo inner join subjectinfo inner join teacherinfo ON newstudentinfo.subjectid = subjectinfo.id and newstudentinfo.teacherid = teacherinfo.id;
合并查询结果
UNION:连接两个查询结果,查询结果中的列数和数据类型必须一致
select col_name from tabel_name1UNION[ALL]select col_name from table_name2;select * from subjectinfoUNIONselect * from teacherinfo;select id AS '编号', subjectname AS '名称' from subjectinfoUNIONselect * from teacherinfo;# 合并后的查询结果排序(select col_name from tabel_name1)UNION[ALL](select col_name from table_name2)order by colname;(select id, subjectname from subjectinfo)UNION(select * from teacherinfo)order by id;# 限制组合查询结果的行数(select col_name from tabel_name1)UNION[ALL](select col_name from table_name2)LIMIT 行数;
数值类型函数
# 绝对值函数select abs(-21), abs('-1'), abs(-91/4);# 取余函数select mod(10,3);# 平方根函数select sqrt(100);# 随机数函数select rand(), rand(2);# 四舍五入函数select round(4.5123,2);# 符号函数select sign('21');# 幂函数select power(8, 2);# 对数运算函数select log(5, 25);# piselect pi();# 三角函数select sin(pi()/2), sin(pi());# 获取最小正数select ceil(4.5);
字符串函数
# 合并字符串select concat('this','is','a','test');#计算长度,select length('1234'); --以字符为单位select char_length('1234'); --以字节为单位# 大小写转换select upper('abcd测试');select lower('ABCD测试');# 获取指定长度字符串select left(str, len);right(str, len);# 填充字符串lpad(str, len, padstr) -- 左边填充,若str<len则str保留len长度rpad(str, len, padstr)# 删除指定字符,,默认删除两端空格trim(both | leading |trailing remstr from str)# 删除字符串前端或后端的空格ltrim(str)rtrim(str)# 重复生成字符串repeat (str, count)# 空格函数space(num)# 替换函数replace(str, from_str, to_str)# 插入函数,将从pos起的len长度字符串替换INSERT(str, pos, len, newstr)# 比较字符串大小strcmp(str1, str2)# 获得子串,len参数可以省略substring(str, pos, len)# 逆序reverse(str)# 返回指定字符串位置的函数,返回位置序号1-2..field(str, str_1, str_2)
日期和时间
# 返回指定日期对应的工作日索引select dayofweek('2011-11-11') --1表示周日,7表示周六select weekday(date) --0表示周一,6表示周日# 返回每月的日索引select dayofmonth('2007-3-20');# 年的日索引select dayofyear('2011-1-1');# 月份select month('2011-1-1');# 月名称select monthname('2011-1-1');# 星期几名称select dayname('2011-1-1');# 季度slelect quarter('2011-1-1');# 年份select year('2011-1-1');# 小时select hour('2011-1-1 12:22:00');# 分钟select minute('2011-1-1 12:22:00');select second(t'2011-1-1 12:22:00');# 增加月 date格式YYMM 或者 YYYYMMselect period_add(201201, 5);# 取月份差 date格式YYMM 或者 YYYYMMselect period_diff(1201,1206)# 返回当前日期函数select curdate();# 当前时间函数select curtime()# 当前日期时间select now()select sysdate()# 秒转换成时间select sec_to_time(seconds)# 时间转化成秒 格式:HH:MM:SSselect time_to_sec(time)
其他函数
# 返回当前用户名select session_user();# 返回当前数据库database();# 返回字符串的md5校验select md5('md5test');
查询结果集/逻辑表,里面的数据允许开发者进行查询,但是数据更新有限制。当基本表中的数据发生改变时,视图中的数据也会发生改变。
优势:可简化复杂数据,增加数据安全性,隔离数据。
创建视图
createview view_name [(column_list)]as select_statement[WITH CHECK OPTION]# 单源表视图创建:视图只有一个基表# test数据库创建view_st_score视图createVIEW 'test'.'view_st_score'as(select sc.id, sc.scores,sc.subject, st.name,st.age, st.sexfrom scoresinfo sc, studentinfo stwhere sc.student_id = st.id)# 查看视图中的数据select * FORM view_st_score where sex = 1;# 多源表视图创建:数据来源于两张或者多张表createVIEW 'test'.'view_st_score'as(select sc.id, sc.scores,sc.subject, st.name,st.age, sx.namefrom scoresinfo sc, studentinfo st, sexinfo sxwhere sc.student_id = st.idand sx.id = st.sex)# 查看视图中的数据select * from view_st_score where age>17 order by age;
修改视图
create [OR REPLACE]VIEW view_name [(column_list)]as select_statement[WITH CHECK OPTION]# 修改为sex列数据为0的记录create OR REPALCEVIEW 'test'.'view_st_score'as(select sc.id, sc.scores,sc.subject, st.name,st.age, st.sexFORM scoresinfo sc, studentinfo stwhere sc.student_id = st.idand st.sex = 0)
删除视图
DROP VIEW [IF EXISTS]view_name [, view_name]...#防止删除错误drop VIEW EXISTS view_st_score_se;
查看视图
DESCRIBE view_name;DESC view_name;# 查看创建视图的语句,格式化显示show create VIEW view_name\G;
索引是某个表中一列或者若干列值的集合和相应的指向表中物理标识的这些值的数据页的逻辑指针清单。可以使用户快速找到表中或索引视图的特定信息。索引包含从表中或者视图中一个或多个列生成的键,以及映射到指定数据存储位置的指针。可以显著提高数据库的查询性能,减少查询读取的数据量,强制表中的记录具有唯一性,确保数据的完整性。
分类
UNIQUEFULLTEXT,可以VARCHAR或TEXT类型上创建作用
注意事项
where子句中使用相对频繁的列管理索引
# 创建普通索引create index index_nameon table_name (column_list(length));alter TABLE table_nameADD INDEX index_name(column_list);create INDEX idx_studentinfoix_oneON studentinfoix(NAME);ALTER TABLE studentinfoixADD INDEX idx_studentinfoix_th(name(5));# 创建唯一索引create UNIQUE INDEX index_nameON table_name (column_list(length));ALTER TABLE table_nameADD UNIQUE INDEX index_name(column_list);create UNIQUE INDEX idx_studentinfoix_seON studentinfoix (NAME, age(2), sex(1));ALTER TABLE studentinfoixADD UNIQUE INDEX idx_studentinfoix_th(name(5),age(2), sex(1));# 创建主键索引ALTER TABLE table_nameADD PRIMARY KEY(column_list);ALTER TABLE studentinfoixADD PRIMARY KEY(id(7));# 查看索引SHOW INDEX from tb_name;#删除索引DROP INDEX index_name ON table_name;ALTER TABLE table_name DROP INDEX index_name;
create FUNCTION fu_name([param_name datatype[, ...]])RETURNS typeroutine_body# 创建函数,第一行指明结束标记delimiter //create FUNCTION myfstfun()RETURNS VARCHAR(5)BEGINRETURN 2+3;END//select myfstfun();# 创建带参数的函数DELIMITER //create FUNCTIONtest.myfstfun_2(in_id VARCHAR(20), in_str1 VARCHAR(20), in_str2 VARCHAR(20))RETURNS VARCHAR(5)beginDECLARE int_1 INT;DECLARE int_2 INT;IF(in_id IS NOT NULL) THENselect scores into int_1from scoresinfowhere student_id = in_id and SUBJECT = in_str1;select scores into int_2from scoresinfowhere student_id = in_id and SUBJECT = in_str2;end if;return int_1+int_2;end //select myfstfun_2('000002', '英语','数学');
函数的管理
# 删除函数DROP {FUNCTION} [IF EXISTS]fn_nameDELIMITER //DROP FUNCTION [if exists]myfstfun_4//
存储过程:SQL语句集,当执行成功后会被存储在数据库服务器中,并允许客户端直接调用,而且存储过程可以提高SQL语句的执行效率。允许包含一条或者多条SQL语句,完成一个或多个逻辑功能。
优点:
# 创建存储过程create PROCEDURE sp_name ([IN | OUT | INOUT] param_name type[,...])bodyDELIMITER //create PROCEDURE test.fst_prc(OUT param1 INT)beginselect count(*) INTO param1 from scoresinfo;end//# 创建无参存储过程DELIMITER //create PROCEDURE test.fst_scoresinfo_proc()beginUPDATE scoresinfo SET remark = '优秀' where scores >= 90;end//DELIMITER ;CALL fst_scoresinfo_proc//# 创建含参存储过程DELIMITER //createPROCEDURE test.se_scoresinfo_proc(IN param1 INT)BEGINIF (param1 IS NOT NULL) THENUPDATE scoresinfo SET remark = '一般' where scores <= 70;END IF;END//DELIMITER //CALL SE_scoresinfo_proc(1)//# 创建OUT类型参数存储过程DELIMITER //createPROCEDURE test.th_proc(OUT param1 INT)BEGINselect count(*) INTO param1 from studentinfo;END//DELIMITER //CALL th_proc(@X)//select @x//# 创建INOUT类型参数存储过程DELIMITER //createPROCEDURE test.fo_scoresinfo_proc(INOUT param1 INT)BEGINIF (param1 IS NOT NULL) THENselect count(*) INTO param1 from studentinfo;END IF;END//DELIMITER //SET @a = 1//CALL fo_scoresinfo_proc(@a)//select @a//
修改存储过程
利用SQLyog工具修改。
删除存储过程
DROP PROCEDURE[IF EXISTS]sp_name
存储过程中的变量
# 声明DECLARE var_name[, ...] type [DAFAULT value]# 赋值SET var_name =expr [, var_name = expr]...
结构控制语句
# IFIF search_condition THEN statement_list[ELSEIF search_condition and THEN statement_list][ELSE statement_list]END IF# CASE# 存储过程中的CASE语句与函数里的CASE语句有差别,存储过程里的CASE语句不能有ELSE NULL子句,并且用END CASE终止。CASE case_valueWHEN when_value THEN statement_list[WHEN when_value THEN statement_list][ELSE statement_list]END CASECASEWHEN search_conditi and THEN statement_list[WHEN search_conditi and statement_list][ELSE statement_list]END CASE# LOOP循环控制语句[begin_label:]LOOPstatement_listEND LOOP [end_label]create PROCEDURE prcloop(x INT)BEGINlabel1:LOOPSET x =x+1;IF x<8THEN ITERATE label1;END IF;# 退出LOOP语句LEAVE label1;END LOOP label1;SET @xx =x;END#另一种方法create PROCEDURE prcloopse(x INT)BEGINlabel1:LOOPSET x =x+1;IF x>=8THEN LEAVE label1;END IF;END LOOP label1;SET @xx =x;END# while语句的使用[begin_label:]while search_condit and DOstatement_listEND while [end_label]DELIMITER //createPROCEDURE test.prcwhile()BEGINDECLARE vx INT DEFAULT 10;vx>0 DOSET vx = vx-1;END whileSET @xx = vx;END //select @xx
触发器只能由数据库的特定事件来触发,并且不能接受参数。特定事件包括:插入、更改、删除。
用途
创建触发器
注意:在同一个表下,不可能有两个相同时间或事件的触发器。
# 语法create TRIGGER tigger_name trigger_time trigger_eventON tbl_name for EACH ROW #tbl_name 触发器宿主trigger_stmt# BEFORE INSERT类型的触发器DELIMITER //create TRIGGER test.fstINSERTtingBEFORE INSERT ON newsstudentinfoFOR EACH ROWBEGININSERT INTO Logtab(oname, otime) VALUES('test', SYSDATE());END//# AFTER INSERT 类型的触发器DELIMITER //create trigger test.secINSERTtrg# 增加数据时触发该触发器AFTER INSERT ON newsstudentinfoFOR EACH ROWBEGININSERT INTO Logtab(oname, otime) VALUES ('test_after', SYSDATE());END//INSERT INTO tst.studentinfo VALUES('111111', '测试', 12.0);//INSERT * from test.logtab;//
管理触发器
# 删除触发器drop TRIGGER[schema_name.] trigger_nameDELIMITER //DROP TRIGGER test.fivdeltrgger//#修改触发器:删除,重新创建
# 登录mysql -u root -p# 创建用户create USER'username'@'localhost' IDENTIFIED BY 'password'# 用户权限GRANT privilegesON databasename.tablenameTO 'username'@'localhost'
数据备份和恢复
# mysqldump备份mysqldump [OPTIONS] database [tables]mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2, DB3]mysqldump [OPTIONS] --all -databases [OPTIONS]#备份一个数据库的多个表mysqldump -u root -p abcd1234 test_db book users>c:\tabbak.sql# 备份多个数据库mysqldump -u root -p abcd1234 --databases test_db test >c:\dbbak.sql# 备份所有数据库的结构mysqldump -u root -p abcd1234 -A-D>c:\allbak.sql# 恢复操作mysql -u root -p abcd1234 test < c:\tabbak.sql
JDBC:JAVA DataBase Connectivity,Java应用程序接口,用来执行SQL语句