mysql

来源:互联网 发布:淘宝卖家服务态度评分 编辑:程序博客网 时间:2024/06/10 17:42

                                                                             DDL:

开启服务: services.msc
查看MySQL编码:show variables like '%character%';




增加表字段
ALTER TABLE student ADD COLUMN sex CHAR(10);


-- 修改字段排列顺序
ALTER TABLE student MODIFY sname DATE FIRST;


 information_schema:存储了系统中一些对象信息,如:用户表信息,试图信息,各种数据库变量状态、字符集信息等
mysql:主要是用户的相关权限信息
performance_schema:记录系统性能的数据库。通过performance_schema变更决定是否开启,默认不是开启的
test:测试数据库




DDL: 必须加 database; 操作表的话 table  ,删除列是 drop 属于修改 都是 alter 


DDL:操作数据库,和表的列-----------------------------------databases
查看数据库 : show databases
切换数据库: use 数据库名
创建数据库: create database mydb1
删除数据库: drop database mydb1;
修改数据库编码 : alter datebase mydb1 character set utf8 (效对规则)collate utf8_bin;






除了字符串类型需要设置长度其他的都有默认值;
bit(boolean):
float:
int:
decimal : 浮点型,在关于钱的方面使用该类型,不会出现精度确失;
double(5,2) 表示最多5位,其中必须有两位小数,即最大值为999.99;
char(255),固定字符串类型,数据长度不足指定长度,自动补足到指定长度;
varchar(65535) ,可变的字符串类型
date/time/xdatatime和timestamp:一个不传日期,为null,另一个为系统日期;






text(clod): 字符串类型,     可变从小到大都能放
blod :字节类型, 同上;
data 日期类  
time 时间类
timestamp:  时间戳类型;
Text: 文本文件
二进制文件: BLOB




创建表结构-------------------------------只要是创建就是 create table 表名
create table 表名(  
列名,列类型 ,
列名,列类型 
);


查看当前数据库中所有表的名称  show tables;
查看指定表的创建语句: show create table(database) 表名;
查看表结构:  desc 表名;
删除表: drop table 表名;


修改表: alter table 表名------------------修改就是alter table 表名 操作
添加列:
alter table 表名 add(
列名,列类型 ,
列名,列类型 
);




修改列的类型 alter table 表名 modify 列名 列类型;
修改列名: ................... change 原列名 新列名 类型; 
删除列:...................    drop 列名;
修改表名称:.................. rename 旧表名 to 新表名
修改表的字符集:               character set 字符集;(utf8)



                                                                                             DCL:

一个项目创建一个用户, 一个项目对应的数据库只有一个
这个用户只能对这个数据库有权限,


1.创建用户 create user 用户名@ip地址   identified by '密码';
用户只能在指定的ip地址上登录


create user 用户名@'%' identified by '密码';
用户可以在任意地址登录


2.给用户授权,在主用户中授权
grant 权限1,...,权限n on 数据库.* to 用户名@ip地址


grant all on 数据库.* to 用户名@ip地址;




3撤销授权
revoke 权限1,..,权限n  ON 数据库.from 用户名@ip地址




4.查看权限
show grants for 用户名@ip地址




5.删除用户
drop user 用户名@ip地址


                                                                                            DML:



一:   ON DUPLICATE KEY UPDATE:在表中存在unique索引或者primary key,如果插入行后会导致一个unique索引或primary key中出现重复值,则执行旧行udpate操作
insert into emp values('liu','2012-06-08') on duplicate key update sal=sal+3000;




二:  使用IGNORE时,该行仍然未被插入,但是不会出现错误
在日常工作中,ignore主要用于一条insert语句中有多个值,如果有一条语句失败,不会导致别的语句也失败
insert ignore into emp_ignore(ename,depton) values('shan',4),('yang',5);


三:  注意:除非表中存在primary key或unique索引,否则,使用replace语句是没有意义的
replace的功能类似insert。只有一点除外,如果表中一个旧记录与一个用于primary key或一个unique索引的新记录具有相同的值,则在新记录被插入之前,就记录被删除。
replace into emp set ename='dong',sal=30000,depton=5;










DML: 什么都不用加, 插入 insert into  , 修改是 update set , 删除是 delete from


DML : 对表记录的操作(增删改) ,对表行的操作


1.插入数据----------------------------------    intert into 


insert into 表名(
列名1,
列名2,...
)values(列值1,
列值2,...
);


二种方法 insert into 表名 values(列值1,列值2) 也就是说不写列名了
如果列类型是字符串或者日期,写值的时候要加单引号


一条命令插入多条记录,但不能写列名称
Insert into emp values('tang','2011-06-03',9000,3),('sun','2012-09-08',56000,4);




插入中文:  修改配置文件客户端client编码为GBK;




2. 修改数据----------------------------------------------------------------update 表名 set 
update 表名 set 列名1=值1, 列名2=值2,.....[where 条件]-------------where条件


比如:


update person set gender='男',age=age+1 where sid='1';



where age>=18 and age <= 80;
18到80之间;
where age between 18 and 80;



where name='速度' or name='手动阀';


在具体哪里进行修改
where name in('张三','李四');


谁的名字是什么
where name is null , 不能使用等号;


不是什么
where age is not null;


3.删除数据
delete from 表名where 条件-------------------------------------------delete from 




只用作删除整张表
truncate table 表名: 是DDL语句,无法回滚;  将整个表删除,重新创建一个表


事物管理只能作用在DML, 使用delete删除所有记录,可以找回


在数据库中所有的类型都要使用单引;


                                                                                                   DQL:

查询语句书写顺序: select - 聚合函数-from -where -group by - having - order by - limit
查询语句执行顺序: from - where - group by - having - select - order by - limit


IN 是 = ANY 的别名,二者相同,但 NOT IN 的别名却不是 <> ANY 而是 <> SOME。
ANY 关键字必须接在一个比较操作符的后面


union 对两个结果集进行并集操作,重复数据只显示一次
Union All,对两个结果集进行并集操作,重复数据全部显示




查询人数用 count;
查询分组后的用having;
查询分组的用group by;
查询分页的用limit 
不为null的数, finull("列名",0);
查询排序用 order by;asc和desc;
查询 去除重复用 distinct;,在select from中间加


查询不是字符串 not in  是 in
非男 用 <>
不为null is not


模糊查询用like,在where后面加,like可以使用占位符


可以写表达式   :select name,age+10 from user; select name,math+english from user;




1) 基本查询
select 列名 from 表名 where gtoup by having order by;


查询所有列
select * from 表名
其中的 * 表示查询所有列




2)查询指定列
select 列1 [列2,..,列n] from 表名;






3)条件查询
①并且
select * from stu where..and... ;




②或
select * from stu where..or... ;




③是


select * from stu where 列名in(值);




④不是
not in






⑤查询为null的记录
select * from stu where 列名is null;






⑥查询区间记录


s.....where 列名 between 值 and 值;






⑦查询非的记录


s......where 列名 != 值; 或gender<>值


not 列名=值






⑧查询不为 null 
s.....is not null;


not 列名 is null;






4.模糊查询---------------------------------------------关键字like
通配符 : _ 任意一个字符. %任意0-n个字符;


hiredate LIKE '1980%',表示1980年入职的员工;


①......where 列名 Like '____'       




②.......where 列名 like  '___i';




③以'z'开头的
........where 列名 like 'z%';




④第二个字母为'i'的
.......where 列名 like '_i%';




⑤包含a字母的学生记录
.....where 列名 like '%a%';




4.字段控制查询


①去除重复-------------------------------------------------------distinct


select distinct *  from emp;
查询员工的工资,如果存在相同的工资只显示一次;




②看两个列之和的


select *,两个列相加 from emp;


select *, 列1+ifnull(列2,0)from emp;




③给列名添加别名
select *,列1+列2 AS 别名 from emp;
as 可以省略








5.排序 order by  列名   asc(默认) desc;---------------------order by


①升序
.......order by 列名 asc;


②降序
........order by 列名 desc;


③一起使用


.........order by 列1 升, 列2 降;






6.聚合函数 操作列的-------------------------------sum  avg平均值 max min  count统计列不为null的记录行数


①count --------------------------统计数的
当需要纵向(统计)是可以使用  




②查询表中记录数
select count(*) from emp;




③查询表中有列值(佣金)的人数
select count(列值) from emp;




④查询表中条件的人数
select count(*) from emp where sal>25000;




⑤查询列值之和大于值的人数
select count(*) from emp where 列1+列2>2500;






⑥查询两个列的人数


select count(列1),count(列2) form emp;




⑦当需要纵向求和的时候使用sum()函数


select sum(列名) from emp;




两个列分别求和


select sum(列1),sum(列2)from emp;




两个加起来求和


select sum(列1+列2)from emp;




⑧统计所有员工的平均工资
select avg(sal) from emp;






⑨查找最大的和最小的
select max(列1) ,min(列2) from emp;




7.分组查询-----------------------------------------------------------group by 分组依据 只能在同一张表内;


①查询每个部门的部门编号(在同一张表内)和每个部门的工资和(在不同的表内)
select 部门,sum(工资) from 员工表 group by 部门;




②查询每个部门的部门编号以及每个部门的人数;
select 部门,count(*) from 员工表 group by 部门表;




③查询每个部门的部门编号和每个部门工资大于1500的人数;
select 部门,count(*) from 员工表 where 工资列>1500 group by 部门表;






8.having 子句;


①查询工资和大于9000的部门编号和工资之和;
select deptno,sum(工资) from 员工表 group by部门表 having sum(工资)>9000;




9.limit 方言


用来限定查询结果的起始行,以及总行数;


① 查询5行记录,其实行从0开始
select * from 表名 limit 0,5;


②分页查询


一页记录为10条,看第三页
第一页起始页0,查10行
第二页10,查10行
第三页20,查10行 


                                                                                                   约束和多表查询



删除外键约束: alter table 表名 drop foreign key 外键名;


1.单表约束
   主键约束: primary key (唯一非空)
   唯一约束: unique ------------------------不能有两个一样的
   非空约束:not null


2. auto_increment. 自动增长




3.修改表时删除主键自增长:Sid为主键
ALTER TABLE stu CHANGE sid sid INT;




4.实体的关系总结三种关系:


  一对多: 一个客户多个订单
  多对多: 学生和课程,多个学生一门课,一个学生多们课;
  一对一: 公司和地址




  一对多的建表原则:
   在多的一方创建一个字段,这个字段作为外键指向一的一方的主键.


   多对多的建表原则:
   借助第三张表,第三张表中至少需要两个字段分别作为两个外键分别指向两张表的主键
   
   一对一:
   唯一外键对应:在一对多的基础上对外键加上唯一约束
   主键对应:




5.外键约束就是约束这一列的值必须是另一张表的主键值,
就是约束部门表的id只能在员工编号中取值


   1.部门表内写
    constraint 这一列的名字 foreign key(部门表的id) references 员工表(员工ID);


   2.不在表内写
   alter table 部门表 add constraint 这一列的名字 foreign key(部门表的ID) 
   references 员工表(员工表id);


    alter table 部门表 add foreign key(部门表的ID) 
    references 员工表(员工表id);


   3.删除外键约束
   alter table 部门表 drop foreign key 外键约束中的这一列的名字




6.多表查询:
  1.交叉连接 "一般不用" 获得的是两个表的笛卡尔积. 


  2.内连接:    inner  join   -- inner可以省略


     1.显示内连接: select * from A inner join B on 条件;
     2.隐式内连接: select * from A,B where 条件;






  3.外连接  outer join   -- outer可以省略


     1.左外连接: left outer join  以左边为基准查的,可以查到左边全部信息
        select * from A left outer join B on 条件


     2.右外连接: right outer join 
        select * from A right outer join B on 条件




  4.自然连接
   natural join是对两张表中字段名和数据类型都相同的字段进行等值连接,并返回符合条件的结果 。
   
   使用自然连接要注意,两个表同名的列不能超过1个。






7.子查询: 一个SQL语句查询的过程依赖与另一个SQL查询语句,可以select嵌套  
SELECT c.cname,COUNT(*) FROM customer c,orders o WHERE c.cid = o.cid GROUP BY c.cname;




8.子查询返回单值时可以用比较运算符,而使用ANY或ALL谓词时则必须同时使用比较
运算符,其语义为:
>ANY   大于子查询结果的某个值
>ALL   大于子查询结果中的所有值
<ANY   小于子查询结果中的某个值
<ALL   小于子查询结果中的所有值
>=ANY   大于等于子查询结果中的某个值
>=ALL   大于等于子查询结果中的所有值
<=ANY   小于等于子查询结果中的某个值
<=ALL   小于等于子查询结果中的所有值
=ANY   等于子查询结果中的某个值
=ALL   等于子查询结果中的所有值(通常没有实际意义)
!=(或<>)ANY  不等于子查询结果中的某个值
!=(或<>)ALL  不等于子查询结果中的任何一个值




一张表中查两个类型, 比如员工和领导在一张员工表内


查询员工信息,以及该员工对应的领导信息


9. 内查询
   select * from 员工表 领导编号, 员工表 员工编码 where 员工表.领导编号=员工表.员工编号




natural join:自然连接(不允许带on/using)
     natrual join:全自然连接,对左右2个表相同名字的列进行等值匹配,不可用on,using操作指定,自动删除多余重名列
     natrual left join:左自然连接,保留2个表的列(删除多余重名列),以左表为准,不存在匹配的右表列,值置为NULL
     natrual right join:和左自然连接相反



原创粉丝点击