In the opening scene, a young boy named Chi is on a boat with his mother and her boyfriend. He falls overboard and almost drowns because he cannot swim. However he ends up on a beach, and claims that he was rescued by a "big fish".
Years later, Chi (Ekin Cheng) has grown up but still has a fear a water due to the accident. He has become a teacher, and obtains a new job at a local high school. Students are drawn to him because of his youth and good looks. Despite his attempts to be professional, he is aggressively flirted with by Kiki (Teresa Mak), a popular girl who has the nickname "Princess". This makes Kenji (Takeshi Kaneshiro), Kiki's on-again-off-again boyfriend, jealous.
One day Chi brings his class on a field trip to the docks. During an altercation he is pushed into the water, sinks and loses consciousness. He is rescued by an orange-tailed mermaid (Christy Chung), who takes him to shore. She is the same mermaid that rescued him when they were young, and due to this second meeting believes they were destined to meet. She releases a magic pearl from her stomach, which she uses to revive a still unconscious Chi. She is interrupted when people approach and flees in a panic. Chi accidentally swallows the pearl and wakes up, thinking that he was merely swept to shore by the water. The mermaid attempts to swim home, but discovers that she can't without her pearl. She decides to find Chi, knowing that she can pass as human with legs as long as she doesn't get wet.
The mermaid tracks Chi down to his school, and there she is mistaken for a worker's niece, named Siu-may. She is befriended by Kiki and attends the school as a student. Although Siu-may can walk on legs, she must bathe every so often to "recharge". One of these sessions takes place in the girls' bathroom, and her large tail is accidentally seen by Miss Yuen (Kingdom Yuen), a teacher, who faints in shock. Siu-may's secret is also discovered by Kenji, who promises to help keep her hidden, and the two becomes friends. After this encounter, Miss Yuen becomes obsessed with finding and catching this "big fish", enlisting the school's principal (Kent Cheng) and other friends to her cause.
Siu-may and Chi spend time together and become close. Chi discovers he can swim now, which is due to the pearl in his stomach; he and Siu-may swim together in the school pool, with Chi agreeing to be blindfolded when Siu-may claims she doesn't have a bathing suit. Siu-may decides that the best way to get her pearl back is to kiss him. After a dinner date together eating clams, Siu-may gets the chance, but she is so caught up with her new feelings for Chi that she forgets to summon the pearl. On Chi's birthday, he confesses that he has feelings for her, and Siu-may protests that he can't, because she is a "fish". Siu-may stands under the rain and allows herself to transform into her mermaid shape. Chi falls down in shock, and at that moment Miss Yuen and her colleagues run in and capture Siu-may, carrying her away.
Chi, Kenji and Kiki work together to rescue Siu-may where she is being imprisoned in the principal's swimming pool. They are successful, and they return to the docks the next morning. Siu-may has her pearl now and can return home. Chi and Siu-may declare their love for each other, and Chi adds that he'll wait for her. Siu-may jumps into the sea, transforms and swims away.
Afterward, Miss Yuen, the principal and the rest of their group follow Chi around in the hopes of finding Siu-may again. One day Chi bumps into a bridesmaid at a wedding, who looks identical to Siu-may. The principal takes a hose from a nearby gardener and starts spraying the new girl, but she doesn't transform into a mermaid, much to their confusion. The grown-ups are then chased off by Kenji and Kiki. The new girl doesn't appear to remember Chi, but when he invites her to eat clams she gets excited and lets slip that she is, indeed, Siu-may. The pair embrace while Kenji and Kiki watch.Ekin Cheng as Chi, a young teacher at a high school, he was saved from drowning twice by a mermaid, and eventually falls in love with her.
Christy Chung as Siu-may, a mermaid who can gets legs when on dry land, she falls in love with Chi.
Takeshi Kaneshiro as Kenji, a high school student who befriends Siu-may.
Teresa Mak as Princess/Kiki, a high school student who befriends Siu-may.
Kent Cheng as Principal, the principal of the high school.
Kingdom Yuen as Miss Yuen, a teacher at the high school.
Lau Siu-ming as Uncle Lau, a janitor/general worker at the high school who mistakes the mermaid for his real niece, Siu-may.
Dennis Chan as Officer Chan, a friend of Miss Yuen and the Principal whom works together with them to capture the mermaid.
Elaine Law Suet-ling as Fatty, Kiki's best friend.
Rocelia Fung Wai-hang as Chi's mother.
Faye Wong performed two songs for the film:"Angel" – the main theme, played during Chi and Siu-may's swimming pool scene and during the end credits;
"Sky" – played while Chi walks sadly on the shore after Siu-may leaves.
These songs are released in Faye Wong's 1994 album Sky.