一些查詢實例:
ubuntu 下mysql導入出.sql文件
//having在組內比較,將會挑選組內物理位置排在前面的score 與 1比較
select * form student group by id having score>1;
查詢有 3 門以上課程是 90 分以上的學生的學號及(90 分以上的)課程數
SELECT Sno, COUNT(*)
FROM SC
WHERE Grade>=90
GROUP BY Sno
HAVING COUNT(*)>=3 //
student表的別名s1 和 s2,查找student中cname='a1'比cname='b1'大的id,顯示兩個表。
select * from student s1 join student s2 where s1.id=s2.id and s1.cname='a1';
改進:顯示一行
select s1.id ,s1.name from student s1 join student s2 where s1.id=s2.id and s1.cname='a1';
查找符合條件的每組成員超過2 的組,注意count(*),計算的是組內的記錄數
select id,count(*)from student group by id having count(*)>2;
按學生科目總成績排名
select id,SUM(score)from student group by id order by SUM(score)desc;
獲取倒數排列前10名的LogID
select top 10 LogID from API_LOG ORDER BY LogID DESC
左連接兩個表合併查詢一個值,返回記錄
select
m.id,m.username,
d.userType,d.vehPlate m.last_login_time
from usr m left join user_detail d
on m.id=d.id where m.username='123456'
比較強大的實例鏈接
http://blog.csdn.net/muxiaoshan/article/details/7617533
經典:有三個字段可以接查詢條件,以速度由快到慢依次爲 on where having
on用於連接表,where用於約束查詢條件,having在查詢結果中篩選需要的信息
作爲left jion 不管右邊表是不是有對應的記錄,一定顯示左邊的記錄。
要求你將 連接表的條件 m.id=d.id放在on的後面,
如果放在where後面left和right將會失效
idName 中含有 “羅” 字的所有記錄
select * from table where table.idName LIKE '%羅%'
複製表:
select * into 目標表名 from 源表名
將表中的數據插入另一個表
insert into 目標表名(fld1, fld2) select fld1, 5 from 源表名
mysql與sqlserver的區別
取4-6條記錄
sqlserver:select top 3 * from users where userID not in(select top 3 userID from users)
mysql:select * from users limit 3,3
重複記錄
查:
select name from tablename group by name having count(1)>1 //如果相同name的值相同的有兩個大於1 ,則 name 打印出來 ,由於group by的顯示所以只能打印name
應用
//having 來篩選groupby的每個單元,查找選2門或者3課的學生名字(將study和student表聯合起來查)
select studentName
from student t left join study y on t.studentId = y.studentId
group by studentName
HAVING count(1)>1 and count(1)<4
//用 in 消除group by 必須包含select中所有選項的限制(當然語法上不能,呵呵)
select * from student where studentId
in
(select studentId from study group by studentId having count(1)=3 )
select * from tablename where name in (select name from tablename group by name having count(1)>1) //打印出包括name 的完整記錄,不過數據大的時候很慢
select * from tablename a where ( (select count(*)tablename where Title = a.Title) > 1 ) ORDER BY Title DESC // 取表名中,title 相同的記錄
select time,max(total) as total,name from timeand group by time //用time分組,time相同的時候取 total最大的記錄
select station_name,count(distinct station_name) from tb_spider_station group by station_name;//顯示所有記錄,重複的只顯示一條。但是不呢個select*
select row_number()over(order by StationName) as id,* from tb_station //sqlserver 在select中增加自增id,用於區分完全相同的記錄
row_number()over(order by OccTime)as id 做爲一個字段,成爲自增的ID
查出所有重複的記錄
SELECT * FROM tb_spider_station_copy a
WHERE ((SELECT COUNT(*)
FROM tb_spider_station_copy
WHERE station_name = a.station_name and station_stake = a.station_stake) > 1)
ORDER BY a.standard_road_id DESC
過濾
Select * From t Tablename Where ID In (Select Max(ID) From Tablename Group By Title) // 相同title 取id最大的
刪:
改:
新增加自增列 id
alter table tb_spider_station drop column id
alter table tb_spider_station add id int identity(1,1) //自增從 1 開始 每次自增 1
ubuntu14
安裝mysql
sudo apt-get install mysql-server mysql-client啓動關閉mysql服務:sudo service mysql start/stop/restart
登陸
mysql -uroot -p123456(沒有木馬不用加-p和它後面的)
登陸後變爲:
mysql> //命令寫完後,就用“;”結尾,然後回車。直接回車會出現下面的標示
mysql-> //一條命令沒有寫完,可以繼續寫
導入和到出sql
ubuntu 下mysql導入出.sql文件
1.導出整個數據庫
mysqldump -u 用戶名 -p 數據庫名 > 導出的文件名
mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql
2.導出一個表
mysqldump -u 用戶名 -p 數據庫名 表名> 導出的文件名
mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql
3.導出一個數據庫結構
mysqldump -u wcnc -p -d –add-drop-table smgp_apps_wcnc >d:\wcnc_db.sql
-d 沒有數據 –add-drop-table 在每個create語句之前增加一個drop table
4.導入數據庫
常用source 命令
進入mysql數據庫控制檯,
如mysql -u root -p
mysql>use 數據庫
然後使用source命令,後面參數爲腳本文件(如這裏用到的.sql)
mysql>source /home/pt/test.sql
或直接導入命令爲: mysql -h localhost -u root -p temp
#Ubuntu
導入和到出sql(centos出現中文無法顯示)
mysql 導入windows下的sql文件,數據庫中文亂碼。
1
設置mysql中文支持
找到mysql配置文件
find / -name *.cnf
cp /顯示的目錄/my-large.cnf /etc/my.cnf
vim /etc/my.cnf
在[clent] 和 [server]下都加一句
default-character-set=utf8
保存文件,重啓mysql ,手動插入中文數據,查看中文數據顯示正常
或者
查看mysql當前的編碼格式
show variables like '%set%'
show variables like '%col%'
2
導入文件後依然中文亂碼
原因:sql文件的編碼形式是gbk ,而不管數據庫是utf8的還是GBK的,導入文件必須是utf8編碼的。
貌似因爲系統環境是 utf8中文編碼的。
解決方案: vim 打開sql文件,將文件編碼變成utf8的
:set fileencoding=utf8
保存,查看當前編碼
:set fileencoding
注意: “:set fileencoding”會顯示當前未保存的文件編碼格式。最好查看後再保存
然後登錄mysql
source test.sql
中文正常
注:mysql用utf8顯示數據會邊框什麼的,會比較正常
mysql用戶增加和密碼
mysql鏈接遠程主機
mysql -h主機地址 -u用戶名 -p用戶密碼
mysql修改用戶密碼
方法一:
mysqladmin -u用戶名 -p舊密碼 password 新密碼
mysqladmin的密碼沒有設置的話爲空
方法二:先關掉mysql 。net stop mysql
>use mysql
>update user set Password=password('新密碼') where User='root';
>flush privileges;
增加刪除用戶:用戶名test1 ,密碼 abc
grant select,insert,update,delete on *.* to test1@”%” Identified by “abc”; //對所有數據庫有權限,同時可以在網絡訪問,危險啊
grant select,insert,update,delete on mydb.* to test2@localhost identified by “abc”; //只對數據庫mydb可用,且只能在localhosr本機可用
grant select,insert,update,delete on mydb.* to test2@localhost identified by “”; //密碼設置爲空
DDL 定義:create drop alter//針對抽象的字段,表,數據庫
DML 操作:insert delete update select//針對具體的數據
DCL 控制:grant revoke//創建用戶,限制用戶權限。
DDL
show databases;//顯示所有數據庫
create/drop database test1 //數據庫刪除,其下的表也會完全刪除
use test1 //選擇數據庫test1
//創建表:姓名,僱用日期,工資,
create table emp(enname varchar(10), hiredata date,sal decimal(10,2),deptno int(2));
show tables //顯示所有表
desc emp //查看錶定義:
show create table emp;//詳細查看錶定義:
drop database/table test //刪除數據庫/表
alter table emp modify ename varchar(20);//將表emp的ename屬性改爲 varchar(20)
alter table emp change ename ename2 varchar(10);//將表emp的ename屬性改爲 varchar(10),同時將字段(屬性)改名
alter table emp add age int(2)after [某屬性];//將表emp的增加屬性age,沒有after默認位最後
alter table emp drop age ;//將表emp的屬性age刪除
alert table emp rename emp2//將表名改爲emp2
DML
曾
insert into emp (ename,hiredate,sal,deptno) values('rt','2014-12-31','2000',1);
insert into emp values('123 567_91-3456789123','2014-22-58','9999.12345',1);//非法的日期將會默認爲全 0;
insert into emp (ename,sal)values('deptno',1);//只插入ename 和sal 的值,其餘位NULL
刪
delete from emp where ename='rt'
delete emp //清空表中的數據
查:可以接where
select * from emp;
select ename sal from emp;
select distinct ename from emp;//去重顯示
select * from emp order by hiredate desc,sal asc;//按hiredate降序顯示,hiredate相同的按工資升序排列。第一級的排序默認升序
select * from emp order by sal limit 1,3;//按sal排列,從第二條記錄起,顯示前三個,limit在其他數據庫不一定能用
聚合
where和having的區別是:前者是聚合前過濾,後者是對結果過濾,所以儘可能用where
select deptno ,count(1) from emp group by deptno having count(1)>1;//顯示 deptno內總人數大於一的 deptno
select sum(sal),max(sal),min(sal) from emp;
表連接:內(找相同)、外(找不同)
select ename, deptname from emp ,dept where emp.deptno = dept.deptno;//找出每個人的deptname,默認只顯示而這完全匹配的數據
select ename, deptname from emp left join dept on emp.deptno = dept.deptno;//找出每個人的deptname,左連接,強制顯示emp中元素,即使沒有找到匹配
子查詢:
select * from emp where deptno in (select deptno from dept);
select emp.* from emp ,dept where emp.deptno=dept.deptno;//子查詢轉化爲,錶鏈接。
select * from emp ,dept where emp.deptno=dept.deptno;//子查詢轉化爲,錶鏈接,顯示兩個表所有內容
記錄聯合:union(去重) ,union all
將記錄了相同數據的不同表,數據彙總在一起顯示
select deptno from emp union all select deptno from dept;//共打印12條記錄,emp9條,dept3條
改
update emp set hiredate='2012-12-12' where ename='rt';//2012-12-12是字符串所以要加'',數字不需要加''
update emp a ,dept b seta.sql=a.sql*b.deptno , b.deptname=a.ename where a.deptno=b.deptname;//同時更新表emp 和 表 dept
連接:
left join :顯示左表所有數據和右表匹配的數據
right join :、、、
inner join :只返回左右邊匹配的數據 和 where的功能相同但是where是隱式的連接而inner jion 是顯示連接。結果相同,where接連接條件,inner join接連接條件
full join :匹配和不匹配的數據都會返回
一般要使得數據庫查詢語句性能好點遵循一下原則:
1在做表與表的連接查詢時,大表在前,小表在
2 不使用表別名,通過字段前綴區分不同表中的字段
3查詢條件中的限制條件要寫在表連接條件前
4 儘量使用索引的字段做爲查詢條件
inner join 連接三個表:
SELECT * FROM (表1 INNER JOIN 表2 ON 表1.字段號=表2.字段號) INNER JOIN 表3 ON 表1.字段號=表3.字段號
或者不加()也行,多個小連接列名相同的時候,mysql會一次給列名編號
select * from table0 t0
inner join table1 t1 on t1.id = t0.id
inner join table2 t2 on t2.name = t0.name
inner join table3 t3 on t3.other = t0.other
where t1.id=123 nad t2.name = '狗' and t3.other = 'xxx'
eclipse 與 mysql的連接,用java讀寫數據庫
package cn;
import java.sql.*;
//import java.io.*;
public class my
{
public static void main(String args[])
{
try
{
Class.forName("com.mysql.jdbc.Driver"); //加載MYSQL JDBC驅動程序
System.out.println("Success loading Mysql Driver!");
} catch (Exception e)
{
System.out.print("Error loading Mysql Driver!");
e.printStackTrace();
}
try
{
Connection connect = DriverManager.getConnection( "jdbc:mysql://localhost:3306/test","root","");
System.out.println("Success connect Mysql server!");
//返回
Statement stmt = connect.createStatement();
ResultSet rs = stmt.executeQuery("select * from emp");//emp爲表的名稱
while (rs.next())
{
System.out.println(rs.getString("ename"));//ename是表t_auth的一個字段
}
//插入
String sql="insert into emp (ename,hiredate,sal,deptno) VALUES (?,?,?,?) ";//共四列,四個字段
PreparedStatement Statement=connect.prepareStatement(sql);
//插入數據:1ename, 2hiredate, 3sal, 4 deptno
Statement.setString(1,"c");//匹配char
Statement.setString(2,"2014-04-13");//匹配date類型
Statement.setDouble(3,12345.678);//匹配 decimal
Statement.setInt(4,7);
System.out.println("222");
Statement.executeUpdate(); //
System.out.println("333");
} catch (Exception e)
{
System.out.print("get data error!"); e.printStackTrace();
}
}
}
Windows:
安裝最新版的mysql5.7 完整版:
名字:mysql-installer-community-5.7.3.0-m13.2063434697.msi
大小:237 MB
安裝過程:服務名設置爲 mysql,我的用戶名和密碼都設置爲 root
完全安裝後:直接可以在 cmd中 用net start\stop mysql 來啓動關閉
配置外網鏈接
1 防火牆:打開3306端口(win7 防火牆--高級--入站規則--新建-----------)
2在mysql配置中: networking -- bind-address 這個值默認是*,我設置爲0.0.0.0 //重啓mysql
3 //爲root設置權限可以外網使用,第一個root是用戶,第二個root是密碼
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
//使授權生效
mysql>flush privileges;
4 第三步結束後,立竿見影,馬上能 從任何主機 以root訪問數據庫的所有數據庫
客戶端遠程使用mysql,可以用navicat for mysql 很不錯的工具,支持各種數據庫,適合需要連接各種不同的數據庫的人
其他:
授權:用戶從ip 192.168.1.3 用戶名爲myuser 密碼 mypasswd 連接mysql的數據庫 dk
GRANT ALL PRIVILEGES ON dk.* TO 'myuser'@'192.168.1.3' IDENTIFIED BY 'mypassword'
WITH GRANT OPTION;
FLUSH PRIVILEGES;
允許連接所有數據庫就將 dk改爲 * ,允許任何ip就將 ip改爲 %
網上的其他配置方法中,很多已經過時,如下已經在mysql5.7完整版 中 配置好了,使用了以後會提示沒有任何功能或者記錄受到影響。
以下操作都是不需要的,但是可以用來理解mysql的機制
比如:mysql 5.7 默認root 的 host 是%,即可以從任何IP登陸
- % 允許從任何ip登錄
- X.X.X.X 允許從指定的ip訪問
- mysql>use mysql;
- mysql>update user set host = '%' where user ='root';
- mysql>select host, user from user; //可以看到host設置情況
- mysql>flush privileges;
mysql:
相比沒有where的delete情況,它掃描了每條記錄,速度要慢很多
刪除表users 名爲nike的記錄的前 6 條:
delete FROM users WHERE name = 'nike' ORDER BY id DESC LIMIT 6;