一、数据库基本概念
数据库:信息存储的仓库,包括一系列的关系措施!
表:一个数据库中可以有若干张表(形式上你可以看出我们日常生活中建立的表)
字段:表里面的信息会分若干个栏目来存,这些栏目,我们在数据库技术中叫"字段",栏目里面存的具体信息叫"字段值"
记录:一条信息我们叫一条记录
一个数据库管理系统中可以建立若干个数据库,每个数据库中又可以建立若干张表,每张表中可以有若干条记录
二、MySQL支持的数据类型
数值类型、日期类型、字符串类型
1.数值类型
1)整数类型
tinyint、smallint、mediumint、int和bigint
2)zerofill属性
配合int(数字)来用,表示显示的时候一个显示宽度
3)主键
主键可以唯一标识某条记录的一个字段或者多个字段
create table 表名(字段名称 类型 primary key,...);
create table 表名(字段名称1 类型,...,primary key(字段名称1));
删除:
alter table 表名 drop primary_key;
注意:如果字段具有auto_increment属性必须先删除auto_increment属性
4)小数的表示
①浮点数
单精度(float):单精度的浮点数精确到大约7位小数位(整数部分加上小数部分的位数)
双精度(double):双精度的浮点数精确到大约15位小数位(整数部分加上小数部分的位数)
②定点数
decimal(7,2)
2.日期类型
DATETIME是常用的日期类型
create table t1(dt datetime);
insert into t1 values(now());
3.字符串类型
CHAR(M) M为0~255之间的整数,表示可以存M个字符(不管中文还是英文字符总共个数是M个)
VARCHAR(M) M为0~65535之间的整数,表示可以存M个字符,具体M最大多大和字符集有密切关系
注意varchar列的最大的存储空间是65,532字节,如果是英文字符集(一个英文字符占1个字节)就是可以放65532个英文字符
自己在实际开发的过程中M设置的值,应该从自己的实际需要去考虑,而不是最大能存多少个字符,因为超过最大能设定的字符数会自动报错或者警告!
TINYTEXT 允许长度0~255字符
TEXT 允许长度0~65535字符
MEDIUMTEXT 允许长度0~167772150字符
LONGTEXT 允许长度0~42949667295字符
注意点:
char与varchar列的区别
char类型的字符所占的存储空间是固定的,不管你用的时候存了几个字符,它所占的空间都是你当初设定的字符空间
比如char(255) 哪怕你存的只是1个a,那么它也是占255个字符长度的空间!
varchar列所占的存储空间是可变的,根据存入的字符长度来确定实际占多少的空间!
varchar(255) 实际所占的空间就是实际字符的长度+1个字节!
varchar(超过255) 实际所占的空间就是实际字符的长度+2个字节!
更节省空间!
在检索时,char列删除尾部的空格,而varchar则保留这些空格。
选择:由于char是固定长度,所以它的处理速度比varchar快,但是缺点是浪费存储空间。所以对于那些长度变化不大的数据可以选择此列
enum类型
create table t1(flag enum('a','b','c','d'));
insert into t1 values('a'),('a'),('f');
set类型
里面可以包含0~64个成员
create table t1(flag set('a','b','c','d'));
insert into t1 values('a,b'),('a,d,a');
三、(My)SQL使用入门
1.SQL分类
1)DDL(Data Definition Languages)语句
数据定义语句,通过这类语言可以对 数据库进行创建删除更改
2)DML(Data Manipulation Language)语句
数据操纵语句,用于添加、删除、更新和查询数据库记录并检查数据完整性
3)DCL(Data Control Language)语句
数据控制语句,通过此类语句可以对数据库的相关权限进行设置
2.DDL语句
对数据库内部的对象进行创建、删除、修改等操作的语言,DDL语句更多的是由数据库管理员(DBA)使用,开发人员一般很少使用
登录mysql之后就可以使用sql语句对数据库进行各种操作
show databases; 查看数据库列表
1)创建数据库
1>create database 数据库名;
2>选择要操作的数据库:USE 数据库;对于要操作的数据库我们需要使用use来选择一下!
3>查看数据库中所有的数据表show tables;
2)删除数据库
drop database 数据库名称;
3)创建表
1>create table 表名(
字段1名 字段1类型 列的约束条件,
字段2名 字段2类型 列的约束条件,
...
)
2>创建完表之后可以查看表的定义
desc 表名;
3>查看创建表的SQL语句
show create table 表名 \G
\G选项使得记录能够按照字段竖向排列,以便更好地显示内容较长的记录,\G后面无需再加分号
4)删除表
drop table 表名;
5)修改表
1>修改表的字段类型
alter table 表名 modify [column] 字段定义 [first|after 字段名];
2>增加表字段
alter table 表名 add [column] 字段定义 [first|after 字段名];
3>删除表字段
alter table 表名 drop [column] 字段名;
4>字段改名
alter table 表名 change [column] 旧的字段名 字段定义 [first|after 字段名];
注:change与modify都可以修改表的定义,不同的是change后面需要接两次列名,不方便,但是优点是change可以修改字段名称
5>修改字段排列排序
前面介绍的字段增加和修改语法(add/change/modify)中,都有一个可选项first|after 字段名,这个选择可以用来修改
字段在表中的位置新增的字段默认是加载在表中最后位置,而change/modify 默认都不会改变字段的位置
alter table t1 modify id2 tinyint first;
alter table t1 modify id2 tinyint after id1;
注意:change/first|after 字段名 这些关键字都是属于MySQL在标准SQL上的扩展,在其他的数据库上不一定适用
6>更改表名
alter table 表名 rename [to] 新的表名;
3.DML语句
查询 select * from 表名;
1)插入记录
1>插入记录
insert into 表名(字段1,字段2,字段3,...,字段n) values(值1,值2,值3,...,值n);
也可以不用指定字段名,但是values后面的顺序应该和字段的排序一致
2>一次插入多条记录
insert into 表名(字段1,字段2,字段3,...,字段n)
values
(值1,值2,值3,...,值n),
(值1,值2,值3,...,值n),
(值1,值2,值3,...,值n),
;
2)更新记录
1>更新一个表
update 表名 set 字段1=值1,字段2=值2,...,字段n=值n[where 条件];
2>更新多个表中数据
update 表1,表2,...,表n set 表1.字段1=表达式1,表n.字段n=表达式n[where 条件];
注:多表更新更多的用在根据一个表的字段来动态的更新另外一个表的字段
简单实例:
update t1,t2 set t1.age=2000,t2.age=3000 where t1.id=1 and t2.id=1;
3)删除记录
1>删除单表中的数据
delete from 表名 [where 条件];
2>删除多个表中的数据
delete 表1,表2,...表n from 表1,表2,...表n [where 条件];
不管是单表还是多表,不加where条件将会把表中的所有记录删除,所以操作时一定要小心。
4)查询记录
select 字段名|* from 表名;
1>查询不重复的记录
SELECT distinct field1,field2 FROM 表名;
只要field1,field2任何一个字段有不同就会被选择!
一般使用distinct,只筛选一个字段!
2>条件查询
注:条件字段比较符号:
=,<,>,>=,<=,!=等比较运算符
多个条件之间可以使用or and等
where后面接条件
select * from 表名 where 条件
3>排序和限制
排序:
asc:由低到高
select * from employee order by salary asc;
desc:由高到低
select * from employee order by salary desc;
多个字段排序
select * from employee order by salary desc,id desc;
限制:
在语句的最后面加上limit 数字1,数字2来进行查询数量的限制。
limit 数字1,数字2 数字1代表从第几条记录开始取(从0开始的),数字2代表取几条!
4>聚合
①sum求和
select sum(字段名) from 表名;
②count记录总数
select count(*|字段名) from 表名;
③max最大值
select max(字段名) from 表名;
④min最小值
select min(字段名) from 表名;
⑤GROUP BY分类聚合
select department,sum(salary) from employee group by department;
⑥WITH ROLLUP
select sum(salary) from employee group by department with rollup;
⑦HAVING
注意:having和where的区别在于,having是对聚合后的结果进行条件过滤,而where是在聚合前就对记录进行过滤,
应该尽可能的对记录进行先过滤!
select sum(salary) from employee group by department having sum(salary)>1000;
在一起使用:select sum(id),max(id),min(id),count(*) from a1;
5>表连接
需求:显示多个表中的字段的时候即可使用表连接
连接分类
内连接:选取两张表中相互匹配的记录
外连接:不仅仅选取两张相互匹配的记录,并且会选出其他不匹配的记录
举例:
内连接:select 表,字段,... from 表1名,表2名,... where [匹配的条件比如 表1.字段=表2.字段];
select 语句可以给字段起别名!直接写在需要查询显示的字段的后面就可以
外连接
1)左连接
概念:包含左边表中的所有记录(包括右表中没有和它匹配的记录)
select ename,deptname from emp left join dept on emp.deptno=dept.deptno;
2)右连接
概念:包含右边表中的所有记录(包括左表中没有和它匹配的记录)
左连接和右连接是可以相互转换的!
6>子查询
需求:一个查询需要另外一个查询的结果参与的时候
用于子查询的关键字:
in
语法:select * from employee where id in(select eid from employee_late);
in 在...里面
注意点 in后面的子语句必须只返回一个字段
若查询结果唯一(只有一条)可以使用=代替in
not in
于上面相反
exists
语法:select语句 where exists(select 语句);
exists:后面子语句有没有查询出记录来,如果查询出记录来返回true,否则就是false
并且查询出来的记录的具体的值是NULL也没有关系,也是返回true.
not exists
与exists相反
1)select * from emp where deptno in(select deptno from dept);
2)若查询结果唯一可以使用=代替in
select * from emp where deptno=(select deptno from dept limit 1);
7>记录联合
我们常常会碰到需要将两个表或者多个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示这时就需要用到记录联合
多个select语句用
UNION或者UNION ALL隔开即可实现
区别:前者 会将多个查询结果合并后并且进行去除重复后返回
后者 则直接合并并不去除重复
联合的条件:查询的列个数要相等
四、MySQL中的常见运算符
MySQL提供了一些运算符号供我们在SQL语句中使用,比如我们需要对SQL语句中的某个值,或者某个字段做运算操作的时候,就可以使用这些运算符
五、常用函数
函数用于SQL语句中
1.字符串函数
CONCAT(SQ,S2,...,Sn) 连接S1,S2,...Sn为一个字符串
INSERT(str,x,y,instr) 将字符串str从第x位置开始,y个字符长的字符串换位字符串instr
LOWER(str) 将字符串str中所有字符变为小写
UPPER(str) 将字符串str中所有字符变为大写
LEFT(str,x) 返回字符串str最左边的x个字符
RIGHT(str,x) 返回字符串str最右边的x个字符
LPAD(str,n,pad) 用字符串pad对str最左边进行填充,直到长度为n个字符长度
RPAD(str,n,pad) 用字符串pad对str最右边进行填充,直到长度为n个字符长度
LTRIM(str) 去掉字符串str左侧的空格
RTRIM(str) 去掉字符串str右侧的空格
REPEAT(str,x) 返回str重复x次的结果
REPLACE(str,a,b) 用字符串b替换字符串str中所有出现的字符串a
STRCMP(s1,s2) 比较字符串s1和s2
TRIM(str) 去掉字符串行尾和行头的空格
SUBSTRING(str,x,y) 返回从字符串str x位置起y个字符长度的字符串
LENGTH(str) 返回字符串长度
2.数值函数
ABS(x) 返回x的绝对值
CEIL(x) 返回大于x的最小整数值
FLOOR(x) 返回小于x的最大整数值
MOD(x,y) 返回x/y的模
RAND() 返回0-1内的随机值
ROUND(x,y) 返回参数x的四舍五入的有y位小数的值
TRUNCATE(x,y) 返回数字x截断为y位小数的结果
3.日期和时间函数
CURDATE() 返回当前日期
CURTIME() 返回当前时间
NOW() 返回当前的日期和时间
UNIX_TIMESTAMP(date) 返回日期date的UNIX时间戳
FROM_UNIXTIME() 返回UNIX时间戳的日期值
WEEK(date) 返回日期date为一年中的第几周
YEAR(date) 返回日期date的年份
HOUR(time) 返回time的小时值
MINUTE(time) 返回time的分钟值
MONTHNAME(date) 返回date的月份名
DATE_FORMAT(date,fmt) 返回按字符串fmt格式化日期date值
DATE_ADD(add,INTERVAL expr type) 返回一个日期或时间值加上一个时间间隔的时间值
DATEDIFF(expr,expr2) 返回起始时间expr和结束时间expr2之间的天数
4.流程函数
1)IF(value,t,f) 如果value是真,返回t,否则返回f
select if(field1>1000,'高薪','低薪');
2)IFNULL(value1,value2) 如果value1不为null,返回value1,否则value1该是什么还是什么
select ifnull(name,'无名');
3)CASE WHEN [value] THEN [result]...ELSE[default]END 如果value1是真,返回result1,否则返回default
select case when 100>10 then '真' else '假' end;
和if语句比较像
4)CASE [expr] WHEN [value1] THEN[result]...ELSE[default]END 如果expr等于value1,返回result1,否则返回default
select case 1 when 1 then '一' when 2 then '二' when 3 then '三' else '未知数字'end;
和switch语句比较像
5.其他常用函数
DATABASE() 返回当前数据库名
VERSION() 返回当前数据库版本
USER() 返回当前登录用户名
INET_ATON(IP) 返回IP地址的数字表示
INET_NTOA(num) 返回数字代表的IP地址
PASSWORD(str) 返回字符串str的加密版本
MD5() 返回字符串str的MD5值
知识补充:数据库字符编码
一、MySQL支持的字符集
1.查看所有可用的字符集
show character set;
或者查看information_schema.character_sets,也可以显示所有的字符集和该字符集默认的校对规则
2.MySQL的字符集包括字符集(character)和校对规则(collation)两个概念。
1)字符集用来定义MySQL存储字符串的方式
2)校对规则用来定义 字符串比较的方式
3)字符集和校对规则是一对多的关系,一个字符集有多个校对规则供你选择!
校对规则命名约定:它们以相关的字符集名开始,通常包括一个语言名,并且以
_ci(忽略大小写)、
_cs(大小写敏感)或者
_bin(二元,即比较是基于字符编码的值而与language无关)结束。
查看字符集的校对规则:
show collation like '字符集前缀%';
二、MySQL内部的字符集和校对规则设置
1.服务器字符集和校对规则设置
2.数据库字符集和校对规则设置
CREATE DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
查看当前数据库的字符集和校对规则:
show variables like 'character_set_database';
show variables like 'collation_database';
ALTER DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
3.表字符集和校对规则设置
CREATE TABLE tb1_name (column_list)
[DEFAULT CHARACTER SET charset_name [COLLATE collation_name]]
ALTER TABLE tb1_name
[DEFAULT CHARACTER SET charset_name] [COLLATE collation_name]
4.字段(列)字符集和校对规则
遇到这种情况概率比较小,这只是MySQL提供给我们一个灵活设置的手段
三、MySQL连接字符集设置
过程中要设置正确,诚实守信,这样如果全部设置正常,服务器端会自动的去按照你设置的字符集转换,但是也要避免想转换的过程,最好都设置成一样的编码!
连接字符集设置:客户端和服务器之间交互的字符集
对于客户端和服务器端的交互操作,MySQL提供了3个不同的参数:
1)character_set_client:客户端来源数据使用的字符集
2)character_set_connection:连接层字符集
3)character_set_results:返回结果字符集
知识拓展:数据在客户端和服务器之间交互的过程中字符集转换的大概过程
1)MySQL Server收到请求时将请求数据从character_set_connection:
2)进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,内部操作字符集的确定方法如下:
1>使用每个数据字段设定的字符集
2>若上述值不存在,则使用对应数据表设定的字符集:
3>若上述值不存在,则使用对应数据库设定的字符集:
4>若上述值不存在,则使用服务器设定的字符集。
3)将操作结果从内部操作字符集转换为character_set_results.
这3个参数设定的字符集应该相同,并且客户端使用的字符集确实是参数character_set_client的值,才可以确保用户的数据可以正确的返回且输出。
查看当前设置:show variables like 'character_set%';
修改:
set name 字符集,可以同时修改3个参数的值,对本次有效
也可以在配置文件中设置:
[mysql]
default-character-set=字符集
修改CMD命令行字符集:
chcp 65001 #换成utf-8代码页(设置为utf-8之后最好手动修改显示字体)
chcp 936 #换成默认的gbk
客户端使用字符,连接层使用的字符集,内部使用的字符集,返回使用的字符集,最好都设置成一样的,并且客户端使用的字符集确实是character_set_client参数的值,这样就绝对不会出现问题!