鍟嗗姟BD姹傝亴鎷涜仒浜ゆ祦QQ缇? http://liangssw.com/bozhu/13795.html
SQL99语法
#sq语法/*语法:select查询列表from表1别名join表2别名on连接条件分类:内连接:inner外连接左外:left[outer]右外:right[outer]全外:full[outer]交叉连接:cross*/#一)内连接/*语法:select查询列表from表1别名innerjoin表2别名on连接条件;分类:等值非等值自连接特点:1.添加排序,分组,筛选2.inner可以省略3.筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读4.innerjoin和92中等值连接一样*/#1,等值连接#案例一:查询员工名,部门名(调换位置)SELECTlast_name,department_nameFROMemployeeseINNERJOINdepartmentsdONe.`department_id`=d.`department_id`;#案例二:查询名字中包含e的员工名和工种名(筛选)SELECTlast_name,job_titleFROMemployeeseINNERJOINjobsjONe.`job_id`=j.`job_id`WHERElast_nameLIKE%e%;#案例三:查询部门个数3的城市名和部门个数,(分组+筛选)SELECTcity,COUNT(*)部门个数FROMdepartmentsdINNERJOINlocationslONd.`location_id`=l.`location_id`GROUPBYcityHAVINGCOUNT(*)3;#案例四:查询哪个部门的部门员工个数3的部门名和员工个数,并按个数降序(排序)SELECTdepartment_name,COUNT(*)FROMdepartmentsdINNERJOINemployeeseONd.`department_id`=e.`department_id`GROUPBYd.`department_id`HAVINGCOUNT(*)3ORDERBYCOUNT(*)DESC;#案例五:查询员工名,部门名,工种名,并按部门名排序SELECTlast_name,department_name,job_titleFROMemployeeseINNERJOINdepartmentsdONe.`department_id`=d.`department_id`INNERJOINjobsjONe.`job_id`=j.`job_id`ORDERBYd.`department_name`DESC;#二)非等值连接#查询员工工资级别SELECTsalary,grade_levelFROMemployeeseJOINjob_gradesgONe.`salary`BETWEENg.`lowest_sal`ANDg.`highest_sal`;#查询每个工资级别20的个数,并且按照工资级别降序SELECTCOUNT(*),grade_levelFROMemployeeseJOINjob_gradesgONe.`salary`BETWEENg.`lowest_sal`ANDg.`highest_sal`GROUPBYgrade_levelHAVINGCOUNT(*)20ORDERBYgrade_levelDESC;#三)自链接#查询员工名字,上级名字SELECTe.last_name员工名字,m.last_name上级名字FROMemployeeseJOINemployeesmONe.`manager_id`=m.`employee_id`;#查询员工名字包含字符‘k的,上级名字SELECTe.last_name员工名字,m.last_name上级名字FROMemployeeseJOINemployeesmONe.`manager_id`=m.`employee_id`WHEREe.`last_name`LIKE%k%;#二,外连接/*特点:1.外连接的查询结果为主表中的所有记录如果从表中有和它匹配的,则显示匹配的值如果从表中没有和它匹配的,则显示null外连接查询结果=内连接结果+主表中有而从表中没有的记录2.左外连接,leftjoin左边的是主表右外连接,rightjoin右边的是主表3.左外和右外交换两个表的顺序,可以实现同样的效果4.全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的*/#引入:查询男朋友不在男生表的女神名#罗志祥向您发出多人运动邀请SELECT*FROMbeauty;SELECT*FROMboys;SELECTb.name,bo.*FROMbeautybLEFTOUTERJOINboysboONb.`boyfriend_id`=bo.`id`WHEREbo.`id`ISNULL;#案例1:查询哪个部门没有员工SELECTd.*,e.employee_idFROMdepartmentsdLEFTOUTERJOINemployeeseONd.department_id=e.department_idWHEREe.department_idISNULL;#全外连接#报错的,本版本不支持USEgirlsSELECTb.*,bo.*FROMbeautybFULLOUTERJOINboysboONb.boyfrined_id=bo.id;#交叉连接#俩表进行笛卡尔乘积,左表和右表相乘连接起来SELECTb.*,bo.*FROMbeautybCROSSJOINboysbo;#一,查询女神编号3的女神的男朋友信息,如果有则列出详细,如果没有,用null填充SELECTb.name,b.id,bo.*FROMbeautybLEFTOUTERJOINboysboONb.`boyfriend_id`=b.`id`WHEREb.`id`3;#二,查询哪个城市没有部门SELECTcity,d.*FROMdepartmentsdRIGHTOUTERJOINlocationslONd.`location_id`=l.`location_id`WHEREd.`department_id`ISNULL;#三,查询部门名为SAL或IT的员工信息SELECTe.*,department_nameFROMdepartmentsdLEFTOUTERJOINemployeeseONe.`department_id`=d.`department_id`WHEREd.`department_name`IN(SAL,IT);
子查询
#进阶七:子查询/*含义:出现在其他语句中的select语句,称为子查询或内查询外部的查询语句,称为主查寻或外查询分类:按子查询出现的位置select后面仅仅支持标量子查询from后面支持表子查询where或having后面★标量子查询(单行)列子查询(多行)行子查询exists后面(相关子查询)表子查询按结果集的行列数不同:标量子查询(结果集只有一行一列)列子查询(结果集只有一列多行)行子查询(结果集有一行多列)表子查询(结果集一般为多行多列)*/#一,where或having后面#1,标量子查询(单行子查询)#2,列子查询(多行子查询)#3,行子查询(多行多列)/*1.子查询放在小括号内2.子查询一般放在条件的右侧3.标量子查询,一般搭配着单行操作符使用===列子查询,一般搭配着多行操作符使用in,any/some,all4.子查询的执行优先于主查询的执行,主查寻的条件用到了子查询的结果*/#1.标量子查询#案例一:谁的工资比Abel高SELECT*FROMemployeesWHEREsalary(SELECTsalaryFROMemployeesWHERElast_name=Abel);#案例二:返回job_id与号员工相同,salary比号员工多的员工姓名,job_id和工资#查job_idSELECTjob_idFROMemployeesWHEREemployee_id=;#查salarySELECTsalaryFROMemployeesWHEREemployee_id=;#SELECTfirst_name,last_name,job_id,salaryFROMemployeesWHEREsalary(SELECTsalaryFROMemployeesWHEREemployee_id=)ANDjob_id=(SELECTjob_idFROMemployeesWHEREemployee_id=);#案例三:返回公司工资最少的员工的last_name,job_id和salary#查询员工最低工资SELECTMIN(salary)FROMemployees;#SELECTlast_name,job_id,salaryFROMemployeesWHEREsalary=(SELECTMIN(salary)FROMemployees);#案例四:查询最低工资大于50号部门的最低工资的部门id和其最低工资SELECTMIN(salary)FROMemployeesWHEREdepartment_id=50;SELECTMIN(salary),department_idFROMemployeesGROUPBYdepartment_idHAVINGMIN(salary)(SELECTMIN(salary)FROMemployeesWHEREdepartment_id=50);#非法使用标量子查询SELECTMIN(salary),department_idFROMemployeesGROUPBYdepartment_idHAVINGMIN(salary)(SELECTMIN(salary)FROMemployeesWHEREdepartment_id=50);#标量子查询的结果不是一行一列#2.列子查询(多行子查询)#案例一:返回location_id是或的部门中的所有员工姓名SELECTdepartment_idFROMdepartmentsWHERElocation_idIN(,);#SELECTlast_nameFROMemployeesWHEREdepartment_idIN(SELECTdepartment_idFROMdepartmentsWHERElocation_idIN(,));#案例二:返回其它工种中比job_id为“IT_PROG"部门任一工资低的员工的工号,姓名,job_id以及salary#先去重SELECTDISTINCTsalaryFROMemployeesWHEREjob_id=IT_PROG;SELECTjob_id,last_name,employee_id,salaryFROMemployeesWHEREsalaryANY(SELECTDISTINCTsalaryFROMemployeesWHEREjob_id=IT_PROG)ANDjob_idIT_PROG;#3.行子查询(结果集一行多列或多行多列)#案例:查询员工编号最小并且工资最高的员工信息#1.查询最小的员工编号SELECTMIN(employee_id)FROMemployees;SELECTMAX(salary)FROMemployees;SELECT*FROMemployeesWHEREsalary=(SELECTMAX(salary)FROMemployees)ANDemployee_id=(SELECTMIN(employee_id)FROMemployees);#行子查询SELECT*FROMemployeesWHERE(employee_id,salary)=(SELECTMIN(employee_id),MAX(salary)FROMemployees);#二,放在select后面的查询#仅仅支持标量子查询#案例:查询每个部门的员工个数SELECTd.*,(SELECTCOUNT(*)FROMemployeeseWHEREe.department_id=d.department_id)个数FROMdepartmentsd;#案例二:查询员工号=的部门名SELECT(SELECTdepartment_nameFROMdepartmentsdINNERJOINemployeeseONd.department_id=e.department_idWHEREe.employee_id=)部门名;#三,from后面#案例:查询每个部门的平均工资的工资等级#查询每个部门的平均工资SELECTAVG(salary),department_idFROMemployeesGROUPBYdepartment_id;SELECT*FROMjob_grades;#连接1的结果集和job_grades表,筛选条件平均工资betweenlowest_salandhighest_salSELECTag_dep.*,g.`grade_level`FROM(SELECTAVG(salary)ag,department_idFROMemployeesGROUPBYdepartment_id)ag_depINNERJOINjob_gradesgONag_dep.agBETWEENlowest_salANDhighest_sal;
创建表和库
#DDL/*数据定义语言库和表的管理一,库的管理创建,修改,删除二,表的管理创建,修改,删除创建:create修改:alter删除:drop*/#一,库的管理#1,库的创建/*语法:createdatabase(ifnotexists)库名;*/#案例:创建库BOOKS#注意库是否存在createdatabaseifnotexistsbooks;#2,库的修改#renamedatabasebooksto新库名;#因为这句话不够安全所以不可以用了#因此没有一个单独的语句#可以更改库的字符集alterdatabasebookscharactersetgbk;#3,库的删除dropdatabaseifexistsbooks;#二,表的管理#1.表的创建/*代表可选createtable表名(列名列的类型,列名列的类型,列名列的类型,列名列的类型,...列名列的类型)*/#案例:创建book表#VARCHAR(20)代表最长字符createtablebook(idint,#编号bnamevarchar(20),#图书名pricedouble,#价格authorvarchar(20),#作者authoridint,#作者编号publishDatedatetime#出版日期);descbook;#案例:创建authorcreatetableauthor(idint,au_namevarchar(20),nationvarchar(10));descauthor;#2,表的修改/*altertable表名add
drop
modify
changecolumn*/#1,修改列名(column可以省略)altertablebookchangecolumnpublishdatepubDatedatetime;descbook;#查询后发现已经改正过#2,修改列的类型或约束altertablebookmodifycolumnpubDatetimestamp;descbook;#3,添加新列altertableauthorADDcolumnannualdouble;DESCauthor;#4,删除列altertableauthordropcolumnannual;descauthor;#5,修改表名altertableauthorrenametobook_author;descauthor;descbook_author;#3.表的删除droptableifexistsbook_author;showtables;#通用的写法:dropdatabaseifexists旧库名;createdatabase新库名;droptableifexists旧表名;createtable表名();#4.表的复制CREATETABLEauthor(idINT,au_nameVARCHAR(20),nationVARCHAR(10));insertintoauthorvalues(1,村上春树,日本),(2,莫言,中国),(3,冯唐,中国),(4,金庸,中国);select*fromauthor;#1.仅仅复制表的结构createtablecopylikeauthor;SELECT*FROMcopy;#2.复制表的结构+数据createtablecopy2select*fromauthor;#3.只复制部分数据createtablecopy3selectid,au_namefromauthorwherenation=中国;#仅仅复制某些字段createtablecopy4selectid,au_namefromauthorwhere0;#0代表false所以不成立select*fromcopy4;#案例一:创建表dept1/*namenulltypeidint(7)namevarchar(25)*/createtabledept1(idint(7),d_namevarchar(25));#2.将表departments中的数据插入新表dept2中CREATETABLEdept2selectdeptartment_id,department_namefrommyemployees.departments;#跨库复制表结构#3.创建表emp5namenull?typeidint(7)First_namevarchar(25)last_namevarchar(25)Dept_idint(7)createtableemp5(idint(7),first_namevarchar(25),last_namevarchar(25),dept_idint(7))#4.将列last_name的长度增加到50altertableemp5modifycolumnlast_namevarchar(50);#5.根据表employees创建employees2createtableemployees2likemyemployees.employees;#6.删除表emp5droptableifexistsemp5;#7.将表employees2重命名emp5altertableemployees2renameemp5;#8,在表dept和emp5中添加新列test_column,并检查所作的操作altertableemp5addtest_columnint;#删除dept_id列在emp5中altertableemp5dropcolumntest_column;预览时标签不可点收录于话题#个上一篇下一篇