Mysql学习---基础操作学习2
基本数据类型
Mysql基本数据类型:二进制,数值[整数,小数]、字符串[定长,变长]、 二进制数据、时间和枚举集合
bit[(M)] 二进制位(101001),m表示二进制位的长度(1-64),默认m=1 tinyint[(m)] [unsigned] [zerofill] 小整数,数据类型用于保存一些范围的整数数值范围: 有符号:-128 ~ 127. 无符号:0~ 255 特别的: MySQL中无布尔值,使用tinyint(1)构造。 int[(m)][unsigned][zerofill] num int unsigned 整数,数据类型用于保存一些范围的整数数值范围: 【默认】有符号: -2147483648 ~ 2147483647 无符号: -4294967295~4294967295 特别的:整数类型中的m仅用于显示,对存储范围无限制。例如: int(5),当插入数据2时,select 时数据显示为: 00002 bigint[(m)][unsigned][zerofill] 大整数,数据类型用于保存一些范围的整数数值范围:
数据库操作
创建数据库
REATE DATABASE 数据库名称 DEFAULT CHARSET utf8 COLLATE utf8_general_ci; use 数据库名称;
创建表: 主键,null,默认值, 引擎,默认字符集
[单个主键] create table hhh( id int not null auto_increment primary key, # 设置主键,自增长序列,自增长一个表只能有一个,自增默认不为空 name varchar(12) null, # 可以为空 sex varchar(2) default 'M' # 设置默认值为M )ENGINE=INNODB DEFAULT CHARSET=utf8 # 设置引擎为INNODB,字符为utf8[utf-8报错] [多列作为主键] create table hhh( id int not null auto_increment, # 是主键,所以不能为空,自增长序列,且一个表只能有一个 name varchar(12) not null, # 因为设置了主键,所以不能为空 sex varchar(2) default 'M' # 设置默认值为M primary key(id, name) # 设置主键,2列作为一个索引 )ENGINE=INNODB DEFAULT CHARSET=utf8 # 一般用法:id int auto_increment primary key
修改表
添加列:alter table 表名 add 列名 类型 删除列:alter table 表名 drop column 列名 修改列: alter table 表名 modify column 列名 类型; -- 类型 alter table 表名 change 原列名 新列名 类型; -- 列名,类型 添加主键: alter table 表名 add primary key(列名); 删除主键: alter table 表名 drop primary key; alter table 表名 modify 列名 int, drop primary key; 添加外键: alter table 从表 add constraint 外键名称(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段); 删除外键:alter table 表名 drop foreign key 外键名称 修改默认值:ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000; 删除默认值:ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
SQL语句之基本增删改
增: insert into 表 (列名,列名...) values (值,值,值...) insert into 表 (列名,列名...) values (值,值,值...),(值,值,值...) insert into 表 (列名,列名...) select (列名,列名...) from 表 # 查询一个插入一个 删: delete from 表 delete from 表 where id=1 and name='hhh'; 改: update 表 set name = 'alex' where id>1 查: select * from 表 select * from 表 where id > 1 select nid,name,gender as gg from 表 where id > 1
SQL语句之条件、分页以及排序
条件查询: in not int BETWEEN and < > != = select * from user where id > 1 and name = 'hhh' select * from t_user where 1 < id < 3 select * from t_user where id BETWEEN 1 and 3 select * from user where name in ('hhh', 'xupt', 'world') select * from user where name not in ('hhh', 'xupt', 'world') select * from user where id in (select id from teacher) 通配符: 2种 select * from user where name like 'hh_' #--匹配一个字符 select * from user where name like '%hh%' #--匹配多个字符 分页: 3种 select * from user limit 5 #查询5个数据 select * from user limit 5 offset 2 #从第二行开始往后取出5个数字[不包含第二个] select * from user limit 2,5 #从第二个数字开始往后取出5个数[不包含第二个] 升序/降序 select id from user order by id desc #利用order by实现 降序 select id from user order by id asc #利用order by实现 升序 select * from user order by id desc, age asc #先利用id实现降序,如果内容相同则利用age实现升序 select id, name from user GROUP BY id #group by分页的时候关键字必须是前面查询的字段 select * from user GROUP BY id DESC 分组: group by 必须在where之后,order by之前;使用having配合实现where语句功能 select id from user group by id select * from t_user GROUP BY sex; # 用*来查找全部,5.6默认取出第一个值 5.7之后会报错 select * from t_user; select id, username from t_user GROUP BY sex; select id, username from t_user GROUP BY ; select num from 表 group by num having max(id) > 10; select id, count(sex) from user group by sex having count(sex) > 10 # 使用having来进行group之后的分组 聚合函数: sum(), min(), max(), count()等 对聚合函数进行分组筛选的时候用having select max(id), min(id) from user 联合: union去重排序 union all 不排序不去重 select * from user union select * from teacher select * from user union all select * from teacher 去重复:distinct, groupBy select student_id from score where num < 60 group by student_id; select DISTINCT student_id FROM score where num < 60; 多表联查: 4中select A,B inner join, left join, right join select * from user,hhh; # 笛卡尔 ret = A * B user表中的每条数据对应hhh里面的所有数据 select * from user,hhh where user.id = hhh.id; # 连表操作,选出需要的结果 select a.id, a.name, b.salary from user a, hhh b where a.id = b.id # AB交集,无重合结果则不显示;有则显示id相同的部分 select a.id, a.name, b.salary from user a inner join hhh b where a.id = b.id # AB取全部列,无对应则不显示, 永远不会出现Null # Inner Join 实际上是对Left Join的排空操作,如果有Null,Inner Join则自动清除这条记录 select a.id, a.name, b.salary from user a left join hhh b where a.id = b.id # A取全部列,如果B中无对应关系,则值为null select a.id, a.name, b.salary from user a right join hhh b where a.id = b.id # B取全部列,如果A中无对应关系,则值为null
细节学习--自增:
自增,如果为某列设置自增列,插入数据时无需设置此列,默认将自增
show session variables like 'auto_inc%'; set session auto_increment_increment=2; set session auto_increment_offset=10;
show global variables like 'auto_inc%'; set global auto_increment_increment=2; set global auto_increment_offset=10;
自增注意:
1、对于自增列,必须是数字而且必须是索引(含主键)
2、对于自增可以设置步长和起始值3、一个表只能有一个主键,且主键不能重复,不能为null,一般自增列
4、使用delete清除数据后,自增长还是从原来的位置开始自增;
使用truncate清除数据后,自增长恢复到0,从1开始计算
细节学习--唯一索引
可以为null,一张表可以有多个唯一列
是一种约束,但作为索引加快了查找速度
细节学习--主键
主键唯一且不能重复,
一张表只有一个主键且不能为null(可以多列组成主键)一般设自增为主键主键是特殊的索引[1.是一种约束 2.主键是特殊的索引,加快查找速度]
细节学习--外键:一个特殊的索引[加快查找速度],只能是指定内容
1.创建时候添加
2. alter修改添加外键
数据库备份:在外部执行,非Mysql终端内
导出现有数据库数据: mysqldump -u用户名 -p密码 数据库名称 >导出文件路径 # 结构+数据 mysqldump -u用户名 -p密码 -d 数据库名称 >导出文件路径 # 结构 导入现有数据库数据: mysqldump -uroot -p密码 数据库名称 < 文件路径
备份所有
Mysql的分页操作
原理:根据上次查找的最后一个id值作为下一个where语句的条件,然后进行limit查找 select * from student LIMIT 3, 3; select * from student where sid > 10 LIMIT 3; # 跳过前面10条数据,分页取出3条 例如: select * from tb1 where nid < (select nid from (select nid from tb1 where nid < 当前页最小值 order by nid desc limit 每页数据 *【页码 - 当前页】) A order by A.nid asc limit 1) order by nid desc limit 10;
小Demo
创建表的时候创建外键
create table userinfo( id int not null auto_increment primary key, name varchar(12), dept_id int, FOREIGN key userinfo(dept_id) REFERENCES dept(id) )ENGINE=INNODB default charset=utf8 create table dept( id int not null auto_increment primary key, name varchar(12) )ENGINE=INNODB default charset=utf8 INSERT INTO userinfo(name, dept_id) VALUES('hhh', 1) INSERT INTO userinfo(name, dept_id) VALUES('ftl', 2) INSERT INTO userinfo(name, dept_id) VALUES('xupt', 2) # INSERT INTO userinfo(name, dept_id) VALUE ('peking', 100) # (`test`.`userinfo`, CONSTRAINT `FK_u_d` FOREIGN KEY (`dept_id`) REFERENCES `dept` (`id`)) insert INTO dept(name) values('工具部') insert INTO dept(name) values('研发部')
修改表添加外键
#添加外键 ALTER table userinfo add CONSTRAINT FK_u_d FOREIGN key userinfo(dept_id) REFERENCES dept(id)
创建表[增删改查]
1 CREATE TABLE female_teachers 2 ( 3 tid number(5) not null, 4 tname varchar2(11), 5 title char(2) 6 ); 7 8 CREATE TABLE T_SCHOOL 9 ( 10 sid VARCHAR(10), 11 hid VARCHAR(10), 12 sname VARCHAR(10) 13 ); 14 15 16 CREATE TABLE T_HEADER 17 ( 18 hid VARCHAR(10), 19 hname VARCHAR(10) 20 ); 21 22 23 CREATE TABLE T_BANJI 24 ( 25 bid VARCHAR(10), 26 room VARCHAR(10) 27 ); 28 29 30 CREATE TABLE T_STUDENT 31 ( 32 sid VARCHAR(10), 33 bid VARCHAR(10), 34 sname VARCHAR(10) 35 ); 36 37 38 CREATE TABLE emp 39 ( 40 empno number(5) not null, 41 ename VARCHAR(10), 42 job VARCHAR(9), 43 hiredate DATE, 44 sal number(5) 45 ); 46 47 48 INSERT INTO emp (empno,ename,job,hiredate,sal) VALUES (6060,'李兴华','经理',sysdate,2000.30) ; 49 INSERT INTO emp (empno,ename,job,hiredate,sal) VALUES (7369,'董鸣楠','销售',sysdate,1500.90) ; 50 INSERT INTO emp (empno,ename,job,hiredate,sal) VALUES (8964,'李祺','分析员',sysdate,3000) ; 51 INSERT INTO emp (empno,ename,job,hiredate,sal) VALUES (7698,'张惠','销售',sysdate,800) ; 52 INSERT INTO emp (empno,ename,job,hiredate,sal) VALUES (7782,'杨军','分析员',sysdate,2500) ; 53 INSERT INTO emp (empno,ename,job,hiredate,sal) VALUES (7762,'刘明','销售',sysdate,1000) ; 54 INSERT INTO emp (empno,ename,job,hiredate,sal) VALUES (7839,'王月','经理',sysdate,2500) ; 55 56 57 58 CREATE TABLE teachers 59 ( 60 tid number(5) not null, 61 tname varchar2(11), 62 sex char(2), 63 score number(5) 64 ); 65 66 67 68 69 70 71 72 73 insert into teachers(tid,tname,sex,score) values(2,'wer','M',101); 74 insert into teachers(tid,tname,sex,score) values(3,'qw','W',103); 75 insert into teachers(tid,tname,sex,score) values(4,'yuw','W',104); 76 insert into teachers(tid,tname,sex,score) values(5,'table','M',105); 77 insert into teachers(tid,tname,sex,score) values(6,'jkh','W',203); 78 insert into teachers(tid,tname,sex,score) values(7,'tr','W',204); 79 80 81 create table student 82 ( 83 sno char(7) primary key, 84 sname varchar2(9), 85 sex char(2), 86 age int, 87 dept varchar2(8) 88 ) 89 90 91 92 declare 93 cursor tea is 94 select * from teachers; 95 begin 96 for i in tea 97 loop 98 if i.sex='M' then 99 insert into male_teachers values(i.tid, i.tname,i.sex) ; 100 else 101 insert into female_teachers values(i.tid,i.tname,i.sex); 102 end if; 103 end loop; 104 end ; 105 / 106 107 108 109 SQL> 110 set serveroutput on; 111 create or replace procedure tea_count 112 (in_sex in Teachers.sex%type) 113 as 114 out_num number; 115 begin 116 if in_sex='M' then 117 select count(sex) into out_num from teachers where sex='M'; 118 dbms_output.put_line('Number of Male: ' || out_num); 119 else 120 select count(sex) into out_num from teachers where sex='W'; 121 dbms_output.put_line('Number of FeMale: ' || out_num); 122 end if; 123 end tea_count; 124 / 125 126 create index in_teachers on teachers(tid); select tid from teachers; 127 create view v_teachers as select tid, tname, score from teachers; 128 select * from v_teachers; 129 130 declare 131 create or replace trigger t_teachers 132 before insert or update of tid, tname on teachers; 133 for each row 134 when(new.tname='Jack') 135 begin 136 if sex='M' then 137 insert into male_teachers values(tid,tname, sex); 138 else 139 insert into female_teachers values(tid, tname, sex); 140 end if; 141 end t_teachers; 142 / 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 //外键的设置需要父表中设置主键或者unique约束,父表中没有的数据子表不能插入数据 163 164 165 alter table null_emp add constraint nullemp_fk foreign key(sno) references dep on delete casc 166 ade; 167 存储过程是流控制和SQL语句书写过程,经过便宜存储后在数据库服务器,调用即可。 168 触发器是一种特殊的存储过程 169 视图还有一个好处就是重命名 170 角色(集合了多种权限)是相关权限的命名集合,简化用户权限的管理。 171 create view v_stu(学号,姓名,性别,年龄) 172 as 173 select sno,sname,sex,age from sys.student; 174 175 create public synonym stu for student; 创建同义词
创建表[含外键]
1 create table customers ( 2 customersId int identity(1,1) primary key , 3 cname varchar(8) not null , 4 address varchar(50) , 5 city varchar(10) , 6 tel varchar(10) unique , 7 company varchar(50) , 8 birthday datetime , 9 type tinyint default 1 10 ); 11 12 13 14 create table goods ( 15 goodsid int constraint c1 primary key , 16 goodsname varchar(20) not null , 17 price money , 18 description varchar(200) , 19 storage int , 20 provider varchar(50) , 21 status tinyint default(0) 22 ); 23 24 25 create table orders ( 26 orderid int identity(1,1) constraint c2 primary key , 27 goodsid int not null references goods(goodsid) on delete cascade , 28 customerid int not null foreign key(customerid) 29 references customers (customersId) on delete no action , 30 quantity int not null constraint c3 check(quantity >0) , 31 ordersum money not null , 32 orderdate datetime default(getdate()) 33 34 ) ;
作者:小a玖拾柒
-------------------------------------------
个性签名: 所有的事情到最後都是好的,如果不好,那說明事情還沒有到最後~
本文版权归作者【小a玖拾柒】和【博客园】共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利!