MySQL基础
一、数据库概念
1,网友装备信息、论坛帖子信息、QQ好友关系信息、学籍管理系统中的学生信息等都要“持久化”的保存到一个地方, 如果通过IO写到文件中,那么会非常麻烦,而且不利于多人共享数据 2,我们开发大部分软件、网站都要大量用到书库,甚至开发游戏、手机App也要用到数据库,公司面试的时候数据库的考核在三分之一以上 3,数据库(DataBase)是保存数据的仓库,可以方便的把数据放进去,并且把数据根据各种需要取出来。 数据库管理系统(Database Management SYSTEM,DBMS)是对数据库进行管理(增删改查等)的软件, 常用的DBMS有MYSQL、Oracle、DB2、MSSQLServer等。 MYSQL是开源、免费的,因此应用最广泛 4,不同的DBMS用法大同小异,掌握了一个也就基本等于掌握了其他DBMS二、数据库、表、列1,Table(表):存放数据的“书架的格子”
2,两种叫法:列(column)/字段(Field)三、MYSQL环境安装1,下载
http://www.mysql.com/downloads/ MySQL Enterprise Edition (commercial)、MySQL Cluster CGE (commercial)都是收费版;MySQL Community Edition 是开源免费版。2,添加系统服务
以管理员身份运行命令行,cd到mysql的bin文件夹,执行“mysqlld -install”卸载服务:mysql -remove
四、MYSQL管理工具 1,MYSQL管理工具用于对DBMS进行数据库创建、表创建等管理。开发人员必装。管理工具不是DBMS,DBMS不可少2,管理工具有很多:Navicat、Workbench(官方)、phpMyAdmin、SQLyog、MySQL-Front,用法大同小异。
NaviCat lite是免费版,功能学习够用了。3,安装后在开始菜单的“PremiumSoft”中。
主菜单“文件”→“新建连接”→“MYSQL”,“连接名”随意,“主机名或IP地址”填MYSQLServer的IP地址或者主机名,装在本机填127.0.0.1(本地回环地址),用户名密码都是root(生产环境中密码要改的复杂一点)。
4,如果连接不报错,说明MYSQLServer和管理工具都安装没有问题
五、主键(PrimaryKey) 1,主键就是数据行的唯一标识。不会重复的列才能当主键。一个表可以没有主键,但是会非常难以处理, 因此没有特殊理由表都要设定主键 2,主键有两种选用策略: 业务主键和逻辑主键业务主键就是使用有业务意义的字段做主键,比如身份证号、银行账号等
逻辑主键是使用没有任务业务意义的字段做主键,完全是给程序看的,业务人员不会看的数据。
因为很难保证业务主键不会重复(身份证号重复)、不会变化(账号升位),因此推荐用逻辑主键六、表间关联、外键(ForeignKey) 1,一张表中的一个字段是指向了另一张表的主键,这样就将两张表的信息连接在一起了2,可以多张表“串联”,也可以“多对多”的在两张表之间存在一张关系表
七、建库建表1,根节点点右键,新建数据库,数据库名字取得有意义,比如“study1”,字符集建议用UTF-8。
2,在study1下的“表”节点下右键“新建表”,“栏位”其实指的就是列。Id(主键,潜规则的名称,int、不允许为空、点右键“主键”)
Name(nvarchar,长度为10,不允许为空) Gender(bit,不允许为空) 保存为“T_Persons” 3,建表常见错误:列名/表名不要用可能的关键字,不要有空格(包括前后)、不要有特殊字符
4,MYSQL的存储引擎有很多,最常用的是InnoDB和MyISAM,MyISAM效率较高,但是不支持事务、外键约束等特性,
因此一般建议用InnoDB,新版本默认也是InnoDB。 怎么设:建表时“选项”→“引擎”。建好了如何看引擎:表上点右键“对象信息”。5,常用的数据类型
文本: CHAR(*):最多255个字节的定长字符串,它的长度必须在创建时指定 VARCHAR(*):最多255个字节的可变长度字符串,它的长度必须在创建时指定 TEXT:最大长度为64K字符的变长文本 TINYTEXT:最大长度为255字符的变长文本 MEDUIMTEXT:最大长度为16K字符的变长文本 LONGTEXT:最大长度为4GB字符的变长文本
整数:(考虑数据取值后选择尽可能小的类型)
tinyint:1字节。有符号值:-128 到127;无符号值:0到255 smallint:1字节。有符号值:-32768 到32767;无符号值:0到65535 mediumint:3字节。 int:4字节 bigint:8字节
小数:(需要指定长度和小数点,也就是显示宽度和小数位数):
decimal:精确存储的小数,在内部用字符串存储,适合金额等要求精确的类型。别名:NUMERIC float:4字节,单精度。会近似存储(*),效率比decimal高。 double:8字节,双精度。会近似存储(*),效率比decimal高。 日期时间: DATE:4字节。范围:1000-01-01——9999-12-31 TIME:3字节。范围:-838:59:59——838:59:59 DATETIME:8字节。范围:1000-01-01 00:00:00——9999-12-31 23:59:59 二进制大数据: TITYBLOB:最大长度为255字节 BLOB:最大长度为64KB MEDIUMBLOB:最大长度为16MB LONGBLOB:最大长度为4GB 八、SQL语句入门1,不能总是用鼠标点来点去手动管理数据,要能够通过语言和数据库自动交流,SQL语句就是和数据库“交谈”专用的语句
2,SQL语句中字符串一般用单引号 3,SQL语句是大小写不敏感的 4,NavCat中找到执行SQL语句的地方“查询”——“新建查询”,编写SQL后点击“运行”执行SQL语句 5,最简单的SQL:查看一个表的全部数据:select * from T_Persons
6,Insert 简单的插入数据的SQL语句: insert into T_Persons (Id,Name,Age,Gender) values(5,'jim',20,1) Insert语句可以省略表名后的列名,但是强烈不推荐 如果插入的行中有些字段的值不确定,那么Insert的时候不指定那些列即可。“不允许为空”的列在插入的时候不能省略 自动递增/自增(Auto Increment):字段自增可以避免并发等问题,不要程序员代码控制自增。用自增字段在Insert的时候不用指定值。 7,修改表结构的方法:点“设计表” 1,把“允许为空”的字段修改为“不允许为空”,需要先给旧数据默认值(用Update语句), 如果之前是测试数据无所谓,可以把旧数据都删除(增加Height字段) 2,修改列的数据类型要注意旧数据能否兼容转换为新类型;修改数据的长度的时候也是如此 8,数据更新更新一个列:
update T_Persons Set Age=30 更新多个列: update T_Persons s Set Age=30,Name='tom' 表达式:UPDATE T_Persons Set Age=Age+19,条件数据更新
更新一部分数据:
UPDATE T_Persons Set Age=30 where Name='tom',用where语句表示只更新Name是'tom'的行, 注意SQL中等于判断用单个=,而不是==。 Where中还可以使用复杂的逻辑判断UPDATE T_Persons Set Age=30 where Name='tom' or Age<25,or相当于Java中的||where (Age>20 and Age<30) or(Age=80)
Where中可以使用的其他逻辑运算符:or、and、not、<、>、>=、<=、!=(或<>)等
10,数据删除
删除表中全部数据: DELETE from T_Persons 删除表中部分数据 Delete from T_Persons where Age>20 DELETE只是删除数据,表还在, 11,删除表 Drop table T_Persons九、数据检索 1,简单的数据检索:Select * from T_Persons 2,只检索需要的列: SELECT Number FROM T_Employees 、 SELECT Name,Age FROM T_Employees3,列别名
SELECT Number AS 编号,Name AS 姓名,Age AS Age111 FROM T_Employees 写不写AS都行 4,计算列 SELECT Number 编号,Name 姓名,Age Age111,Age+10 十年后的年龄,1+1,now() FROM T_Employees5,使用where检索复合条件的数据:
SELECT Name FROM T_Employees WHERE Salary<5000 6,还可以检索不与任何表关联的数据: select 1+1; select now();十、数据汇总 1,SQL聚合函数: MAX MIN AVG SUM COUNT 2,大于25岁的员工的最高工资 :SELECT MAX(Salary) FROM T_Employees WHERE Age>25
3,最低工资和最高工资:
SELECT MIN(Salary),MAX(Salary) FROM T_Employees
4,大于25岁的员工人数:
SELECT COUNT(*) FROM T_Employees WHERE Age>25
5,全体员工的工资总和平均工资:
SELECT SUM(Salary),AVG (Salary) FROM T_Employees
十一、数据排序
1,Order by子句位于Select语句的末尾,它允许执行按照一个列或者多个列进行排序,还可以指定排序方式是升序(ASC)还是降序(DESC)
2,按照年龄升序排序所有员工信息的列表: SELECT * FROM T_Employees ORDER BY Age ASC3,按照年龄从大到小排序,如果年龄相同则按照工资从大到小排序 :
SELECT * FROM T_Employees ORDER BY Age DESC,Salary DESC4,ORDER BY子句要放到WHERE子句之后 :
SELECT * FROM T_Employees WHERE Age>23 ORDER BY Age DESC,Salary DESC 十二、通配符过滤1,通配符过滤使用like
2,单字符匹配的通配符为半角下划线“_”,它匹配单个出现的字符。 以任意字符开头,剩余部分为“erry”: Select * from T_Employees where Name like '_erry' 3,多字符匹配的通配符为半角百分号“%”,它匹配任意次数(0或者多个)出现的任意字符。 k% 匹配以k开头、任意长度的字符串 检索姓名中包含字母n的员工信息: select * from T_Employees where name like '%n%' 4,like性能较差,很容易造成全表扫描,谨慎使用。 后面会讲数据库优化(索引等),项目中做搜索用全文索引 十三、空值处理1,数据库中,一个列如果没有指定值,那么值就为null,数据库中的null表示“不知道”,而不是表示没有。
因此select null+1结果是null,因为“不知道”加1的结果还是“不知道”2,Select * from T_Employees where name = null;
select * from T_Employees where name!=null; 都没有任何返回结果,因为数据库“也不知道” select name+"a" from T_Employees 3,SQL中使用is null、is not null 来进行空值判断 SELECT * FROM T_Employees WHERE NAME is null ; SELECT * FROM T_Employees WHERE NAME is not null ;十四、limit
limit关键字用来限制返回的结果集,limit放在select语句的最后位置,
语法为:limit 首行行号,要返回的结果集的最大数目 比如下面的SQL语句将返回Name不为空的、按照工资降序排列的从第二行开始(行号从0开始)的最多五条记录 select 8 from T_Employees where Name is not null order by Salary desc limit 2,5注意:limit一定要放到所有的语句的最后
使用场景:开发网站、开发手机程序的时候分页用的非常多十五、group by1,数据分组用来将数据分为多个逻辑组,从而可以对每个组进行聚合运算。
SQL语句中使用group by子句进行分组,使用方式为“group by 分组字段”。 分组一般和集合函数一起使用,group by子句负责将数据分成逻辑组,而聚合函数则对每个组进行统计计算2,查看公司员工有哪些年龄段的:
select Age from T_Employees group by Age3,将Age相同的数据行放到一组,分组后的数据可以看作一个临时的结果集,而SELECT Age语句则取出每组的Age字段的值,
这样我们就得到上表的员工年龄段表了。4,如果SELECT语句有WHERE子句,则GROUP BY子句必须放到WHERE语句的之后
5,group by子句将检索结果划分为多个组,每个组是所有记录的一个子集。
十六、group by与聚合函数
1,分组后就可以对组内的数据采用聚合函数进行统计了;
计算每个分组中员工的平均工资:
select Age,avg(salary) from T_Employees group by Age查看每个年龄段的员工的人数:
select Age,count(*) from T_Employees group by Age十七、join 1,真是的业务系统中,各个表之间都存在这种联系,很少存在不与其他表存在关联关系的表, 而在实现业务功能的时候也经常需要从多个表中进行数据的检索,而进行多表检索最常用的技术就是表连接 2,如果没有表连接,那么查询每张订单的客户姓名就要先查询订单,再去查询客户表,麻烦而且效率低 3,SQL中使用JOIN关键字来进行表连接。 表连接有多种不同的类型,被主流数据库系统支持的有交叉连接(CROSS JOIN)、内连接(INNER JOIN)、外连接(OUTTER JOIN) 外连接分为:left join、right join。十八、外键约束
1,如果删除/更新T_Customers一行记录,那么就可能会导致T_Orders中存在CustomerId为非法值的数据,使得程序逻辑错误。
一般不会更新主键Id的值,所以谈外键约束的时候只谈“删除T_Customers时” 2,外键约束:当删除T_Customer中一条数据的时候,如何处理T_Orders等存在指向T_Customers外键的行。外键约束建立在外键字段***Id的表上 3,建外键约束的方法:新建或者修改表的时候“外键”→“添加外键”。 名字:自动命名即可;栏位名:CustomerId;参考表:t_customers;外栏位名:Id; 删除时、更新时:一般默认RESTRICT(CASCADE:删除T_Customers一行时把它的订单也删除了; SET NULL:删除T_Customers一行时把它的订单CustomerId设置为NULL;NO ACTION/RESTRICT:拒绝删除)。 十九、扩展学习资料 1,DDL: 2,存储过程、触发器、约束、子查询、处理left join之外其他的join