linux (mysql安装) :sudo apt-get install mysql-server mysql-client
mysql 修改密码: mysqladmin -u root -p password 123456
mysql重要知识:增删该查,事务,索引,存储过程
root 用户是最高权限
常见的字符集:GB2312,GBK
事务:要么完全执行,要么完全不执行
事务语句 : 1.开启:begin; 2.提交:commit; 3.回滚:rollback;
原子性:在一个事物的所有操作中 要么全部执行,要么全部不执行,
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏,
隔离性:防止多个事务并发执行时由于交叉执行而导致数据的不一致
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
索引:
SQL:结构化查询语言
sql功能分类
DDL: 数据定义语言 用来定义数据库对象:创建库、表、列等
DML: 数据操作语言 用来操作数据表中的记录
DQL: 数据查询语言 用来查询数据
DCL: 数据控制语言 用来定义访问权限和安全级别
MySQL支持多种类型
数值类型:int 整数,double 浮点数
字符串类型:char , varchar , text 文本
日期和时间类型:date 年月日 yyyy-MM-dd ,time 时分秒 hh:mm:ss ,datetime 年月日 时分秒 yyyy-MM-dd hh:mm:ss
DDL 数据定义语言
给表添加一列:alter table 表名 add 列名 数据类型; alter table students add age int;
删除一列:alter table students drop age;
修改表的数据类型:alter table students modify id bigint;
修改表名:alter table 原始表名 TO 新表名; alter table students to teacher;
查看表的创建细节:show create table students;
修改表的字符集gbk:alter table students charset=gbk
修改表的列名:alter table students change name newname varchar(20);
修改teacher表的存储引擎更改为MyISAM类型 : alter table teacher engine = MyISAM
DML 数据操作语言 (对表中的数据进行增、删、改操作)
增,插入数据 insert into (注意:我们插入的数据顺序必须要跟列对应)
1.完全插入:例如:insert into 表名 values( 108401,' 小甜甜 ', 20,1,' 1245678999 ');
2.选择插入:例如:insert into 表名(userid,name,age) values( 10000,' 花花 ',19);
3.多行插入:例如:insert into 表名(userid,name) values(19999,' 葡萄 '),(18888,‘ 辣椒 ’);
将一个表复制到另一个表中 insert into 新表 (列名,列名...) select 列名,列名... from 原表 ;
更新 update
更新一条数据:update 表名 set 列名1=列值1, 列名2=列值2... where 列名=值;例如:update students set name='倪好' where id=1;
把倪好的年龄在原来基础上+1岁:例如:update students set age=age+1 where id = 7;
把年龄这个字段更新为18岁:update students set age=18;
把姓名为花花的学生分数修改为90:update students set score=90 where name='花花';
删除 delete
删除一条数据:delete from 表名 where 列名=值;例如:delete from students where id=3;
删除所有(尽量不要用):delete from 表名;例如:delete from students;
删除truncate:例如:truncate 表名;例如:truncate students;
DQL 数据查询语言 用来查询数据
查询 select
聚合函数
count() | count(1) :计算所有行; select count() from students where age>11;
avg() :计算列的平均值; select avg(age) from students;
max() :计算列的最大值; select max(age) from students;
min() :计算列的最小值; select min(age) from students;
sum() :求和 ,计算列的总和; select sum(age) from students;
模糊查询:关键字 like 通配符 _ :任意一个字母,通配符 % :任意0~n个字母
select * from students where name like '_花'; select * from students where name like '花%';
去重: 关键字distinct select distinct name from students;
分组查询:group by 根据名字分组 select name from students group by name;
使用group_concat(字段名) 来放置每一组的某字段的值的集合
根据性别分组,查询哪个名字为男性,哪个姓名为女性:select gender,group_concat(name) from students group by gender
查询每个部门的部门名称以及每个部门工资大于1500的人数
select job,group_concat(salary),count(*) from emp where salary > 1500 group by job;
去重和分组的区别:去重是把相同的数据去除掉,分组是把相同的数据划成一组
group by + having having作用和where一样,但是having只能用于 group by where 在分组之前使用,having在分组之后使用,ha cving 可以使用聚合函数,where 不可以使用
使用having 查询工资总和大于9000的部门名称:select job,group_concat(salary),sum(salary) from emp group by job having sum(salary)>5000;
使用where 查询工资大于9000的部门名称:select job,group_concat(salary),sum(salary) from emp where salary>9000 group by job;
书写顺序
select --> from --> where --> group by --> having --> order by --> limit
合并结果集union与union_all : 合并结果集就是把两个SELECT语句的查询结果合并到一起展示
注意事项:被合并的两个结果集:列数,列类型必须相同
union 合并时去除重复记录:select * from 表1 union select * from 表2;
union all 合并时不去除重复记录:select * from 表1 union all select * from 表2;
笛卡尔集
什么是笛卡尔集:同时查询两个表(使用一个SQL语句),出现的结果就是笛卡尔集结果
例如:select * from students,score;mjkysql 知识复习 。
解决笛卡尔集现象:查询时主键和外键保持一致,
99写法:select * from students st,score sc where st.id=sc.sid;
内连接写法:select * from students st inner join score sc on st.id=sc.sid;
查询成绩大于70并且性别为女的学生的所有信息:select * from students st inner join score sc on st.id=sc.sid where sc.score>70 and st.gender='女';
内连接:( 关键字 inner join)
select * from students st inner join score sc on st.id=sc.sid;
左链接:( 关键字 left join )左表中数据的全部显示出来,右表中只显示符合条件的数据
select * from students st left join score sc on st.id=sc.sid;
右链接:( 关键字 right join )右表中的数据全部显示出来,左表中只显示符合条件的数据
select * from score sc right join students st on st.id=sc.sid;
多表查询:
99写法:select * from students st,score sc,course co where st.id=sc.sid and co.id=sc.cid;
内连接:select * from students st inner join score sc on st.id=sc.sid inner join course co on co.id=sc.cid;
子查询:
什么是子查询?
一个select语句中包含另外一个完整的select语句或者说两个以上select,那么就是子查询语句了
子查询出现的位置~
where后,把select查询出的结果当做另外一个select的条件值
from后,把查询出的结果当作一个新表 然后另起一个新名字 例如:as cc
where 后面:查询与项羽同一个部门人员工
select ename from emp where deptno = (select deptno from emp where ename='项羽');
from 后面:查询30号以内大于2000的薪水的人(放在from,是把这个语句当成一个表)
select ename from (select ename,deptno,salary from emp where deptno=30) as cc where
cc.salary>2000;
1.排序 order by asc 升序 desc 降序
select * from emp order by age; 按照年龄排序(默认为升序)
select * from emp order by age asc; 按照年龄排序升序
select * from emp order by age desc; 按照年龄排序降序
2.条件查询 and
select * from emp where name='花花' and age=11; 查询emp表中 名字为花花并且年龄为11的所有信息(两个条件同时满足)
3.条件查询 or
select * from emp where name='花花' or age=11; 查询emp表中 名字为花花或者年龄为11的所有信息(满足其中一个条件即可)
4.集合方式查询 in (in 相当于or)
select * from emp age in (11,21); 查询emp 表中年龄为11或者21 的所有信息
5.区间查询 between ... and ...
select * from emp where age between 11 and 21; 查询emp表中年龄在11至21之间的所有信息 (还可以用 >= <=)
相当于
select * from emp where age >= 11 and age <= 21; 查询emp表中年龄大于等于11并且年龄小鱼等于21的所有信息