MySQL(1): 基本操作

MySQL 是流行的关系型数据库管理系统之一,特别是在WEB应用方面。推荐用5.6版本。

 My Sql客户端有很多

MySQL(1): 基本操作_第1张图片

 还有PHP MyAdmin, 是以web形式控制和操作MySQL数据库的管理工具。是WAMP软件包集成的工具软件。

Navicat premium 破解版安装连接http://www.downcc.com/soft/322714.html 

补充MYSQL

(1)limit 两个数字

select * from student limit 2,4 

2 第一位表示从下标为几的数据开始;4第二位表示当前分页显示多少数据。

limit 2,4表示从第三条开始,显示4条数据。

(2)limit 两个数字

select * from student limit 4. 显示4条数据。

(3)分组函数一般与聚合函数一起!!

select sdept, count(*) from student group by sdept;

(4)having 用于分组函数的条件!!

select sdept,count(*) from student group by sdept having count(*)>5

(5)show tables 显示当下数据库的所有表和视图

视图的主要功能是简化查询语句,很多嵌套的复杂查询

 (6)存储过程

示例1:

CREATE DEFINER=`root`@`localhost` PROCEDURE `pro1`(OUT `cnt` integer)
BEGIN
    #Routine body goes here...
select count(*) into cnt from student where sdept='PC';
END

在查询语句中进行调用

set @shu=0;
call pro1(@shu); 
select @shu;

shu是会话变量,以@开头。

示例2:

在查询脚本中写

CREATE PROCEDURE pro3(IN sig integer,OUT cnt integer)
BEGIN
    IF sig = 1 THEN
        SELECT count(*) INTO cnt FROM student WHERE sclass = '01';
    ELSE 
        SELECT count(*) INTO cnt FROM student WHERE sclass <>'01'; #<>
    end if;
END;

调用,在左侧列表中没有出现pro3 需要刷新一下

call pro3(1,@cnt);
select @cnt;

---

MySQL(1): 基本操作_第2张图片

(7)索引

可以提高查询数据,在数据里很大的情况下可以用,一般查询中常用的字段加索引。

增加一个索引,会把表“备份”一份,按照索引排序一下,会消耗内存!

chapter1 数据库操作

1. 系统数据库: 是安装完MySQL服务器后,附带的一些数据库。例如information_schema,主要存储数据库对象的信息(用户名信息、列信息、权限信息等)。performance_schema主要用于存储数据库服务器性能参数。

创建数据库  create database xy;或者create schema xy;

不允许两个同名的数据库,可以 create database if not exists xy;

2. 查看、选择、删除数据库

show databases|schemas like|where

show databases like 'db_%'  ;找到db开头的数据库。

选择数据库。create database 语句之后,该数据库不会成为当前数据库,需要 写 use database;

删除数据库 drop database|schema, 比如drop database if exists xy;

chapter2 数据类型

1.数字类型

tyniint(如果值不超过127,用tyniint 比int 好);

还有int , float ,double等。

2.字符串类型

(1)普通:char, varchar(变长)

(2)可变:text适合长文本;bolb适合二进制数据,支持任何数据包括文本、声音、图像等。

(3)特殊:enum('value1','value2',……),把列中的内容限制在一种选择上,只能所列举的值之一或者null;

set('value1','value2',……),可以容纳一组值或者null.

3. 日期与时间类型

datetime\date\timestamp\time\year

date格式为 yyyy-mm-dd

time 格式为 hh:mm:ss

datetime 格式为yyyy-mm-dd hh:mm:ss

chapter3 数据表操作

1.表的创建

 create table if not exists 表名(列1 属性1,列2 属性2,……);

if not exists 避免了建表时报告错误。

对于成功创建的表,可以show columns 或者 describe 查看表结构

show columns from 表名 from 数据库名  ; 或者  show columns from 数据库名.表名

describe 表名 或者简写为 desc 表名;

或者只看某个字段  desc 表名 列名;

2. 修改表结构

增加新字段  alter table 表名 add sno varchar not null;

修改字段名 alter table 表名 change column 老的字段 新的字段;

删除字段 alter table 表名 drop 字段名;

修改表名 alter table 表名 rename as 新表名 ; 或者 rename table 老的表 to  新的表名;

复制表 create table (if not exists)新的表名 like 源表名 ; 这个语句没有复制表中的数据。

 create table (if not exists)新的表名 as select * from 源表名; 这个复制了数据。

删除表 drop  table (if exists) 表名;

 

chapter 4 MYSQL 基础

1. 算术运算符 + - * / 

求余% 或 mod 

select score,score+score from student;

2. 比较运算符 不等于<> 或者!= 

is null ; is not null; between.. and ...; in ;not in;

like; not like ; regexp(正则表达式)

regexp 可以来匹配某个字段的值是否以指定字符开头、结尾,或者包含某个字符串。

返回值是1或者0.

MySQL(1): 基本操作_第3张图片

3. 逻辑运算符

and  && ; || or ;  ! not ; xor 异或

1 xor 1=0; 0 xor 0 =0;

4. 流程控制

(1)if then.. elseif then... else... end if;

(2)case

case value

   when .. then...

   when..then...

   else...

end case

(3)while

while condition DO

...

end while

创建一个procedure

create procedure pro4(out sum int)
begin 
declare i int default 1;
declare s int default 0;
while i<10 DO 
set s =s+i;
set i=i+1;
end while;
set sum=s;
end

调用

call pro4(@s);
select @s

得到45  : 从1+,,,9=45;

(4)loop 

loop

...

end loop

(5)repeat 先执行一次循环体,之后判断condition,为真则退出循环。

repeat 

...

until conditon 

end repeat

create procedure pro5(out sum int)
begin 
declare i int default 1;
declare s int default 0;
repeat 
set s =s+i;
set i=i+1;
until i>10 
end REPEAT;
set sum=s;
end


call pro5(@s);
select @s

得到55, 从1+,,,10=55

 

chapter5 表数据的增删改、常用函数

1. 增加数据

(1)insert into 表名 values('','','') ,('','',''); 可以插入多条数据。

(2)insert into 表名 set sname='mike',sno='001';  指定字段的值。

(3)insert  into 表名 select子句。

insert into 表名 (sno,sname) select sno,sname from student;

2. 修改数据

update  表名  set sname='mike' where sno='001';

3. 删除数据

delete from  表名 where sno='001';  删除一行数据

truncate table  表名 ;删除表中所有的行。

4. group by

select sname,sdept from student group by sdept;

不用函数, group by 一组只显示一条数据

MySQL(1): 基本操作_第4张图片      MySQL(1): 基本操作_第5张图片

select sdept,count(*)from student group by sdept;

GROUP_CONCAT可以把一个组下面的字段值都显示出来。

select sdept,GROUP_CONCAT(sname) from student group by sdept;

MySQL(1): 基本操作_第6张图片

 

 5. exists 查询

exists 使用时,内层查询语句不返回查询的记录,而是返回一个真假值。返回true 时,外层查询进行查询。

如果sc表中存在001的学生序号,那么查找student的表数据。 

select * from student where exists(select * from sc where sno='001');
select * from student where sclass='01' and exists (select * from sno='001');

not exists : 如果内层返回false, 外层才开始查询。

6. any 与 all

>all 大于最大值。

7.正则表达式

^x  以x开头

x$  以x结尾

.  匹配任何一个字符

[字符集合]  

[^字符集合]  [^abc] 除了abc以外的任意一个字符

a|b|c

*  匹配多个该符号之前的字符,包括0个或者1个;

+  匹配多个该符号之前的字符,1个以上;

{n}  匹配字符串出现n 次;

{m,n} 出现m-n次;

select sname from student where sname regexp'm$' ;  以 m 结尾。

regexp ‘a{3}’ a 出现3次;

‘J+A’ 至少出现一次J; 

8. 数学函数

abs(x); ceil(x); floor(x); rand() 0-1之间的随机数; sign(x); PI();

truncate(x,y) x 保留小数点到y位的值; round(x); pow(x,y) 或者power(x,y);

sqrt,exp,mod(x,y); log(x),基数为2; log10(x); sin(); asin(); cos();  acos();

select abs(-5),sqrt(5);

9.字符串函数

char_length(s) s 的字符数;

length(s)  s 的长度(字节);

concat(s1,s2,...) 

cncat_ws(x,s1,s2,...) ;每个字符串直接要加上x

select CONCAT_WS('*','aaa','bbb')  ; 得到aaa*bbb

upper(s); lower(s);

left(s,n) 左边n 个字符; right(s,n);

Ltrim(s); Rtrim(s);

insert(s1, x,len,s2): s1 从x 位开始的len 长度由s2 代替。select insert('mikj',3,2,'book')  得到mibook

repeat(s,n);s 重复n次;

substring(s,n,len), 获取s 从n位置开始的len长度字符串。

reverse(s), 顺序反过来;

field(s,s1,s2...) 返回第一个与s 匹配的字符串的位置。select field('aa','bfa','faae','aa')得到3.

locate(s1,s) s1在s 中的开始位置;类似的还有 position(s1 in s) 或者 instr(s,s1)

10. 日期函数

curdate(); current_date(); 一样的,获取当前日期。

curtime(); current_time(); 获取当前时间。

获取当下日期和时间:now(), current_timestamp(), localtime(), sysdate();

datediff(d1, d2) 相隔的天数。SELECT datediff('2014-2-4','2015-4-9')  -429

adddate(d,n);  相反的是subdate(d,n);

11. 条件判断函数!!! 很重要

if(expr,v1, v2) , expr成立就执行v1; 

ifnull(v1,v2) , v1不空则返回v1, 否则返回v2;

case when expr1 then v1 when expr2 then v2 else v0 end 

case expr when e1 then v1 when e2 then v2 else v0 end 

12.系统信息函数

 version() 数据库版本号

connection_ID() 获取服务器的连接数

database(), schema() 获取当前数据库名

user(),system_user(), session_user() 获取当前用户

 MySQL(1): 基本操作_第7张图片

 

mysq函数大全 补充

数学函数:

#ABS 绝对值函数
select abs(-5) ;
#BIN 返回二进制,OCT()八进制,hex十六进制
select bin(2);
#ceiling  天花板整数,也就是大于x的整数
select CEILING(-13.5);
#EXP(X)自然对数e为底的x次方
select EXP(2);
#FLOOR(X)小于x的最大整数
select FLOOR(3.5);
#返回集合中最大的值,least返回最小的,注意跟max,min不一样,max里面跟的是col,返回这个列的最大值最小值
select GREATEST(1,2,3,4);
#ln(x)返回对数
select LN(10);
#log(x,y),以y为底x的对数
select log(4,2);
#mod(x,y)返回x/y的余数
select mod(5,2);
#pi() 返回pi
select pi();
#RAND()返回0,1之间随机数
select rand();
#round(x,y)返回x四舍五入有y位小数的值
select round(pi(),3);
#sign(x) 返回x符号
select sign(-5);
#sqrt(x)返回x的平方根
select sqrt(9);
#truncate(x,y) 返回数字x截断为y位小数的结果,就是不考虑四舍五入,直接砍掉
select TRUNCATE(pi(),4),ROUND(pi(),4),pi();

 聚合函数(常用语group by从句select语句中)

#avg(col)返回指定列平均值
select AVG( quantity) from orderitems;
#count(col)返回指定列中非null数量
select count(quantity) from orderitems;
#min(col)max(col)返回指定列最大最小值
select max(quantity),min(quantity) from orderitems;
#sum(col)返回制定列求和值
select sum(quantity) from orderitems;
#group_concat(col)返回这个列连接组合的结果,中间有逗号隔开
select group_concat(prod_id) from orderitems

 字符串函数

#ASCII(str)返回字符串的ascii码值
select ASCII('12');
#bit_length(str)返回字符串的比特长度
select bit_length('123');
#concat()连接字符串
select concat('1','我','2');
#concat_ws(sep,s1,s2,s3)连接字符串用sep隔开
select concat_ws('|','1','我','2');
#INSERT(str,pos,len,newstr),将字符串str从pos位置开始的len长度替换为newstr
select 'hello world',INSERT('hello world',2,3,'杰哥哥');
#FIND_IN_SET(str,strlist)分析逗号分隔的list,如果发现str返回list中的位置
select find_in_set('abc','aabc,sdf,det,abc') #返回4
#LCASE(str),LOWER(str)都是返回小写的结果,UPPER(),UCASE()    返回的都是大写结果
select LCASE('UUSU');
#`LEFT`(str,len)从左到右从str中选择长度为len的字符串,`RIGHT`(str,len)相反
select left('hello world',4);
#length(str)返回str字符串长度
select length('hello world');
#trim(),ltrim()rtrim()分别去掉两头的空格,左边的空格,右边的空格
select trim('   hello   ');
#POSITION(substr IN str),返回substr首次在str中长线的位置
select POSITION('llo' IN 'hello world');
#QUOTE(str)用反斜杠转义str中的单引号
select QUOTE("hello ' world")
#`REPLACE`(str,from_str,to_str)在str中,把from str 转成to_str
select replace('hello world','hello','hi');
#repeat(str,count)重复str count次
select repeat('hello world',3);
#reverse(str)颠倒str
select reverse('hello world');
#STRCMP(expr1,expr2)比较两个字符串,一模一样返回0,不一样返回1
select STRCMP('hello','world')

日期和时间函数

#curdate()或者current_date() NOW()是返回日期+时间
select current_date();
#curtime()当前时间,或者current_time()
select curtime();
#DATE_ADD(date,INTERVAL expr unit)返回date加上int日期后的日期,date_sub()也是一样的
select date_add(curdate(),interval 5 day);
select date_add(curtime(),interval 5 hour);
#DATE_FORMAT(date,format)按照格式转化日期,具体的format格式可以查查
select date_format(CURDATE(),'%m-%d-%Y');
#dayofweek()DAYOFMONTH(date)DAYOFYEAR(date)返回日期中是一周中第几天,一个月中第几天,一年中第几天
select DAYOFMONTH(CURDATE());
#dayname返回日期星期名
select dayname(CURDATE());
#hour(time),minute(time),month(date)
select curtime(),hour(CURTIME()),minute(curtime());
select curdate(),month(curdate()),year(curdate()),day(curdate());
#MONTHNAME(date) 返回月份名称
select monthname(curdate());
#quarter(date)返回日期的第几季度
select quarter(curdate());
#week(date)
select week(curdate());
#TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)计算两个时间差,还有datediff()
select TIMESTAMPDIFF(year,19920202,CURDATE())

 

chapter 6 索引

索引可以提高查询速度,不需要遍历数据表中的所有数据,只需要查询索引列。

索引就像一本书的目录。但是创建索引和后期维护需要花费很多时间,索引也会占用物理内存。

有索引也会影响表的插入操作,因为新插入数据会按照索引进行排序。(可以先删除索引再插入数据,再重建索引。。)

索引类型:

(1)普通索引normal:

(2)唯一索引:unique , 索引的值唯一。主键就是一种特殊的索引

(3)全文索引fulltext:只能建立在char varchar text类型的字段是。

创建普通索引 

create table score(id int(11), auto_increment primary key not null), 
name varchar(20) not null, grade int(5) not null, index(id))

创建唯一性索引

create table score(id int(11), auto_increment primary key not null), name varchar(20) not null, grade int(5) not null, unique index(id))

创建全文索引,索引名称是beizhu1

create table score(id int(11), auto_increment primary key not null), 
name varchar(20) not null,
grade int(5) not null, beizhu varchar(100),FULLTEXT KEY beizhu1(id))

在已有的表中创立索引

create index 索引名 on 表名(字段)

create index stu_info on student(info)
create unique index stu_info on student(info)
create fulltext index stu_info on student(info)

修改、删除索引

alter table student add index idx1(sno);
drop index idx1 on student; # 删除索引

chapter7 视图

create or replace view view1(sno, cno) as select 。。with check option. 

with check option 表示更新视图时要保证在该视图的权限范围之内。

查看视图 desc view名

看视图

MySQL(1): 基本操作_第8张图片

 看表

MySQL(1): 基本操作_第9张图片

 这就是表与视图的差别

show create view pc 可以查看视图pc的详细定义。

修改视图,可以更改其中的列

alter  view view1(sno) as  select sno from student with check option;

更新视图:update view1  set grade=100 where sno=‘001’;

对视图的更新就是对基本表的更新。

并不是所有的视图都可以更新,以下情况不能更新:

(1) 用了函数sum等;

(2) 包含union, distinct,group by, having;

(3) 视图中的select 包含子查询。

最好不要通过视图进行更新。删除视图 drop view if exists view1;

 

chapter8 数据完整性约束

1.实体完整性

(1)主键约束, 一个表只能有一个主键,主键能够唯一标识一行记录,且不为null. 可以是一列或者多列。primary key.

(2)候选键约束,可以是一列或多列。值唯一且不为空。unique

2. 参照完整性

foreign key(sno) references sc(sno) on delete restrict on update restrict;

reference 后面跟的表是被参照表(父表)。

restrict:禁止对被参照表的删除或者更新;

cascade: 被参照表删除或更新时,参照表的数据也被更新或删除;

set null :被参照表删除或更新时,设置参照表中对应的外键为null;

3.用户定义完整性

check(expr) : 

对列:age int not null check(age>0 and age<100)

对表:check sno in (select sno from student)

 

   

 

 

你可能感兴趣的:(MySQL(1): 基本操作)