专业术语:
- 列:字段
- 行:一条记录
- 主键:主键是唯一的,当指明某一列为主键时,这一列的数据就不能有重复的。
- 外键:(补充)
- 索引:(补充)
sql的数据分类:
1. ddl数据定义语言
-
create database 数据库名 character set utf8;//创建一个数据库,后面是字符集编码,可省
-
alter database 数据库名称 character set 字符集编码名;//修改数据库字符集编码
-
create table 表名(
列名1 列的类型 [约束],
列名2 列的类型 [约束],
列名3 列的类型 [约束]
);\最后一行是没有逗号的 -
alter table 表名 add 列名 数据类型; //增加一列
-
alter table 表名 modify 字段名 数据类型; //修改表的字段类型
-
rename table 原始名称 to 要修改成的名称;//修改表名
-
alter table 表名 character set 字符集名称;//修改字符集
-
alter table 表名 change 原始列名 新列名 数据类型;//修改列名
-
desc 表名;//查看表的信息
-
show create table 表名;//查看表的创建细节(查看建表的语句)
-
alter table 表名 drop 字段名;//删除一列
-
drop table 表名;//删除表
2. dml:数据操作语言(增删改)
- select * from 表名;//查询表的所有数据
- insert into 表名(列名1,列名2……)value (列值1,列值2……);
注意:列名和列值的类型和个数,顺序要一一对应,值不要超出列定义的长度,日期和字符时都要使用括号括起来,(列名1,列名2……)这个括号可以省略,省略时默认是所有的列。 - insert into 表名(列名1,列名2……)values (列值1,列值2……),(列值1,列值2……);//批量插入
- update 表名 set 列名1=列值1,列名2=列值2……where 列名=值;//修改列的值,当没有where语句时,修改整个列。当写成列名=列名+1 是在原来的基础之上加一;
- 修改密码的命令:alter user ‘root’@‘localhost’ identified by ‘新的密码’;//在命令行里面进入mysql里面改;
- 修改密码的方法二:(自带的工具)在命令行里面直接写:mysqladmin -u root -p password ‘新的密码’
- delete from 表名 where 列名=值;//删除表的某一行,如果后面没有where语句,就删除整张表
- truncate table 表名;//删除所有数据,他们两个的区别:delete删除表中的数据,表还在,truncate 是把表直接drop掉,然后重新创建同样的表,执行速度比delete快。还有就是如果表中有主键的话,delete删除信息后,因为表的结构在,所以主键的值一直在增加,但是truncate有主键的话主键就不会增加,而是重新开始。
3. dql:数据查询语言
-
select * from 表名;/查询表中的所有数据
-
select 列名1,列名2……from 表名;//查询指定的列名的数据
-
条件查询就是再查询时加上where子句,
在where子句中可以使用的运算符和关键字有:=(等于),!=(不等于),<>(不等于),<,<=,>,>=,between …and…;值在什么范围,in(set),is null ;(为空),is not null;(不为空),and;(与),or;(或),not;(非)。
下面时示例:
1:查询学号是1,2,3的记录:
方法一:select * from students where id=1 or id=2 or id=3;
方法二:select * from students id in(1,2,3);
2:查询年龄在18到20之间的学生记录:
方法一:select * from students where age >=18 and age<=20;
方法二:select * from students where age between 18 and 20; -
模糊查询:_代表一个字符,%代表任意多个字母
1:查询名字由五个字母构成的记录:select * from students where name like ‘_____";//这里是有五个下划线组成的,当只想看名字的这个字段时,将*改成name就行了。
2:查询名字由五个字母构成并且第五个字母为‘s’的学生记录:select * from students where name like ‘____s";四个_加s
3:以‘m’开头的记录:select * from students where name like ‘m%’;
4:第二个字母为‘u’的记录:select * from student where name like ‘_u
%’;
5:查询姓名包含’s‘字母的记录:select * from students where name like ’%s%’; -
字段控制查询:
1:select distinct 列名 from 表名;查询表中的一列,并且去掉重复的记录。
2:对查询的结果进行运算(必须都是数值型):select *,字段1+字段2 from 表名;
例如:select *,age+score from students;但是数据中有很多数值是null的,当为null时,想将null改成其他值,可以写成select *,ifnull(age,0)+ifnull(score,0) from students;
3:上面的查询结果中,出现的新的一列是ifnull(age,0)+ifnull(score,0),这样的名字太难看,我们可以对它进行起别名select *,ifnull(age,0)+ifnull(score,0)as total from students;这样新的一列名字就是total,其实对所有的字段都适合,例如select name as othername from students;那么字段name的名字就改成othername了。 -
排序:select * from 表名 order by 列名1 desc,列名2 asc……;//先用列名1进行排序,有相同的再用列名2进行排序。其中asc是升序(默认的),desc是降序;
-
聚合函数:
1:count();统计指定列不为null的记录 。select count(*) from 表名;显示有多少条记录。select count(列名1),count(列名2) from 表名;显示列名1和列名2的记录个数。
2:max();计算指定列的最大值,字符串按照字符串的顺序运算。select max(字段名),min(字段名) from 表名;分别查最大值和最小值。
3:min():指定列的最小值,字符串按照字符串的顺序运算
4:sum();指定列的数值求和,如果指定列不是数值类型,计算结果是0。
select sum(列名),sum(列名2) from 表名;查询;列名1和列名2的总和分别是多少。select sum(列名1+列名2) from 表名;查询列名1和列名2加起来的总和是多少。
5:avg();计算平均值,如果指定列不是数值类型,计算结果是0;和sum的用法一样 -
分组查询:将查询结果按照一个或者多个字段分组。
1:select 列名 from 表名 group by 列名(这是分组的依据的一列:例如性别的字段就按照男女来分组); 分组查询和去重查询的结果可能相同,但是两者有区别的,去重查询是去掉重复的给你显示,而分组查询是按照分组依据显示每一组的第一条信息,但是它的每一组还有很多其他的记录。比如:select id,group_concat(‘name’) from students group by gender;这样就会按照男女分组,然后在每一组后面显示男生和女生分别的名字,表示分组之后,根据分组结果,使用group_concat()来放置每一组某字段的的值的集合。
2:注意事项:使用分组的时候,select后面直接跟的字段一般出现在group by后:select name,gender from students group by gender,name;这样对姓名和性别同时进行分组。
3:group by和聚合函数联合使用:通过group_conat()启发,我们既然可以统计出每个分组的字段值的集合,那么就可以通过集合函数来对这个值的集合做一些操作:select department ,group_concat(salary),avg(salary) from employee group by department;//这样按照部门进行分类,显示部门的工资,然后求平均值。
4:having 作用和where一样,但having只能永雨group by,用于分组查询后指定一些条件继续查询:select department,sum(salary) from employee group by department having sum(salary)>9000; //这样查询工资总和大于9000的部门名称和工资和。having是分组后对数据进行筛选,where是分组前对数据进行过滤的,where后面不可以使用聚合函数 -
书写顺序:select —>from—>where—>group by—>having—>order by—>limit
-
执行顺序: from —>where —>group by—>having—>select—>order by—>limit
-
limit:从哪一行开始查,总共要查几行,格式是:limit 参数1,参数2 //参数1是指从哪一行开始查,参数2是指一共查几行。这个limit可以使用来做分页,思路如下:
1:int curpage=1;//当前页
2:int pagesize=3; //每一页多少数据
3:当前页是第一页从(1-1)*3=0开始
4:当前页是第二页从(2-1)*3=3开始
5:公式:select *from employee limit (curpage-1)*pagesize,pagesize;
4. dcl:数据控制语言
- 数据完整性:(保证用户输入的数据是正确的)实体完整性,域完整性,引用完整性
1:实体完整性:表中一行(一条记录)代表一个实体
作用:标识每一行的数据不重复,行级约束。
约束类型:
一:主键约束(primary key):特点:每个表要有一个主键,数据唯一,且不能为null;添加的方式:
1:create table 表名(字段1 数据类型 primary key,字段2 数据类型);
2:create table 表名 (字段1 数据类型,字段2 数据类型, primary key(要设置主键的字段名);第二种方法可以延申成联合主键,联合主键是多个主键的字段相同时才违反联合主键的约束:create table 表名(字段1 数据类型 ,字段2 数据类型 ,primary key (主键1,主键2);
3:创建表–>再去修改表,添加主键:alter table 表名 add constraint primary key (主键1,主键2);
二:唯一约束(unique):特点是指定的列的数据不能重复,可以为空。格式:create table 表名 (字段1 数据类型 ,字段2 数据类型 unique);
三:自动增长列(auto increment):指定的列数据自动增长。格式:create table 表名 (字段1 数据类型 primary key auto_increment,字段2 数据类型 unique);自动增长列即使数据删除,还是从删除的序号继续往下增加。
2:域完整性:限制单元格的数据正确。
域完整性约束:1:数据类型:数值类型,日期类型,字符串类型
2:非空约束(not null):create table 表名 (字典1 数据类型 primary key auto_increment,字段2 数据类型 unique not null);
3:默认值约束(default):create table 表名 (字段1 数据类型 default 这里写你默认的值);
3:参照完整性:利用外键建立两张表的关联
格式一:create table 表名 (列名1 数据类型 ,列名2 数据类型,constraint 外键名 foreing key (本张表的列名) references 要关联的表名(关联表的列名));
格式二:alter table 表名 add constraint 约束名 foreing key (本张表的列名) references 关联的表名 (关联表的列名);