数据库及MYSQL基础(2)
数据库及MySQL基础(1)
SQL进阶及查询练习
1,单表的查询练习
SELECT * FROM emp WHERE deptno=30;
SELECT ename,empno,deptno FROM emp WHERE job='销售员';
SELECT * FROM emp WHERE comm>sal;
SELECT * FROM emp WHERE comm>sal*0.6;
SELECT * FROM emp WHERE (deptno=10 AND job='经理') OR (deptno=20 AND job='经理');
SELECT * FROM emp WHERE (deptno=10 AND job='经理') OR (deptno=20 AND job='经理') OR (job NOT IN('经理' , '销售员') AND sal>=20000);
SELECT * FROM emp WHERE comm IS NULL OR comm<1000;
SELECT * FROM emp WHERE ename LIKE '___';//模糊查询
SELECT * FROM emp WHERE hiredate LIKE '2000-%';//类似正则表达式
SELECT * FROM emp ORDER BY empno;
SELECT * FROM emp ORDER BY sal DESC,hiredate ASC;
SELECT deptno,AVG(sal) FROM emp GROUP BY deptno;
SELECT deptno,COUNT(*) FROM emp GROUP BY deptno;
SELECT job,MAX(sal),MIN(sal),COUNT(*) FROM GROUP BY job;
2,mysql编码问题
SHOW VARIABLES LIKE 'char%';
character_set_client=utf8;无论客户端发送的是什么编码的数据,mysql都当成是utf8的数据
>若服务器发送的是GBK,服务器会当成utf8对待,总结:必然会乱码
处理问题的手段有两种:
①让客户端发送utf8的数据(行不通)
②把character_set_client修改为gbk,set character_set_client=gbk;只在当前窗口有效!
character_set_results=utf8把数据用什么编码发给客户端
①让服务器发送gbk的数据:set character_set_results=gbk;
②让小黑屏使用utf8来解读(行不通)
my.ini【windows】my.cnf【linux】
在总配置文件中进行配置,一劳永逸
#[mysqld]标记非常重要
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
# 一般配置选项
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
socket = /var/run/mysqld/mysqld.sock
character-set-server=utf8
[mysql]
no-auto-rehash
default-character-set=utf8
safe-updates
socket = /var/run/mysqld/mysqld.sock
3,mysql备份与恢复数据
数据库-->sql语句--------->sql语句-->数据库。
①数据库导出SQL脚本(备份数据库内容)
>mysqldump -uroot -p密码 数据库名>生成的sql脚本的路径
>例如:mysqldump -uroot -p123 mydb1>C:\mydb1.sql (与mysql.exe和mysqld.exe一样,都在bin目录之下)
>注意,不要打分号,不要登录mysql,直接在cmd下运行
>注意,生成的脚本文件中不包含CREATE DATABASE语句【只复制内容不复制数据库】
②【1】执行SQL脚本
>先删除数据库,再重新创建CREATE DATABSE mydb1;退出
>cmd下执行mysql -uroot -p密码 数据库<脚本文件路径
>例如:mysqldump -uroot -p123 mydb1<C:\mydb1.sql;
②【2】
>先登录mysql,删除DROP DATABSE mydb1;后重新创建数据库
>切换到要复制的数据库
>SOURCE SQL脚本路径;
4,约束之主键约束
主键特点:非空、唯一、被引用(学习外键时)
①设置数据表主键
| CREATE TABLE stu( sid CHAR(6) PRIMARY KEY, sname VARCHAR(20), age INT, gender VARCHAR(10), ); | 
| CREATE TABLE stu( sid CHAR(6), sname VARCHAR(20), age INT, gender VARCHAR(10), PRIMARY KEY(sid) ); | 
| ALTER TABLE emp{ ADD-->添加列 MODIFY-->修改列名和列类型 CHANGE-->修改列名 DROP-->删除列 RENAME TO-->修改表名; | 
②修改数据表主键
| ALTER TABLE emp DROP PRIMARY KEY; ALTER TABLE emp ADD PRIMARY KEY(ename); | 
5,主键自增长
由于主键的三大特点【非空、唯一、引用】,所以我们通常会指定主键类为整型,然后设置其自动增长,这样可以保证在插入数据的时候主键列的唯一和非空性。
| CREATE TABLE stu( sid INT PRIMARY KEY AUTO_INCREMENT, sname VARCHAR(20), age INT, gender VARCHAR(10) );//修改主键自增长 | 
| INSERT INTO stu VALUES(1,'万雨',26,'男'); INSERT INTO stu VALUES(NULL,'冯冯',26,'女'); | 
备注:不建议使用有意义的号码来当主键,应该单独使用一个独立的自然数来当主键;并且主键自增长在群集系统中由于网络延迟的问题,导致使用同一个主键会出现问题;建议使用UUID来当主键。
6,非空和唯一约束
| CREATE TABLE stu( sid INT PRIMARY KEY AUTO_INCREMENT, sname VARCHAR(20) NOT NULL,//重复可以只是NULL不行 age INT, gender VARCHAR(10) ); | 
| CREATE TABLE stu( sid INT PRIMARY KEY AUTO_INCREMENT, sname VARCHAR(20) NOT NULL UNIQUE,//①非空②唯一,但是不等同于主键【差引用】 age INT, gender VARCHAR(10) ); | 
7,概述模型、对象模型、关系模型
对象模型:可以双向关联,而且引用的是对象,而不是一个主键!
关系模型:只能多方引用一方,而且引用的只能是主键,而不是一整行记录。
在Java中domain!例如:User、Student就等同于数据库中的数据表
Java中的类的关系【①is a继承(1对1、1对多、多对多;少是主,多是从主从),②has a成员的形式,③use a方法对象】
| class Employee{//多方关联一方 ... private Department department; } class Department{//一方关联多方 ... private List<Employee> employees; } class Husband{//一方对应一方 ... private Wife wife; } class Wife{//一方对应一方 ... private Husband husband; } class Student{//多对多 ... private List<Teacher> teachers; } class Teacher{//多对多 ... private List<Student> students; } | 
8,外键约束
外键必须是①另一个表的主键的值(外键要引用主键!);②可以重复;③可以为空;
| 用户、主体帖、回复帖 1,作者:用户 2,主贴:主题 | 
外键约束初始化
| CREATE TABLE emp( empno INT PRIMARY KEY AUTO_INCREMENT, ename VARCHAR(50), dno INT, CONSTRAINT fk_emp_dept FOREIGN KEY(dno) REFERENCES dept(deptno)//外键 ); | 
设置修改【添加】外键约束
| ALTER TABLE emp ADD CONTRIAINT fk_emp_dept FOREIGN KEY(dno) dept(deptno); | 
从表的主键即是外键。
9,一对一关系
10,多对多关系
多对多需要关联表【中间表】
| CREATE TABLE stu_tea( sid INT, tid INT, CONSTRAINT fk_student FOREIGN KEY(sid) REFERENCES student(sid), CONSTRAINT fk_teacher FOREIGN KEY(tid) REFERENCES teacher(tid) ); | 
| INSERT INTO stu_tea VALUES(1,1); INSERT INTO stu_tea VALUES(2,1); INSERT INTO stu_tea VALUES(3,1); INSERT INTO stu_tea VALUES(4,1); INSERT INTO stu_tea VALUES(5,1); INSERT INTO stu_tea VALUES(2,2); INSERT INTO stu_tea VALUES(3,2); INSERT INTO stu_tea VALUES(4,2); INSERT INTO stu_tea VALUES(3,3); INSERT INTO stu_tea VALUES(4,3); INSERT INTO stu_tea VALUES(5,3); | 
11,合并结果集
多表查询:①合并结果集;②连接查询;③子查询。
| CREATE TABLE ab(a INT,b VARCHAR(50)); INSERT INTO ab VALUES(1,'1'); INSERT INTO ab VALUES(2,'2'); INSERT INTO ab VALUES(3,'3'); CREATE TABLE cd(c INT,d VARCHAR(50)); INSERT INTO cd VALUES(1,'1'); INSERT INTO cd VALUES(2,'2'); INSERT INTO cd VALUES(3,'3'); SELECT * FROM ab UNION SELECT * FROM cd;//无视重复行列全部显示 SELECT * FROM ab UNION ALL SELECT * FROM cd;//将重复行列只显示单次 | 
12,连接查询之内连接【方言】
分类:①内连接;②外连接【左、右、全(mysql不支持)】
方言【只是MYSQL有效】
| SELECT * FROM husband,wife; | 
| +-----+--------+-----+------------------+ | hid | hname | wid | wname | +-----+--------+-----+------------------+ | 1 | 刘备 | 1 | Arya Stark | | 2 | 关羽 | 1 | Arya Stark | | 3 | 张飞 | 1 | Arya Stark | | 1 | 刘备 | 2 | Sansa Stark | | 2 | 关羽 | 2 | Sansa Stark | | 3 | 张飞 | 2 | Sansa Stark | | 1 | 刘备 | 3 | Cersei Lannister | | 2 | 关羽 | 3 | Cersei Lannister | | 3 | 张飞 | 3 | Cersei Lannister | +-----+--------+-----+------------------+ | 
笛卡尔积{a,b,c}{1,2}={a1,a2,b1,b2,c1,c2}
| mysql> SELECT husband.hname [AS '丈夫姓名' ],wife.wname [AS '妻子名字'] -> FROM husband,wife -> WHERE husband.hid=wid; | 
| +--------+------------------+ | hname | wname | +--------+------------------+ | 刘备 | Arya Stark | | 关羽 | Sansa Stark | | 张飞 | Cersei Lannister | +--------+------------------+ | 
标准语句:
| mysql> SELECT h.hname [AS '丈夫姓名' ],w.wname [AS '妻子名字'] -> FROM husband h INNER JOIN wife w -> ON h.hid=w.wid; | 
自然语句:
| mysql> SELECT h.hname [AS '丈夫姓名' ],w.wname [AS '妻子名字'] -> FROM husband h NATUAL JOIN wife w | 
13,连接查询之外连接【标签与自然】
/*外连接有一主一次,左外即左表为主,右表为次;左表中所有记录无论满足与否全部都打印,不满足的使用默认值补位。*/
①左外
| SELECT h.hname AS '丈夫姓名' ,w.wname AS '妻子名字' FROM husband h LEFT OUTER JOIN wife w ON h.hid=w.wid; | 
②右外
| SELECT h.hname AS '丈夫姓名' ,w.wname AS '妻子名字' FROM husband h RIGHT OUTER JOIN wife w ON h.hid=w.wid; | 
③全【mysql直接不支持】
| SELECT h.hname AS '丈夫姓名' ,w.wname AS '妻子名字' FROM husband h FULL OUTER JOIN wife w ON h.hid=w.wid; | 
| SELECT h.hname AS '丈夫姓名' ,w.wname AS '妻子名字' FROM husband h LEFT OUTER JOIN wife w ON h.hid=w.wid; UNION SELECT h.hname AS '丈夫姓名' ,w.wname AS '妻子名字' FROM husband h RIGHT OUTER JOIN wife w ON h.hid=w.wid; | 
14,子查询
/*查询成绩最高学生的详细信息*/
| SELECT * FROM tb_stu WHERE score=(SELECT MAX(score) FROM tb_stu); | 
| +------------+--------------+------+--------+-------+ | number | name | age | gender | score | +------------+--------------+------+--------+-------+ | mufasa_008 | zhoujiankang | 24 | male | 95 | +------------+--------------+------+--------+-------+ | 
SELECT 【可以进行子查询,但是不标准】
FROM 【可以】
WHERE 【可以】
条件:
①单行单列:SELECT * FROM 表1 别名1 WHERE 列1[=、>、<、>=、<=、!=] (SELECT 列 FROM 表2别名2 WHERE 条件)
②多行单列:SELECT * FROM 表1 别名1 WHERE 列1[IN、ALL、ANY] (SELECT 列 FROM 表2别名2 WHERE 条件)
③单行多列:SELECT * FROM 表1 别名1 WHERE 列1 IN (SELECT 列 FROM 表2别名2 WHERE 条件)
④多行多列:SELECT * FROM 表1 别名1,(SELECT ...) 别名2 WHERE 条件;
数据库及MYSQL基础(2)的更多相关文章
- 数据库02 /MySQL基础数据类型、完整性约束、sql_mode模式
		2.MySQL基础数据类型.完整性约束.sql_mode模式 目录 2.MySQL基础数据类型.完整性约束.sql_mode模式 1. MySQL常用数据类型 MySQL常用数据类型预览 1. 1 数 ... 
- python  day10   数据库(mysql基础)
		一.数据库的概念 数据:事物的特征 数据库的本质是:通过套接字进行通信,来读存数据的一种软件,由于每次开发人员写程序都得写数据的套接字,所以诞生了数据库这个软件,减少重复劳动.(sql语句通用) 数据 ... 
- 关系型数据库之MySQL基础总结_part1
		一:数据库的操作语言的种类 MySQL 是我们最常使用的关系型数据库,对于MySQL的操作的语言种类又可以分为:DDL,DML,DCL,DQL DDL:是数据库的定义语言:主要对于数据库信息的一些定义 ... 
- 数据库及MYSQL基础(3)-JDBC
		教学视频链接:https://edu.aliyun.com/course/1694?spm=5176.11400004.0.0.29254768sg2H5P 程序文件链接:https://pan.ba ... 
- 数据库及MySQL基础(1)
		1.数据库概述 关系型数据库:面对关系,Java面向对象. ·常见数据库 Oracle(神喻):甲骨文 DB2:IBM SQL Server:微软 Sybase:赛尔斯 MySQL:甲骨文,最早是开源 ... 
- 前端笔记之服务器&Ajax(中)MySQL基础操作&PHP操作数据库&Ajax
		一.数据库基础 1.1什么是数据库? 什么是数据库? 答:就是一个很大的一个文件,只不过这个文件可以通过一些‘命令’操作数据: 增.删.改.查数据: 数据库等于持久数据和数据操作的一个统称. 数据库是 ... 
- 数据库学习之MySQL基础
		数据库基础 一.数据库简介 数据库:存放数据的仓库 sql及其规范 sql是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能 ... 
- (3.15)mysql基础深入——mysql默认数据库/系统数据库
		(3.15)mysql基础深入——mysql默认数据库 关键词:Mysql默认数据库,mysql系统数据库 系统数据库的组成 一共4个 [1]information_schema(可以理解成字典表) ... 
- mysql数据库优化课程---13、mysql基础操作
		mysql数据库优化课程---13.mysql基础操作 一.总结 一句话总结:mysql复制表,索引,视图 1.mysql如何复制表? like select * 1.复制表结构 create tab ... 
随机推荐
- The implementation of iterators in C# and its consequences (part 1) Raymond Chen
			Likeanonymous methods, iterators in C# are very complex syntactic sugar. You could do it all yoursel ... 
- Windows008 snmp
- markdown中如何设置字体为红色?
			答: 语法如下: <font color='red'> text </font> 
- Android插件化(二):OpenAtlas插件安装过程分析
			Android插件化(二):OpenAtlas插件安装过程分析 转 https://www.300168.com/yidong/show-2788.html 核心提示:在前一篇博客 Andro ... 
- LeetCode_26. Remove Duplicates from Sorted Array
			26. Remove Duplicates from Sorted Array Easy Given a sorted array nums, remove the duplicates in-pla ... 
- (三)表单与servlet的初步结合
			一.form表单基本使用 <form>标签可创建一个表单,属性如下: <form>标签子标签可以有如下: <input> : 用于搜集用户信息. <input ... 
- jQuery BlockUI Plugin Demo 6(Options)
			Options BlockUI's default options look (exactly) like this: // override these in your code to change ... 
- 利用socket编程在ESP32上搭建一个TCP客户端
			通过之前http://www.cnblogs.com/noticeable/p/7636582.html中对socket的编程,已经可以知道如何通过socket编程搭建服务器和客户端了,现在,就在ES ... 
- 微服务发展规划(PS 大概分层未细化到具体系统)
			网关层 标准化认证业务前台 前置HTML 基于VUE的浏览器端渲染等特性,完全可以看成一个独立的层业务中台 a. 各个系统的业务功能,以业务功能为单位拆分出的业务服务. b. 配合业务前台所产生的聚合 ... 
- Mysql统计每年每个月的数据——详细教程
			Mysql统计每年每个月的数据(前端页面统计图实现) 最终想实现的效果图,在这里就不多废话了,直接上效果图,由于测试数据有几个月是为0的,所以数据图看着会有点怪怪. 接下来是数据库的两个表,这里直接给 ... 
