1.安装mysql以及sqlyog
sqlyog激活码
姓名(Name):cr173
序列号(Code):8d8120df-a5c3-4989-8f47-5afc79c56e7c
姓名(Name):cr173
序列号(Code):59adfdfe-bcb0-4762-8267-d7fccf16beda
姓名(Name):cr173
序列号(Code):ec38d297-0543-4679-b098-4baadf91f983
查询
- 字段查询
select xxx,yyy,zzz from TableName;
- 列的别名,查询xxx并赋予别名XXX,as可写可不写,并且可以通过“XXX”包起来,实现带空格的别名 只能在order by中使用
select xxx (as) XXX from TableName;
- 去重查询
select distnct xxx from TableName;
当表、字段名与关键字相同时,通过着重号(table键上面那个键)区分
- 查询表中字段详细信息
DESCRIBE student;
- 过滤 (where)在from后添加范围
SELECT * FROM student WHERE id = 3;
运算符
- 字符型变量参与运算,能转为数字的转为数字运算,不能转的按0计算,若纯粹字符串比较按ask码比较。
- null参与任何运算结果为null
- “=” “<=>”:后者可以比较null
关键字
-
is null :为空
-
is not null :非空
-
least(a ,b,c)选出最小值
SELECT LEAST(5,3,8,9,1) FROM DUAL;
- greatest()选出最大值
SELECT GREATEST(5,3,5,48,1)FROM DUAL;
- between A and B : A必须大于B :查询到的是整个区间
SELECT * FROM student WHERE id BETWEEN 2 AND 5;
- in 查询到的是具体的点
SELECT * FROM student WHERE id IN(1,3);
- Like 模糊查询 %:占位符 :不确定个数的字符 _ :一个字符 \: 转义字符
SELECT * FROM student WHERE
name
LIKE ‘杨%’;
SELECT * FROM student WHEREname
LIKE ‘杨_’;
排序
- order by +字段:对查询到的数据排序(默认升序),DESC:标记降序,order by 方在where后面 ---------from + where + order by
SELECT * FROM student ORDER BY id; (从低到高)
SELECT * FROM student ORDER BY id DESC; (从高到低)
- 二级排序:一级排序后,再按二级排序,比如 相同id ,再按name顺序排
SELECT * FROM student ORDER BY id DESC ,
name
;
分页
查询返回记录太多,查看不便
LIMIT a, b:(a 起始索引,b : 条数)
若将逗号换为: offset ,则a , b 换位(8.0)
返回第一页
SELECT * FROM student LIMIT 0,3;
返回第二页
SELECT * FROM student LIMIT 3,3;
多表查询
需要有连接条件
使用class1与class2将两个表关联起来
建议在多表查询中,在每个字段前添加表名
SELECT name,ads FROM student ,school WHERE student.class2= school.class1;
- 等值连接 :在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结
果中列出被连接表中的所有列,包括其中的重复列
SELECT name,ads FROM student ,school WHERE student.class2 school.class1;
- 非等值连接:不等连接: 在连接条件使用除等于运算符 以外 的其它比较运算符比较被连接的
列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>
SELECT
salary
,grade_level
FROMemployees
e,job_grades
j WHEREsalary
>=lowest_sal
&&salary
<=highest_sal
&&grade_level
=‘A’;
- 自连接:自己连接自己
SELECT e2.last_name,e2.salary FROM employees e1, employees e2 WHERE
e1.last_name = ‘abel’ AND e2.salary
>e1.salary
;
- 非自连接:不同表之间连接
- 内连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。
select* from表1 inner join 表2 on 条件
2. 外连接(含有 所有 字眼的查询):连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。
比如出现 所有学生的姓名,所有班级,均以需要所有字眼的字段所在表为左连接的左边,即无论右表对应字段如何,左边表所有字段都存在
包括 : 左外连接、右外连接和全外连接。
- 左外连接:左边表数据行全部保留,右边表保留符合连接条件的行
select* from表1 left join 表2 on 条件- 右外连接:右边表数据行全部保留,左边表保留符合连接条件的行。
select* from表1 right join 表2 on 条件- 全外连接:左外连接 union 右外连接。
mysql不支持全外连接 需要通过unionall实现
union /union all
union:两表并集,去重(不建议使用)
union all :两表并集,不去重(能用优先用)
首先实现
在左外连接的基础上,取出B中连接属性为null的值即为下图
手动实现全外连接
函数
单行函数
数值函数
基本函数
- abs():绝对值
- sign:正1 负0
- celll :向上取整
- floor:向下取整
- rand(a):随机数,相同的a得到相同的随机数
- round:四舍五入
- truncate(a,2):舍去小数点两位后面的所有
- power(2,4):2的四次方
- bin(a):十转二
- hex:十转十六
- oct :十转八
- conv:( x, 2, 8 ):将x从2进制转为8进制
字符串函数
- Asc(”acv’):第一个字符的asc码值 = 97
- char_length:字符个数
- length:底层存储所占字节数
- concat:连接
- concat_ws(‘符号’,a,b,c,d,e,):将后面的以符号连接
- insert(String,起始索引,长度,替换元素):替换
- relpace(String,a,b):b换为a
- upper:转大写
- lower:转小写
- left (String,2):从左往右取2个
- right(String,2):从右往左取2个
- trim:首尾空格 --ltrim 左取空格–rtrim 去右空格
- reapt(String , 3)S复制三遍
- strcmp(s1,s2)比较asc码 1 ,0 ,-1
- reverse(String):反转
- nullif(s1,s2):相等返回null,不等返回前者
日期和时间函数
date可以用
‘2021-01-01 21:05:01’这种格式填写
- curdate():年月日
- curtime():时分秒
- now()年月日时分秒
- unix转换
- unix_timestamp(); 当前时间转为unix时间戳形式
- from_unixtime():unix时间戳------普通时间格式
日期的操作函数 - extract(‘type’ from ‘date’);
SELECT EXTRACT(DAY FROM NOW());
时间和秒的转换
time_to_sec(‘date’); 时间—秒
sec_to_time(‘datae’)秒—时间
SELECT SEC_TO_TIME(TIME_TO_SEC(NOW()));
**计算时间和日期的函数 **
- date_add(t1,interval , num type):给t1加上type对应的num;
- datediff(d1,d2) : = d1-d2
- timediff(t1,t2) : = t1-t2
- last_day(d) : = d所在月的最后一天
- period_add(time , n): =time +n
日期的格式化和解析
- date_format(date,type):将date转为type对应的格式
- time_format(time,type)
- get_format(date_type,format_type): 获取type,可以作为1的参数试用
流程控制函数
- if(表达式,a,b): t表达式=rue 返回a flase 返回b
- case …when’判断条件‘ then “执行什么” else …end “别名” :
加密
password(str):加密
md5(str):加密MD5码
聚合函数
常用聚合函数
- avg(num):均值、、过滤空值
- sum(num):求和//过滤空值
- max(num or str):最大
- min(num or str):最小
- count(): 指定字段在查询结果中的个数 ------不包含null
总数:
1. count(*)
2. count(1)
group by 分组
group by :from、where 、后,order by limit前。
通过id分组
SELECT id FROM student GROUP BY id;
通过id分,再通过name分
SELECT id ,NAME FROM student GROUP BY id,
name
;
结论 : select 后的字段 ,必须出现在group by后面。
having(使用group by 才能用),where效率高于havng
- 当过滤条件中出现了组函数(聚合函数),此时where必须用having 替换
- having 必须在group by 的后面
- 当不存在group by时,没必要用having
- where效率高于havng
子查询
内查询(子查询)的结果被外查询使用,且先于外查询
单行子查询
子查询的结果唯一
多行子查询
子查询结果多个
连接字符
- in 等于列表中任意一个
- any:于子查询中任一结果比 ,若小于任一则理解为:小于最大的都算
- all:于子查询中所有进行比较 若取最小的理解为 小于等于all
相关子查询
子查询用到了外查询的表
除了group by 和limit中都可以写子查询