mysql 命令
查看mysql字符集
show variables like 'character%'
数据库启动与停止
net start mysql
net stop mysql
登陆
mysql -u用户名 -p密码
数据库操作
创建数据库:create database 数据库名称 character set utf8;
数据库删除:drop database 数据库名称
显示数据库:show databases;
查看某个数据库定义信息:show create database 数据库名称;
切换数据库:use 数据库名称;
查看当前使用的数据库:select database();
表操作
创建表:create table 表名称(
字段名称 字段类型(长度) 约束,
字段名称 字段类型(长度) 约束......
) character set utf8;
删除表:drop table 表名称;
表结构操作
添加列:alter table 表名 add 字段名称 字段类型(长度) 约束;
修改列的类型,长度,约束:alter table 表名 modify 字段名称 字段类型(长度) 约束;
修改列名,类型,长度,约束:alter table 表名 change 旧列名 新列名 字段类型(长度) 约束;
删除列:alter table 表名 drop 列名;
修改表名:rename table 旧表名 to 新表明
更改表的字符集:alter table 表名 character set utf8;
查询数据库表:show tables;
查看某个表信息:desc 表名;
创建外键:alter table 从表 add constraint 外键名称 foreign key(从表外键字段名)references 主表(主表的主键);
删除外键:alter table 从表 drop foreign key 外键名称
外键级联操作类型
restrict(限制):默认值,抛异常,如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作
cascade(级联):如果主表的记录删掉,则从表中相关联的记录都将被删除,在父表上update/delete记录时,同步update/delete掉子表的匹配记录
set null:将外键设置为空,在父表上update/delete记录时,将子表上匹配记录的列设为null,要注意子表的外键列不能为not null
no action:什么都不做
创建外键时遇到的问题: 1.关联的外键为not null ,外键删除时和更新时选择的 SET NULL;解决选择cascade;2.创建外键时,该表已经存在数据,错误:1452。解决方法:1)删除数据;2)在外键表中添加对应的项,再添加外键
表内容操作
插入:insert into 表名 values(值1,值2,值3......);
insert into 表名 (列1,列2,列3......) values (值1,值2,值3......);
更新:update 表名 set 字段名=值,字段名=值......where 条件
删除:delete from 表名 where 条件
truncate table 表名;
区别:delete:一条一条删除,不清空auto_increment记录条数,删除的数据在一个事务中可 以找回,truncate:直接将表删除,重新建表,auto_increment将置为空,从零开始,删除的 数据找不回来
查询
select [distinct] * |列名 from 表 where 条件 group by 分组字段 having 分组条件 order by 排序字段 asc|desc limit star,count;
distinct:去重
like:_代表一个字符,%代表任意个字符
in:在某个范围内获得值in(set)
between ... and ...:显示在某一个的值(含头含尾)
is null:判断是否为空
is not null:判非空
and:多个条件同时成立
or:多个条件任意成立
not:不成立
排序:asc,desc
聚合:avg(),sum(),min(),max(),count()
分组:group by
对比where与having:
where是对from后面指定的表进行数据筛选,属于对原始数据的筛选,having是对group by的结果进行筛选
连接查询
参考:http://www.cnblogs.com/logon/p/3748020.html
http://www.cnblogs.com/pcjim/articles/799302.html
inner join(等值连接):只返回两个表中联结字段相等的行;
left [outer] join(左联接):返回包括左表中的所有记录和右表中联结字段相等的记录;
right [outer] join(右联接):返回包括右表中的所有记录和左表中联结字段相等的记录
视图--视图本质就是对查询的一个封装
定义视图
create view stuscore as
select students.*,scores.score from scores
inner join students on scores.stuid=students.id;
视图的用途就是查询
select * from stuscore;
事务
事务语句
开启:begin;
提交:commit;
回滚:rollback;
建表原则
一对多关系:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键
多对多关系:两张表都是主表,新建第三张表作为从表,提供两个字段,都是外键
一对一关系
内置函数
字符串函数
查看字符的ascii码值,ascii(str),str是空串时返回0
select ascii('a');
查看ascii码值对应的字符,char(数字)
select char(97);
拼接字符串,concat(str1,str2...)
select concat(12,34,'ab');
包含字符个数,length(str)
select length('abc');
截取字符串
left(str,len),返回字符串str的左端len个字符
right(str,len),返回字符串str的右端len个字符
substring(str,pos,len),返回字符串str的位置pos起len个字符
select substring('abc123',2,3);
去除空格
ltrim(str)返回删除了左空格的字符串str
rtrim(str)返回删除了右空格的字符串str
trim([方向] from str)返回从某侧删除remstr后的字符串str,方向词包括both、leading、trailing,表示两侧、左、右
select trim(' bar ');
select trim(leading 'x' FROM 'xxxbarxxx');
select trim(both 'x' FROM 'xxxbarxxx');
select trim(trailing 'x' FROM 'xxxbarxxx');
返回由n个空格字符组成的一个字符串,space(n)
select space(10);
替换字符串,replace(str,from_str,to_str)
select replace('abc123','123','def');
大小写转换,函数如下
lower(str)
upper(str)
select lower('aBcD');
数学函数
求绝对值abs(n)
select abs(-32);
求m除以n的余数mod(m,n),同运算符%
select mod(10,3);
地板floor(n),表示不大于n的最大整数
select floor(2.3);
天花板ceiling(n),表示不小于n的最大整数
select ceiling(2.3);
求四舍五入值round(n,d),n表示原数,d表示小数位置,默认为0
select round(1.6);
求x的y次幂pow(x,y)
select pow(2,3);
获取圆周率PI()
select PI();
随机数rand(),值为0-1.0的浮点数
select rand();
日期与时间
获取子值,语法如下:
year(date)返回date的年份(范围在1000到9999)
month(date)返回date中的月份数值
day(date)返回date中的日期数值
hour(time)返回time的小时数(范围是0到23)
minute(time)返回time的分钟数(范围是0到59)
second(time)返回time的秒数(范围是0到59)
select year('2016-12-21');
日期计算,使用+-运算符,数字后面的关键字为year、month、day、hour、minute、second
select '2016-12-21'+interval 1 day;
日期格式化date_format(date,format),format参数可用的值如下:
获取年%Y,返回4位的整数
获取年%y,返回2位的整数
获取月%m,值为1-12的整数
获取日%d,返回整数
获取时%H,值为0-23的整数
获取时%h,值为1-12的整数
获取分%i,值为0-59的整数
获取秒%s,值为0-59的整数
select date_format('2016-12-21','%Y %m %d');
当前日期current_date()
select current_date();
当前时间current_time()
select current_time();
当前日期时间now()
select now();
查询例子
select * from category,products where cid=category_id;
select * from category c,products p where c.cid=p.category_id;
select cname from category c,products p where c.cid=p.category_id;
select distinct cname from category c,products p where c.cid=p.category_id;
select distinct cname from category c inner join products p on c.cid=p.category_id;
select * from category c left outer join products p on c.cid=p,category_id;
select cname,count(category_id) from category c left outer join products p on c.cid=p.category_id group by cname;
select p.* from products p,category c where p.category_id=c.cid and c.cname="化妆品";
select * from products where category_id=(select cid from category where cname="化妆品");