MYSQL基础
1.1关系型数据库 oracle mysql sql server SQLite
1.2非关系型数据库 redis Mongodb Hbase
1.3 SQL语句操作数据库的语句
1.不区分大小写
MySQL特点:1.可移植性好
2.支持多操作系统
3.支持多种编写语言
4.开源免费
5.支持多种数据库连接
6.支持多线程
7.支持多种编码格式
8.优化sql的查询算法
连接mysql
常用数据类型:int varchar decimal datatime
2.1操作数据库
查看所有的数据库 show databases;
使用数据库: use 数据库名;
查看当前使用的数据库: select database();
创建数据库:create database 数据库名 charset=utf-8;
删除数据库:drop database 数据库名;
2.2操作表
查看所有表 show tables;
查看表结构 desc 表名;
建表语句:show create table 表名;
删除表: drop table students;
判断是否存表,存在就删除:drop table if exists 存在表名;
创建表:create table students(
id int unsigned primary key auto_increament,
字段 id 无符号 设置主键为自动增加
name varchar(20),
字段name 数据类型varchar 长度=《20
height decimal(10,2)
可以取10位,小数为两位
);
插入表两种方式:
1.insert into 表名 values(字段1,字段2,字段3);如果字段1为字符串,需要加’ '或者“ ”
2.insert into表名(字段1,字段2)value(对应值1,对应值2);
插入多条数据
insert into 表名 values(字段1,字段2,字段3),
(字段1,字段2,字段3),
(字段1,字段2,字段3),
(字段1,字段2,字段3);
修改表
update 表名 set 字段1=值1,字段值2=值2 where 条件
updata students set name=“张三”,age=“20” where id=5;
删除数据
delete from 表名 where 字段=“ ”
truncate table 表名 删除表中数据并保留表结构
drop table 表名 删除表 包括结构
查询
select 字段 from 表名;
1.去重 distinct
select distinct 字段 from 表
2.起别名
给表起别名select 字段1,字段2 from 表名 as 别名;
select 字段1 as 别名,字段2 as别名 from 表名 ;
3.条件查询
比较运算符 = , < ,> ,!= ,<=, >= .
!= 等价于 where not= “ ”
逻辑运算符 and or
4.模糊查询
%:匹配多个字符
_ :匹配任意一个字符
select 字段1,字段2 from 表名 where 字段1 like ‘x%’
like可以和and连用
select *from students where name like "百里%";
查询姓名为两个字符的人
SELECT * from students WHERE name LIKE "__";
查询姓名为两个字且年龄小于20岁的
SELECT * from students WHERE name LIKE "__"and age<=20;
between… and … 表示连续的范围
查询年龄在18-20岁之间的学生
select * from students WHERE age between 18 and 20;
in 表示非连续的顺序 查询 家乡在 广州 上海或 北京的女生; where in () and… (记得双引号)
SELECT *from students WHERE hometown in("北京","广东","上海") and sex="女";
is null 空判断 ,
SELECT * FROM students WHERE card is null;
is not null 非空判断
SELECT * FROM students WHERE card is not null;
SELECT * FROM students WHERE not card is null; 效果同上
5.排列查询 默认升序
降序desc 大到小 查询学生信息 按年龄从大到小排
SELECT * FROM students ORDER BY age DESC
查询学生信息 按年龄从大到小排 当年龄相同时,从大到小排列
SELECT * FROM students ORDER BY age DESC,studentNo DESC;
升序 asc 小到大
SELECT * FROM students ORDER BY age asc
SELECT * FROM students ORDER BY age
聚合函数 where 中不可以用聚合函数。
count() 查询总记录数
SELECT COUNT(name) from students where sex="女"and age<=18;
max() 查询最大值
SELECT max(age) FROM students WHERE sex="女";
min() 查询最小值
SELECT min(age) FROM students WHERE sex="女";
sum() 求和
SELECT sum(age) FROM students WHERE sex="女";
avg() 求平均数
SELECT avg(age) FROM students WHERE sex="女";
分组查询 group by
select 字段1,字段2,聚合函数… from 表名 group by 字段1,字段2;
将学生信息按性别分组,找出最大值,统计平均值,并且统计各组个数。
SELECT sex,max(age),count(*),avg(age) FROM students GROUP BY sex;
先按班级分组,后按性别分组,之后统计男女个数,最大年龄,以及平均年龄。
SELECT class,sex,count(*),max(age),avg(age)from students GROUP BY class,sex;
group不能和where连用,having的作用=where;
SELECT class,sex from students GROUP BY class,sex HAVING sex="女";
分页查询 select * from students limit(n-1)*m,m
n:第几页的数据
m:每页显示三条数据
select 字段 from 表名 limit 0,5 从索引1开始查询5个数据,每页显示五条数据
select * fom students limit 0,5;
select * fom students limit 5; 默认为0
select 字段 from 表名 limit 10,5 从索引10开始查询5个数据,每页显示五条数据
select * fom students limit 10,5;
连接(左右内连接查询)
内连接
格式1
select * from 表1
inner join 表2 on 表1.列=表2.列
格式2
select * from 表1,表2 where 表1.列=表2.列
三表联查
SELECT stu.name sn,cs.name cn,sc.score ss FROM students stu INNER JOIN scores sc on stu.studentNo= sc.studentno
INNER JOIN courses cs on sc.courseNo=cs.courseNo
WHERE stu.sex = "男"
ORDER BY sc.score DESC
LIMIT 0,3;
左连接
SELECT * FROM students stu LEFT JOIN scores sc on stu.studentNo= sc.studentNo
left JOIN courses co on co.courseNo= sc.courseNo;
右连接
SELECT * FROM students stu right JOIN scores sc on stu.studentNo= sc.studentNo
right JOIN courses co on co.courseNo= sc.courseNo;
自关联(看成n张表)
SELECT *from areas a1 INNER JOIN areas a2 on a1.aid=a2.pid
INNER JOIN areas a3 on a2.aid=a3.pid;
子查询
标量查询 =
SELECT *FROM scores where studentno=(SELECT studentno FROM students WHERE name="王昭君");
列子查询 in
SELECT score from scores WHERE studentno in (SELeCT studentno FROM students WHERE age="18");
行子查询()=
SELECT *from students WHERE(class,age)=(SELECT class,age FROM students WHERE name="王昭君");
子查询充当数据源
SELECT co.name,sc.score from scores as sc INNER JOIN(
SELECT *from courses where name in ('数据库','系统测试'))
as co on co.courseNo=sc.courseNo;
in 和 =any 等价(子查询)
not in和 !=all等价 (子查询)
子查询充当条件
SELECT * from scores where studentno
in(SELECT studentNo from students where age
BETWEEN 18 and 20);
子查询充当数据源
SELECT * from scores as sc INNER JOIN (SELECT studentNo
from students where age BETWEEN 18 and 20 ) as st
on st.studentNo=sc.studentno;
主键和外键
主键是本张表的主键,是唯一且非空的,而外键是另一张表中与这张表的某个字段的类型,字段名相同的字段,一般是用作关联两张或两张以上的数据表时用的。
询充当条件
SELECT * from scores where studentno
in(SELECT studentNo from students where age
BETWEEN 18 and 20);
子查询充当数据源
SELECT * from scores as sc INNER JOIN (SELECT studentNo
from students where age BETWEEN 18 and 20 ) as st
on st.studentNo=sc.studentno;