DDL:数据定义语言:create、drop、alter
DML:数据操作语言:insert、delete、update、truncate
DQL:数据查询语言:select、show、desc
MySQL存储结构:先有数据库,再有表,最后填充记录!
MySQL语句都是以分号;结尾的!
1、基本语法(创建数据库时使用数据库的默认字符集):create database 数据库名称;
2、查看数据库列表:show databases;
3、高级语法(创建数据库时指定数据库的字符集):create database 数据库名称 character set utf8;
举例:create database cmm0928; create database cmm0928 character set utf8;
4、切换数据库:(使用数据库cmm0928)use cmm0928; (使用数据库cmm0929)use cmm0929;
查看当前正在使用的数据库:select database();
5、查看创建的数据库定义信息:show create database cmm0928;
6、删除指定数据库:drop database cmm0928;
删除了数据库,数据库中的表没了,表中的数据也没了,慎重的操作!
7、修改数据库的默认字符集:alter database cmm0928 character set gbk;
登陆到MySQL服务器的方式一:(1)mysql -u root -p; (2)输入pwd,回车即可进入MySQL服务器。
登陆到MySQL服务器的方式二:(1)mysql -uroot -proot; (2)回车即可进入MySQL服务器。
1、显示数据库:show databases; 创建数据库:create database cmm0928; 使用一个数据库:use cmm0928;
2、查看当前数据库中的所有表:show tables;
3、新建表语法:可以参考建表wiki
CREATE TABLE `RUN_Department` ( `DepartmentId` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID(部门ID)', `DepartmentName` VARCHAR(256) NOT NULL DEFAULT '' COMMENT '部门名称', `Status` TINYINT(4) NOT NULL DEFAULT '1' COMMENT '部门是否有效:1-有效,0-无效', `AddTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间', `UpdateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`DepartmentId`), UNIQUE KEY `UNIQUE_IX_DepartmentName` (`DepartmentName`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;4、查看表结构:desc student;
5、删除一个表:drop table student;
6、给表增加一个字段:alter table student add address varchar(50);
7、给表增加多个字段:alter table student add address varchar(50), add math int(11), add chinese int(11);
8、从表中删除一个字段:alter table student drop chinese;
9、修改表中的字段类型:alter table student modify address varchar(100);
10、修改表中的字段名称:alter table student change address homeAddress varchar(100);
11、修改表名称:alter table student rename mtdpStudent;
12、修改表的AUTO_INCREMENT字段:发现表的AUTO_INCREMENT值已经远远超过了int值范围,再次改回来: alter table MARS_Entity auto_increment =10000;
(1)参考1:https://www.cnblogs.com/ajianbeyourself/p/9098318.html
(2)参考2:https://blog.csdn.net/wangyongx_123/article/details/90315737
1、建表:create table student(id int(11) primary key auto_increment, name varchar(50), gender varchar(50), age int(11));
2、插入一条记录:依次插入所有字段:insert into student values ("张三","男",10);
3、插入一条记录:依次插入部分字段:insert into student(name, gender) values(“李四", "女");
4、带条件修改一个字段:修改符合条件的所有字段的值:update student set gender="男" where id=1;
5、带条件修改多个字段:修改符合条件的所有字段的值:update student set gender="女", age="20" where id=2;
6、带条件的删除数据:delete form student where id =1;
7、清空表中所有数据:delete from student; truncate table student;
(注:前者是逐行的删除表中记录,直至删除所有记录,速度慢,不会清空auto_increment 记录数,且在事务中可以通过rollback回滚恢复数据。
后者是直接删去整张表,再重新创建一个空表,速度快,会清空auto_increment记录数,且在事务中不能通过rollback回滚恢复数据。)
查询数据(重点)
1、查询所有字段:select * from student;
2、查询指定字段:select id, name from student;
3、查询时给字段指定一个别名as(关键字as可以省略):select id as "学号", name as "姓名" from student;
4、查询时添加常量列:select id, name, gender, age, "mySQL" from student ; select id as "学号", name as "姓名", gender as "性别", age as "年龄", "mySQL" as "学习内容" from student ;
5、查询时合并数值列:select id, name, (math+chinese) as "总成绩" from student;
6、查询时去除重复记录(distinct):select distinct gender from student; select distinct(gender) from student;
【条件查询】
1、逻辑条件:and 表示并且关系。or:表示或者关系。( = 属于完全匹配。like 属于模糊匹配。)
select * from student where id=2 and name="李四";
select * from student where id=2 or name="张三";
2、比较条件:>, <, >=, <=, <>, between and
select * form student where servlet>100;
select * from student where jsp>=75 and jsp<=90;
select * from student where jsp between 75 and 90; (包前包后)
3、判空条件:is null, is not null, ="", <>""
select * from student where address is null;
select * from student where address is not null and address <> "";
4、模糊查询:like 通常与替换的标记搭配使用。%:表示匹配任意个字符。_:一个下划线表示一个占位符,两个下划线表示两个占位符。
select * from student where name like "张%";
select * from student where name like "李_";
select * from student where name like "李__";
5、聚合查询:使用mysql自带的聚合函数的查询称之为聚合查询
sum():select chinese from student; select sum(chinese) as "语文总成绩" from student;
avg():select avg(chinese) as "语文平均成绩" from student;
max():select max(chinese) as "语文最高分" from student;
min():select min(chinese) as "语文最低分" from student;
count():select count(*) as "表中记录总数量" from student; select count(id) as "表中记录总数量" from student; 注意:id应该是主键。
6、分页查询( limit 起始行, 查询行数:起始行从0开始,查询几条记录。表中的数据行数从0开始计数。 )
查1条记录:select * from student limit 1; select * from student limit 0, 1;
从第0条开始查,总共查3条记录:select * from student limit 0, 3;
从第2条开始查,总共查10条记录。:select * from student limit 2, 10;
分页查询当前页数据的SQL语句:select * from student limit (当前页-1)*每页显示多少条记录, 每页显示多少条记录;
7、查询排序:order by 字段 ASC/DESC。默认顺序是记录的插入顺序,默认排序是ASC。
正序排列,单个排序条件:select * from student order by id;
反序排序,单个排序条件:select * from student order by id DESC;
多个排序条件:先按照语文正排,再按照数学逆徘。:select * from student order by chinese ASC, math DESC;
8、分组查询:group by
统计每个性别的人数:select gender, count(*) from student group by gender;
统计每个地区的人数:select address, count(*) from student group by address;
分组查询之前的筛选用where: select gender, count(*) from student where name like "陈%" group by gender;
分组查询之后的筛选用 having:select gender, count(*) from student where name like "陈%" group by gender having count(*)>2;
1、数据约束:对用户操作表的数据字段的权限做约束
(1)字段含有默认值:当用户对使用默认值的字段不插入数据的时候便会使用默认值。注意:对默认值字段可以插入null或者非null。比如:studenAdress的默认值:"德必易园"
create table student( studentId INT(11), studenName VARCHAR(20) default '德必易园2222' )(2)字段值是非null:限制该字段必须赋值。注意:非空字段必须赋非null值。
create table student( studentId INT(11), studenName VARCHAR(20) NOT NULL ) create table student( studentId INT(11), studenName VARCHAR(20) NOT NULL default '德必易园222' )(3)字段值是唯一:限制字段的值不能重复。注意:这里说的唯一对null值不起作用,也即唯一的字段可以有很多个null值。
create table student( studentId INT(11) unique, studenName VARCHAR(20) )(4)字段是主键:非null + 唯一。注意:通常情况下,每张表都会设置一个主键,用于标记表中每一条记录的唯一性。
建议不要选择表的包含业务含义的字段作为主键。建议给每张表独立设计一个非业务含义的id字段作为主键。
create table student( studentId INT(11) PRIMARY KEY, studenName VARCHAR(20) )(5)字段是自增长:自增长字段可以不赋值,自动从0开始递增。注意:delete from student; 不影响自增长约束。truncate table student; 影响自增长约束。
create table student( id INT(11) PRIMARY KEY AUTO_INCREMENT, studentId INT(11), studenName VARCHAR(20) NOT NULL default '蒲松北路222' )(6)字段是外键:约束两张表的数据:两张表中含有业务关联的字段可以使用外键关联起来,解决了数据高冗余的问题(把冗余度高的数据独立出一张表)。
例如:员工表employee(被约束的表是从表)和部门表department(约束别人的表是主表)。在员工表的部门ID字段添加一个外键约束,外键设置在从表中,从表的参考字段通常为主表的主键。
当有了外键约束后,添加数据的顺序:先添加主表,再添加从表数据。
当有了外键约束后,修改数据的顺序:先修改从表,再修改主表数据。
当有了外键约束后,删除数据的顺序:先删除从表,再删除主表数据。
create table employee( id INT(11) not null PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', empName VARCHAR(20) not null default '', deptId INT(11), CONSTRAINT employee_deptId_fk FOREIGN KEY(deptId) REFERENCES department(id) --外键名称 --外键 --参考表和参考字段 ) create table department( id INT(11) not null PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', depName VARCHAR(30) not null default '' )设计原则:设计的表尽量遵循三大范式:
第一范式:要求表的每个字段必须是不可分割的独立单元。
第二范式:在第一范式的基础上,要求每张表只表达一个意思。表的每个字段都和表的主键有依赖。
第三范式:在第二范式的基础上,要求每张表的主键之外的其他字段都只能和主键有直接决定依赖关系。(是为了降低数据的冗余度,防止出现数据异常)
新建一张表举例:
CREATE TABLE `RUN_Employee` ( `EmployeeId` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID(员工ID)', `EmployeeName` VARCHAR(256) NOT NULL DEFAULT '' COMMENT '员工姓名', `EmployeeSex` TINYINT(4) NOT NULL COMMENT '员工性别(1-男,2-女,3-未知)', `EmployeeAge` TINYINT(4) NOT NULL COMMENT '员工年龄', `DepartmentId` INT(11) NOT NULL COMMENT '员工所属部门', `Status` TINYINT(4) NOT NULL DEFAULT '1' COMMENT '员工是否在职:1-在职,0-离职', `AddTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间', `UpdateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`EmployeeId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;(1)varchar:可变长度的字符串,长度不够时不补全空格,可以节约空间,比如存储姓名。
(2)char:固定长度的字符串,长度不够时用空格补全长度,比如存储身份证号码。