char(n)会在字符串后追加空格,补齐位数;而varchar(n)则不会追加空格。且char(n)类型比较时,如果位数不同,会在短值后附加额外的空格使其长度一致。
select、from、where,首先是from,获得所列出关系的笛卡尔积,然后是where用谓词过滤元组,最后是select挑选出合适的列。将第一步和第二步同时进行便是实际执行过程中的SQL优化。
在SQL标准中,相等运算是大小写敏感的,但在mysql和sql server中实际上并不区分大小写。
SQL中的trim()可以去除全角和半角空格。
select * from table where description like "%wxl_" select * from table where desp like "ab\%cd%" escape '\' %: 匹配任意子串 _: 匹配任意字符 escape
SQL不存在显式的转义字符,需要使用escape关键字定义。
表名.* 可以选中特定表的所有属性。
DESC:降序排序,ASC:升序排序(默认)
并(union),交(intersect),差(except),并交差运算后加上all,可以保留重复项,默认删除所有重复元组。
table.A+5,如果table.A为null,则该表达式的值也为null;涉及空值的任何比较运算的结果视为unknown。因此sql中的布尔逻辑值有三种,true、false和unknown。unknown和任何逻辑值的逻辑运算都为unknown。
分组聚集中,如果出现混淆的属性,比如一个系的学生成绩平均值,却需要提供ID属性,那么就会引发错误查询。
select stu_id, dept, avg(score) from table group by dept;
where是元组的谓词,而having是分组的谓词。where不能使用聚集函数,而having可以结合聚集函数一起使用,但前提是必须提前进行分组。执行顺序:from->where->group by->having->select。
聚集函数除了count(*)之外,会自动忽略掉值为null的元组。
嵌套子查询中:
- in和exists测试集合成员资格;
- 比较符则可以额外附加some来比较其中的某一成员;
- unique只取出子查询结果中不重复的元组;
- from关键词后也可以进行子查询;
- with嵌套sql可以像存储变量一样存储表关系,示例如下
select * from table1 where id in (select id from table2 where dept = "xxx") select name from table where salary > some(select * from xxx where xxx) # 找出系平均工资总额大于所有人平均工资总额的系 select dept from (select dept, avg(salary) as avg from table group by dept) where avg > (select avg(salary) from table) with dept_avg(dept, value) as (select dept, avg(salary) as avg from table group by dept), total_dept_avg(value) as (select avg(salary) from table) select dept from dept_avg, total_dept_avg where dept_avg.value > total_dept_avg.value;
insert在插入时,如果不需要修改插入的顺序,可以不写values的部分。
增删改的子查询测试出来的关系不会变化,因为子查询执行完后,就不会再执行了,想想子查询的执行过程。增删改对于关系的变化不会应用在子查询中。
case关键字同步更新,解决工资加薪问题,实例如下。
update teacher set salary = case when salary < 10000 then salary * 1.05 when salary between 10000 and 13000 then salary * 1.03 else salary * 1.01 end标签:salary,45,dept,84,table,数据库系统,avg,where,select From: https://www.cnblogs.com/LimeCoder/p/17144033.html