mysql笔记

数据库概述

DB:DataBase: 指长期保存在计算机的存储设备上,按照一定规则组织起来,可以被各种用户或应用共享的数据集合。(文件系统)
DBMS:DataBase Management System:指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中的数据。

数据库软件应该为数据库管理系统,数据库是通过数据库管理系统创建和操作的。

数据库:存储、维护和管理数据的集合。

dos下数据库的登录与卸载

  • 登录
    • mysql -u root -p
  • 卸载
    • 停止mysql服务 net stop mysql
    • 启动mysql服务 net start mysql
  • 修改密码
    1. 停止mysql服务 运行输入services.msc 停止mysql服务
      或者 cmd --> net stop mysql
    2. 在cmd下 输入 mysqld --skip-grant-tables 启动服务器 光标不动 (不要关闭该窗口)
    3. 新打开cmd 输入mysql -u root -p 不需要密码
      use mysql;
      update user set password=password(‘abc’) WHERE User=‘root’;
    4. 关闭两个cmd窗口 在任务管理器结束mysqld 进程
    5. 在服务管理页面 重启mysql 服务
      密码修改完成

sql概述

SQL:Structure Query Language。(结构化查询语言)
SQL被美国国家标准局(ANSI)确定为关系型数据库语言的美国标准,后来被国际化标准组织(ISO)采纳为关系数据库语言的国际标准。

各数据库厂商都支持ISO的SQL标准。普通话
各数据库厂商在标准的基础上做了自己的扩展。方言

sql分类

DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等; CREATE、 ALTER、DROP
DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据); INSERT、 UPDATE、 DELETE
DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;
DQL(Data Query Language):数据查询语言,用来查询记录(数据)。
SELECT

  • 注意:sql语句以;结尾

DDL

CREATE/ALTER/DROP

操作数据库

  • 创建
    • create database mydb1;
    • create database mydb2 character set gbk;
    • create database mydb3 character set gbk collate gbk_chinese_ci; //COLLATE子句用于指定默认的数据库整序。
  • 查询
    • show databases;查看当前数据库服务器中所有数据库
    • show create database mydb2;查看前面创建的mydb2数据库的定义信息
  • 修改
    • alter database mydb2 character set utf8; 查看服务器中的数据库并把mydb2的字符集修改位utf8
  • 删除
    • drop database mydb3;
  • 其他
    • select database(); 查看当前使用的数据库
    • use mydb2; 切换数据库

操作数据表

  • 语法

      	create table 表名(
      	字段1 字段类型,
      	字段2 字段类型,
      	...
      	字段n 字段类型
      );
    
  • 常用数据类型

    • int
    • double
    • decimal
    • float
    • char:固定长度字符串类型
    • varchar:可变长度字符串类型
    • text:字符串类型
    • blob
    • data //yyyy-MM-dd;
    • time //hh:mm:ss
    • timestamp 时间戳
    • datatime
      对比time/timestamp/datatime
  • 语句

    • show tables;查看数据库中的所有表
    • desc xxx; 查看表的字段信息
    • alter table xxx add image blob;在xxx的基本上添加一个image列
    • alter table xxx modify job varchar(60); 修改job列使其长度为60
    • alter table xxx drop image;删除image列,一次只能删一列
    • rename table xxx to yyy;修改表名为yyy
    • show create table user;查看表格的创建细节
    • alter table user character set gbk;修改表的字符集为gbk
    • alter table user change name username varchar(100);将列名name修改为username
    • drop table user;

DML

SELECT * FROM 表名;
DML时对表中的数据进行增删改的操作
INSERT/UPDATE/DELETE

1.插入操作 INSERT

insert into 表名(列名1,列名2....)values(列值1,列值2....);
  • 列名和列值的类型个数与顺序相对应

  • 值不能超出列定义的长度

  • 插入空值使用null

  • 插入的日期和字符一样都要用引号括起来

  • 练习 :

      create table emp(
      	id int,
      	name varchar(100),
      	gender varchar(10),
      	birthday date,
      	salary float(10,2),
      	entry_date date,
      	resume text
      );
      
      INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)
      VALUES(1,'zhangsan','female','1990-5-10',10000,'2015-5-5-','good girl');
      
      INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)
      VALUES(2,'lisi','male','1995-5-10',10000,'2015-5-5','good boy');
      
      INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)
      VALUES(3,'wangwu','male','1995-5-10',10000,'2015-5-5','good boy');
      
      批量插入:
      INSERT INTO emp VALUES
      (4,'zs','m','2015-09-01',10000,'2015-09-01',NULL),
      (5,'li','m','2015-09-01',10000,'2015-09-01',NULL),
      (6,'ww','m','2015-09-01',10000,'2015-09-01',NULL);
    

2.修改操作

UPDATA 表名 set 列名1=列值1,列名2=列值2.... where 列名=值
  • 练习

       将所有员工薪水修改为5000元。
       UPDATE emp SET salary=5000 
       将姓名为’zs’的员工薪水修改为3000元。
       UPDATE emp SET salary=3000 WHERE name=’ zhangsan’;
       将姓名为’aaa’的员工薪水修改为4000元,job改为ccc。
        UPDATE emp SET salary=4000,gender='female' WHERE name='lisi';
       将wu的薪水在原有基础上增加1000元。
        UPDATE emp SET salary=salary+1000 WHERE gender='male';	
    

3.删除操作

delete from 表名 where 列名=值
  • 练习

    删除表中名称为’zs’的记录。
    DELETE FROM emp WHERE name=‘zs’;
    删除表中所有记录。
    DELETE FROM emp;
    使用truncate删除表中记录。
    TRUNCATE TABLE emp;
    
    
  • DELETE 删除表中的数据,表结构还在,删除后的数据可以找回
    TRUNCATE 删除是把表直接DROP掉,然后再创建一个同样的新表。删除的数据不能找回。执行速度比DELETE快。

DQL

数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。
查询返回的结果集是一张虚拟表。

 SELECT 列名 FROM表名 
【WHERE --> GROUP BY -->HAVING--> ORDER BY】
  • 语法

    • group by 对结果进行分组
    • having 分组后的行条件
    • order by 对结果进行分组
    • limit 结果限定
  • 基础查询

    • select * from table;查询所有列
    • select xx,yy from table;查询指定列
  • 条件查询

    • where

      • =、!=、<>、<、<=、>、>=;
      • BETWEEN…AND;
      • IN(set);
      • IS NULL; IS NOT NULL
      • AND;
      • OR;
      • NOT;
       查询性别为女,并且年龄50的记录
        SELECT * FROM stu 
      WHERE gender='female' AND ge<50;
      
      查询学号为S_1001,或者姓名为liSi的记录
      SELECT * FROM stu 
      WHERE sid ='S_1001' OR sname='liSi';
      
      查询学号为S_1001,S_1002,S_1003的记录
      SELECT * FROM stu 
      WHERE sid IN ('S_1001','S_1002','S_1003');
      
      查询学号不是S_1001,S_1002,S_1003的记录
      SELECT * FROM tab_student 
      WHERE s_number NOT IN ('S_1001','S_1002','S_1003');
      
      查询年龄为null的记录
      SELECT * FROM stu
      WHERE age IS NULL;
      
      查询年龄在20到40之间的学生记录
      SELECT * 
      FROM stu
      WHERE age>=20 AND age<=40;
      或者
      SELECT * 
      FROM stu 
      WHERE age BETWEEN 20 AND 40;
      
      查询性别非男的学生记录
      SELECT * 
      FROM stu
      WHERE gender!='male';
      或者
      SELECT * 
      FROM stu
      WHERE gender<>'male';
      或者
      SELECT * 
      FROM stu
      WHERE NOT gender='male';
      
      查询姓名不为null的学生记录
      SELECT * 
      FROM stu
      WHERE sname IS NOT NULL;
      或者
      SELECT * 
      FROM stu
      WHERE NOT sname IS NULL;
      
  • 模糊查询

    • 当想查询姓名中包含a字母的学生时就需要使用模糊查询了。模糊查询需要使用关键字LIKE。
    • 通配符:
      _ 任意一个字符
      %:任意0~n个字符
    查询姓名由5个字母构成的学生记录
    SELECT * 
    FROM stu
    WHERE sname LIKE '_____';
    模糊查询必须使用LIKE关键字。其中 “_”匹配任意一个字母,5个“_”表示5个任意字母。
    查询姓名由5个字母构成,并且第5个字母为“i”的学生记录
    SELECT * 
    FROM stu
    WHERE sname LIKE '____i';
    
    查询姓名以“z”开头的学生记录
    SELECT * 
    FROM stu
    WHERE sname LIKE 'z%';
    其中“%”匹配0~n个任何字母。
    
    查询姓名中第2个字母为“i”的学生记录
    SELECT * 
    FROM stu
    WHERE sname LIKE '_i%';
    
    查询姓名中包含“a”字母的学生记录
    SELECT * 
    FROM stu
    WHERE sname LIKE '%a%';
    
    
  • 字段控制查询

    • 去除重复记录distinct
      SELECT DISTINCT sal FROM emp;
    • 求和
      • 需要字段都为数值类型SELECT sal+comm FROM emp;
      • 避免与null 相加结果出现nullSELECT sal+IFNULL(comm,0) FROM emp;
    • 给列名添加别名
      在上面查询中出现列名为sal+IFNULL(comm,0),这很不美观,现在我们给这一列给出一个别名,为total:
      SELECT sal+IFNULL(comm,0) AS total FROM emp;
      给列起别名时,是可以省略AS关键字的:SELECT sal+IFNULL(comm,0) total FROM emp;
  • 排序

    • order by 列名 asc(默认) desc
       查询所有学生记录,按年龄升序排序
       SELECT *
       FROM stu
       ORDER BY sage ASC;
       或者
       SELECT *
       FROM stu
       ORDER BY sage;
       
       查询所有学生记录,按年龄降序排序
       SELECT *
       FROM stu
       ORDER BY age DESC;
       
       查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序
       SELECT * FROM emp
       ORDER BY sal DESC,empno ASC;
    
  • 聚合函数

    • COUNT():统计指定列不为NULL的记录行数;

      当需要纵向统计时可以使用COUNT()。
      查询emp表中记录数:
      SELECT COUNT(*) AS cnt FROM emp;
      
      查询emp表中有佣金的人数:
      SELECT COUNT(comm) cnt FROM emp;
      注意,因为count()函数中给出的是comm列,那么只统计comm列非NULL的行数。
      
      查询emp表中月薪大于2500的人数:
      SELECT COUNT(*) FROM emp
      WHERE sal > 2500;
      
      统计月薪与佣金之和大于2500元的人数:
      SELECT COUNT(*) AS cnt FROM emp WHERE sal+IFNULL(comm,0) > 2500;
      
      查询有佣金的人数,有领导的人数:
      SELECT COUNT(comm), COUNT(mgr) FROM emp;
      
    • MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;

    • MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;

      查询最高工资和最低工资:
      SELECT MAX(sal), MIN(sal) FROM emp;
      
    • SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;

    • AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;

      当需要纵向求和时使用sum()函数。
      查询所有雇员月薪和:
      SELECT SUM(sal) FROM emp;
      
      查询所有雇员月薪和,以及所有雇员佣金和:
      SELECT SUM(sal), SUM(comm) FROM emp;
      
      查询所有雇员月薪+佣金和:
      SELECT SUM(sal+IFNULL(comm,0)) FROM emp;
      
      统计所有员工平均工资:
      SELECT AVG(sal) FROM emp;
      
  • 分组查询

    • 当需要分组查询时需要使用GROUP BY子句,例如查询每个部门的工资和,这说明要使用部门来分组。
      注:凡和聚合函数同时出现的列名,一定要写在group by 之后
    • 查询每个部门的部门编号和每个部门的工资和:
      SELECT deptno, SUM(sal)
      FROM emp
      GROUP BY deptno;
      
      查询每个部门的部门编号以及每个部门的人数:
      SELECT deptno,COUNT(*)
      FROM emp
      GROUP BY deptno;
      
      查询每个部门的部门编号以及每个部门工资大于1500的人数:
      SELECT deptno,COUNT(*)
      FROM emp
      WHERE sal>1500
      GROUP BY deptno;
      
    • having子句
      查询工资总和大于9000的部门编号以及工资和:
      SELECT deptno, SUM(sal)
      FROM emp
      GROUP BY deptno
      HAVING SUM(sal) > 9000;
      
      • having与where的区别:
        1.having是在分组后对数据进行过滤.
        where是在分组前对数据进行过滤
        2.having后面可以使用聚合函数(统计函数)
        where后面不可以使用聚合函数。
        WHERE是对分组前记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分组;而HAVING是对分组后数据的约束。
  • LIMIT

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

      查询5行记录,起始行从0开始
      SELECT * FROM emp LIMIT 0, 5;
      
      注意,起始行从0开始,即第一行开始!
      
      查询10行记录,起始行从3开始
      SELECT * FROM emp LIMIT 3, 10;
      
      • 分页查询
      如果一页记录为10条,希望查看第3页记录应该怎么查呢?
      
      
      第一页记录起始行为0,一共查询10行;
      第二页记录起始行为10,一共查询10行;
      第三页记录起始行为20,一共查询10行;
      
    • 查询代码的书写顺序和执行顺序
      查询语句书写顺序:select – from- where- group by- having- order by-limit
      查询语句执行顺序:from - where -group by - having - select - order by-limit

数据的完整性

  • 作用: 保证用户输入的数据保存到数据库中时正确的。
  • 确保数据的完整性 = 在创建表时给表中添加约束

完整性的分类

  • 实体完整性
  • 域完整性
  • 引用完整性

实体完整性

实体:即表中的一行(一条记录)代表一个实体(entity)
实体完整性的作用:标识每一行数据不重复。
约束类型:

  • 主键约束(primary key)
  • 唯一约束(unique)
  • 自动增长列(auto_increment)

1.主键约束
特点:数据唯一,且不能为null
例:

CREATE TABLE student(
Id int primary key,
Name varchar(50)
);

此种方式优势在于,可以创建联合主键
CREATE TABLE student(
id int,
Name varchar(50),
Primary key(id)
);
CREATE TABLE student(
id int,
Name varchar(50),
Primary key(id,name)
);

CREATE TABLE student(
Id int,
Name varchar(50)
);
ALTER TABLE student
ADD  PRIMARY KEY (id);

2.唯一约束(unique)

CREATE TABLE student(
Id int primary key,
Name varchar(50) unique
);

mysql可以用多个空值 但别的数据库不行
3.自动增长列(auto_increment)
给主键添加自动增长的数值,列只能是整数类型,但是如果删除之前增长的序号,后面再添加的时候序号不会重新开始,而是会接着被删除的那一列的序号

域完整性

限制此单元格的数据正确,不对照此列的其它单元格比较
域代表当前单元格
域完整性约束:

  • 数据类型
  • 非空约束(not null)
  • 默认值约束(default)
  • Check约束(mysql不支持) check();

1.数据类型:(数值类型、日期类型、字符串类型)
2.非空约束:not null

CREATE TABLE student(
Id int pirmary key,
Name varchar(50) not null,
Sex varchar(10)
);

INSERT INTO student values(1,’tom’,null);

3.默认值约束 default

CREATE TABLE student(
Id int pirmary key,
Name varchar(50) not null,
Sex varchar(10) default ‘男’
);

insert into student1 values(1,'tom','女');
insert into student1 values(2,'jerry',default);

3、引用完整性(参照完整性)

外键约束:FOREIGN KEY

CREATE TABLE student(
sid int pirmary key,
name varchar(50) not null,
sex varchar(10) default ‘男’
);

create table score(
	id int,
	score int,
	sid int , -- 外键列的数据类型一定要与主键的类型一致
	CONSTRAINT fk_score_sid foreign key (sid) references student(id)
);

ALTER TABLE score1 ADD CONSTRAINT fk_stu_score FOREIGN KEY(sid) REFERENCES stu(id);

表与表之间的关系

一对一:例如t_person表和t_card表,即人和身份证。这种情况需要找出主从关系,即谁是主表,谁是从表。人可以没有身份证,但身份证必须要有人才行,所以人是主表,而身份证是从表。设计从表可以有两种方案:

  • 在t_card表中添加外键列(相对t_user表),并且给外键添加唯一约束;
  • 给t_card表的主键添加外键约束(相对t_user表),即t_card表的主键也是外键。

一对多(多对一):最为常见的就是一对多!一对多和多对一,这是从哪个角度去看得出来的。t_user和t_section的关系,从t_user来看就是一对多,而从t_section的角度来看就是多对一!这种情况都是在多方创建外键!
多对多:例如t_stu和t_teacher表,即一个学生可以有多个老师,而一个老师也可以有多个学生。这种情况通常需要创建中间表来处理多对多关系。例如再创建一张表t_stu_tea表,给出两个外键,一个相对t_stu表的外键,另一个相对t_teacher表的外键。

多表查询

合并结果集;UNION 、 UNION ALL

连接查询

  • 内连接 [INNER] JOIN ON
  • 外连接 OUTER JOIN ON
    • 左外连接 LEFT [OUTER] JOIN
    • 右外连接 RIGHT [OUTER] JOIN
    • 全外连接(MySQL不支持)FULL JOIN
  • 自然连接 NATURAL JOIN

子查询

合并结果集

  1. 作用:合并结果集就是把两个select语句的查询结果合并到一起!
  2. 合并结果集有两种方式:
    • UNION:去除重复记录,例如:SELECT * FROM t1 UNION SELECT * FROM t2;
    • UNION ALL:不去除重复记录,例如:SELECT * FROM t1 UNION ALL SELECT * FROM t2。

连接查询/子查询

自连接:自己连接自己,起别名
求7369员工编号、姓名、经理编号和经理姓名

SELECT e1.empno , e1.ename,e2.mgr,e2.ename 
FROM emp e1, emp e2 
WHERE e1.mgr = e2.empno AND e1.empno = 7369;

练习:
求各个部门薪水最高的员工所有信息

   	select e.* from emp e,
   --部门最高工资
   (select max(sal) maxsal,deptno from emp
   group by deptno) a
   where e.deptno = a.deptno
   and e.sal =a.maxsal

mysql的函数

函数

MySQL数据库的备份与恢复

1 生成sql脚本 导出数据
在控制台使用mysqldump命令可以用来生成指定数据库的脚本文本,但要注意,脚本文本中只包含数据库的内容,而不会存在创建数据库的语句!所以在恢复数据时,还需要自已手动创建一个数据库之后再去恢复数据。

mysqldump –u用户名 –p密码 数据库名>生成的脚本文件路径

注意,mysqldump命令是在Windows控制台下执行,无需登录mysql
2 执行sql脚本 恢复数据
提:必须先创建数据库名

执行SQL脚本需要登录mysql,然后进入指定数据库,才可以执行SQL脚本!
执行SQL脚本不只是用来恢复数据库,也可以在平时编写SQL脚本,然后使用执行SQL 脚本来操作数据库!大家都知道,在黑屏下编写SQL语句时,就算发现了错误,可能也不能修改了。所以我建议大家使用脚本文件来编写SQL代码,然后执行之!

SOURCE C:\mydb1.sql

注意,在执行脚本时需要先行核查当前数据库中的表是否与脚本文件中的语句有冲突!例如在脚本文件中存在create table a的语句,而当前数据库中已经存在了a表,那么就会出错!

还可以通过下面的方式来执行脚本文件:

mysql -uroot -p123 mydb1

你可能感兴趣的:(javeweb)